La historia detrás de Micro Tetris pueden leerla en el archivo README. Resulta que las 424 líneas de tetris.c están basadas en las 19 del ganador del concurso de código C ofuscado al mejor juego. De hecho, me permito presentárselas. Pueden copiarlas en un archivo .c y luego compilarlas. Les aseguro que funciona perfectamente.
#38:
#33 Vaya, yo pensaba que el objetivo de un codigo era que un compilador lo tradujese a un conjunto de instrucciones u opcodes del procesador en cuestion para que este efectuase una tarea.
Ademas dejando de lado que es un concurso de codigo OFUSCADO (¿ESQUE NADIE LEE LAS PUTAS NOTICIAS?) pues me da que cumple a la perfeccion con su cometido que es:
1) Jugar al tetris
2) Hacer que sea dificil de interpretar
Bueno... Decir que eso son 19 lineas de código... Si quieren también pueden eliminar los saltos de linea y decir que es una sola. Total para lo que sirven.
No me puse a ordenarlo, pero estoy seguro que si lo tabulas correctamente son 100 lineas o mas, pero entonces dejaría de tener posibilidades de llegar a portada de meneame...
El mérito de hacer un código reducido es que se pueda leer. De lo contrario distribuiríamos todo ya semi compilado para reducir espacio y no existirían ni tabulaciones, ni espacios ni comentarios.
#18 El título de la entradilla dice que son "19 líneas de código" como si se tratase de lo más importante de la noticia, y no es así, de hecho es la parte más irrelevante de la noticia. Que puta manía tiene la gente con el número de líneas de código....
De todas formas, no considero que quitar saltos de linea y tabuladores sea ofuscar codigo. Un código ofuscado es mucho más que eso, de lo contrario se podría "desofuscar" con algún programa automático.
#15 El programa miniTetris está perfectamente tabulado y ordenado. El código de 19? líneas se refiere a uno de los participantes del concurso de c obfuscado, cuyo objetivo es precisamente generar código C lo máximo de ilegible.
Es muy bueno. De hecho hay un concurso llamado "Concurso internacional de codigo C en ofuscado" del cual, si no recuerdo mal, este tetris fue un primer premio. Otro por ejemplo fue un programa que calculaba N! y que el codigo tenia exactamente la forma N!
#9 Pues en Python no se podría hacer algo así al usar como modo para diferenciar sentencias los saltos de línea y la indentación. En C al usar las llaves y punto y coma se puede meter mucho en unas líneas.
Buah... ese tetris es una mierda... Ya en serio, en la página de ioccc hay unas cosas para flipar...
Existe entre las entradas una hoja de cálculo (incluyendo representaciones gráficas), en 20 ó 30 líneas de código... Obviamente lo de las líneas es una gilipollez infinita (deberíamos contar el número de instrucciones...)
tetris.c:1: warning: data definition has no type or storage class
tetris.c:1: warning: cast from pointer to integer of different size
tetris.c:1: error: initializer element is not constant
tetris.c:1: error: (near initialization for ‘v[0]’)
tetris.c: In function ‘u’:
tetris.c:6: warning: incompatible implicit declaration of built-in function ‘printf’
tetris.c: In function ‘main’:
tetris.c:16: warning: incompatible implicit declaration of built-in function ‘printf’
tetris.c:18: warning: incompatible implicit declaration of built-in function ‘fprintf’
tetris.c:19: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
tetris.c:19: note: expected ‘void *’ but argument is of type ‘int’
#c-13" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/1018552/order/13">#13 En RedHat EL5 con gcc 4.1.2 tampoco funciona:
[root@mypc ~]# gcc -o tetris tetris.c
tetris.c:1: aviso: la definición de datos no tiene tipo o clase de almacenamiento
tetris.c:1: error: el elemento inicializador no es constante
tetris.c:1: error: (cerca de la inicialización de ‘v[0]’)
tetris.c: En la función ‘u’:
tetris.c:6: aviso: declaración implícita incompatible de la función interna ‘printf’
tetris.c: En la función ‘main’:
tetris.c:16: aviso: declaración implícita incompatible de la función interna ‘printf’
tetris.c:18: aviso: declaración implícita incompatible de la función interna ‘fprintf’
tetris.c:19: aviso: el paso del argumento 1 de ‘fprintf’ crea un puntero desde un entero sin una conversión
vortex:/tmp# gcc tetrix.c -o tetrix
tetrix.c:1: warning: data definition has no type or storage class
tetrix.c: In function ‘u’:
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘printf’
tetrix.c: In function ‘main’:
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘printf’
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘fprintf’
tetrix.c:1: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
Me siento cazurro: me dirigí predispuesto a la lectura de las lineas de código, y no entendí un carajo. Mi programador interno esta llorando ahora mismo.
Dejando a un lado el innegable mérito técnico del programador... En mi empresa soy responsable de un grupito de desarrolladores, y si uno presenta un código tan infumable ofuscado como este, le colgamos de los webs. El buen código debe ser legible y comprensible por humanos. Los tiempos del ahorro de memoria y la optimización del código ya pasaron. Ahora se trata de facilitar el trabajo a las personas, tanto al usuario como al probesito programador que después tiene que mantener o modificar el programa.
#33 Vaya, yo pensaba que el objetivo de un codigo era que un compilador lo tradujese a un conjunto de instrucciones u opcodes del procesador en cuestion para que este efectuase una tarea.
Ademas dejando de lado que es un concurso de codigo OFUSCADO (¿ESQUE NADIE LEE LAS PUTAS NOTICIAS?) pues me da que cumple a la perfeccion con su cometido que es:
1) Jugar al tetris
2) Hacer que sea dificil de interpretar
#46 Me lo creo. #35 Habría que poner un wiki con las etiquetas para usar, porque he buscado y solo tu usas esa, cuando sería divertido encontrar comentarios como el tuyo de otra gente.
#33 pues si queréis facilitar el trabajo a las personas haced un código de calidad. Que luego los de sistemas tenemos que padecer el resultado de un trabajo chapucero
#33 si dices que ya no hace falta preocuparse del ahorro de memoria y de la optimización de código, sólo espero que tu grupito de programadores no programe en C, porque sino vaya hipoteca que tienen contigo.
No todo en esta vida es hacer páginas y servicios web, hay más cosas donde sí es necesario preocuparse de esas cosas y donde se usa C.
#37 En cualquier lenguaje, incluso el más elegante, puedes ofuscar el código y que siga compilando. Todos te permiten usar variables de un solo carácter y ninguno pone pegas si a un contador le llamas pepe, a otro luis, a la variable que almacena un dato importante le llamas tontoelquelolea o reutilizas la misma variable global en toda la aplicación.
Vamos, que la culpa de escribir código cerdo no es del lenguaje sino del programador.
Comentarios
Lo de 19 lineas... deberían contar "sentencias" (statements). En un linea puedes poner el programa entero.
Aún así sigue estando genial.
Bueno... Decir que eso son 19 lineas de código... Si quieren también pueden eliminar los saltos de linea y decir que es una sola. Total para lo que sirven.
No me puse a ordenarlo, pero estoy seguro que si lo tabulas correctamente son 100 lineas o mas, pero entonces dejaría de tener posibilidades de llegar a portada de meneame...
El mérito de hacer un código reducido es que se pueda leer. De lo contrario distribuiríamos todo ya semi compilado para reducir espacio y no existirían ni tabulaciones, ni espacios ni comentarios.
#15 Concurso Internacional de Codigo -----> OFUSCADO
#18 El título de la entradilla dice que son "19 líneas de código" como si se tratase de lo más importante de la noticia, y no es así, de hecho es la parte más irrelevante de la noticia. Que puta manía tiene la gente con el número de líneas de código....
De todas formas, no considero que quitar saltos de linea y tabuladores sea ofuscar codigo. Un código ofuscado es mucho más que eso, de lo contrario se podría "desofuscar" con algún programa automático.
#20 Pues claro que lo importante de la noticia es que esté hecho en 19 líneas de código. ¿Qué tendría de noticia "Tetris programado en C"?
Por cierto, supongo que en el concurso una línea estará formada por los clásicos 80 caracteres
#24 Que no son 19, que es 1.
#25 Es cierto, es una línea. Pese a todo sigue sin compilarme.
#20 Ahora es cuando miras el codigo, que esta en el articulo, y te das cuenta de que no solo han quitado los saltos de linea, esta bien ofuscado.
#33 goto #18
#15 El programa miniTetris está perfectamente tabulado y ordenado. El código de 19? líneas se refiere a uno de los participantes del concurso de c obfuscado, cuyo objetivo es precisamente generar código C lo máximo de ilegible.
#39 Es codigo ofuscado:
http://es.wikipedia.org/wiki/C%C3%B3digo_ofuscado
Tiene que ser inentendible y nada claro. Ahi esta la gracia del codigo ofuscado.
Eso sí, te deja el buffer de bash hecho un asquito
Es muy bueno. De hecho hay un concurso llamado "Concurso internacional de codigo C en ofuscado" del cual, si no recuerdo mal, este tetris fue un primer premio. Otro por ejemplo fue un programa que calculaba N! y que el codigo tenia exactamente la forma N!
#3 lo del concurso lo dice en la noticia
#4 Pero yo no me refiero a ese, que es solo de juegos, yo me refiero a uno mas general, ya que el calculo de N! no es un juego.
#3 #4 Es que lo dice la entradilla
Perl en si mismo ya viene ofuscado de fábrica
Si queréis un Tetris parecido en control ( y en 23k) pero más cabrón instalaros bastet desde los repos de Linux y BSD .
Vía: http://ubuntulife.wordpress.com/2010/08/04/algo-curioso-%C2%BFque-hay-en-estas-19-lineas-de-codigo/
Programador programadorQueNuncaOfuscaCodigoSiempreDaNombreAVariableSuperLargosPaQueTodoElMundoSepaLoQueEstaHaciendo = ProgramadorJavaFactory.getProgramador();
Y yo que creía que mi código natural era inentendible...
Esperanza Aguirre es capaz de programar el crysis en tres lineas de código y en basic ¡chupaos esa!
#27: #AguirreFacts No lo olvides.
#27 y #28 Nono, Esperanza Aguirre programo MINIX en tres lineas y Tanenbaum se lo robo y ensucio.
Y de las tres lineas, dos eran comentarios en plan "/*Muere Mariano Muere*/"
#AguirreFacts
#9 Si, en Python tambien seria una sola linea:
import tetris
Tendría mas merito si el codigo no estuviera ofuscado, eso si el tetris en 19 lineas (sin ofuscar) nose que haría...
en la página del autor: "1989 IOCCC Best Game"
http://homepages.cwi.nl/~tromp/tetris.html
Novedoso, novedoso, no es que sea.
Si son 19 lineas en C ¿cuantas deben ser en Python? yo diría que una
venga #9, ponte a ello. Que siendo una sola linea seguro que no tardas nada en hacerlo.
Es un desafio!
#9 Pues en Python no se podría hacer algo así al usar como modo para diferenciar sentencias los saltos de línea y la indentación. En C al usar las llaves y punto y coma se puede meter mucho en unas líneas.
en python también puedes tener varias sentencias en una misma línea utilizando ';' de echo puedes terminar las líneas con ';' si quieres...
>>> c=1+2;a=c+3;b=6+7;print a+b+c
22
>>> print 'hola mundete';
hola mundete
es un poco redundante el ';' al final de una línea... creo yo
19 es un número magico
A ver... si quitais los saltos y demás, haceis linea y todo el código desaparece, joer...
Buah... ese tetris es una mierda... Ya en serio, en la página de ioccc hay unas cosas para flipar...
Existe entre las entradas una hoja de cálculo (incluyendo representaciones gráficas), en 20 ó 30 líneas de código... Obviamente lo de las líneas es una gilipollez infinita (deberíamos contar el número de instrucciones...)
Una de las más originales es esta:
http://www.de.ioccc.org/years.html#1990_stig
Os pasteo el código fuente de stig.c:
---- BOF
c
---- EOF
El resto dejo que lo averigüeis vosotros
Con gcc 4.x no compila en Debian:
tetris.c:1: warning: data definition has no type or storage class
tetris.c:1: warning: cast from pointer to integer of different size
tetris.c:1: error: initializer element is not constant
tetris.c:1: error: (near initialization for ‘v[0]’)
tetris.c: In function ‘u’:
tetris.c:6: warning: incompatible implicit declaration of built-in function ‘printf’
tetris.c: In function ‘main’:
tetris.c:16: warning: incompatible implicit declaration of built-in function ‘printf’
tetris.c:18: warning: incompatible implicit declaration of built-in function ‘fprintf’
tetris.c:19: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
tetris.c:19: note: expected ‘void *’ but argument is of type ‘int’
¿Tiene alguien a mano una máquina con gcc 3?
#c-13" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/1018552/order/13">#13 En RedHat EL5 con gcc 4.1.2 tampoco funciona:
[root@mypc ~]# gcc -o tetris tetris.c
tetris.c:1: aviso: la definición de datos no tiene tipo o clase de almacenamiento
tetris.c:1: error: el elemento inicializador no es constante
tetris.c:1: error: (cerca de la inicialización de ‘v[0]’)
tetris.c: En la función ‘u’:
tetris.c:6: aviso: declaración implícita incompatible de la función interna ‘printf’
tetris.c: En la función ‘main’:
tetris.c:16: aviso: declaración implícita incompatible de la función interna ‘printf’
tetris.c:18: aviso: declaración implícita incompatible de la función interna ‘fprintf’
tetris.c:19: aviso: el paso del argumento 1 de ‘fprintf’ crea un puntero desde un entero sin una conversión
#c-13" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/1018552/order/13">#13 y #14
A mi me ha compilado.
(gcc version 4.3.4 (Debian 4.3.4-6))
vortex:/tmp# gcc tetrix.c -o tetrix
tetrix.c:1: warning: data definition has no type or storage class
tetrix.c: In function ‘u’:
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘printf’
tetrix.c: In function ‘main’:
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘printf’
tetrix.c:1: warning: incompatible implicit declaration of built-in function ‘fprintf’
tetrix.c:1: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
#57 ei, que he usado el mismo comando que #19 con resultado diferente. Se ve que la version gcc es significativa.
#13 #14 increible, Linux users que no saben compilar un programa
#13 Creo que le falta una línea al inicio:
include
#21 No, lo que ocurre es que el articulo esta escrito como el puto culo.
ES UNA SOLA LINEA DE CODIGO
Quitad los retornos de carro y con GCC 4.3.4 As Is compila sin problemas.
#13 Es por que, si os fijáis, en el fuente no hay ni un solo include.
#13 GCC 4.4.4 en Fedora 13, compila perfectamente.
Wow 19 Slocs
Me siento cazurro: me dirigí predispuesto a la lectura de las lineas de código, y no entendí un carajo. Mi programador interno esta llorando ahora mismo.
#39 Ya no sé si estás empleando la ironía o no sabes lo que es un concurso de código ofuscado.
#42 Lo segundo.
cuanto progrmador aburrido...
Visto esto hasta ASM parece más clarificador , por otra parte es un odioso y a la vez buen trabajo de ofuscación
Si tuviese huevos, lo escribieria en "white space" o "brainfuck"....
Dejando a un lado el innegable mérito técnico del programador... En mi empresa soy responsable de un grupito de desarrolladores, y si uno presenta un código tan infumable ofuscado como este, le colgamos de los webs. El buen código debe ser legible y comprensible por humanos. Los tiempos del ahorro de memoria y la optimización del código ya pasaron. Ahora se trata de facilitar el trabajo a las personas, tanto al usuario como al probesito programador que después tiene que mantener o modificar el programa.
#33 ¡Gracias por abrirnos los ojos! Todos los demás pensábamos que éramos mejores programadores.
#CaptainObviousStrikesBack
#33 Vaya, yo pensaba que el objetivo de un codigo era que un compilador lo tradujese a un conjunto de instrucciones u opcodes del procesador en cuestion para que este efectuase una tarea.
Ademas dejando de lado que es un concurso de codigo OFUSCADO (¿ESQUE NADIE LEE LAS PUTAS NOTICIAS?) pues me da que cumple a la perfeccion con su cometido que es:
1) Jugar al tetris
2) Hacer que sea dificil de interpretar
Para todo lo demas, lo que dice #35
#37 Si
#38 Pero como? si no se entiende ni es claro ni nada
#46 Me lo creo.
#35 Habría que poner un wiki con las etiquetas para usar, porque he buscado y solo tu usas esa, cuando sería divertido encontrar comentarios como el tuyo de otra gente.
#33 pues si queréis facilitar el trabajo a las personas haced un código de calidad. Que luego los de sistemas tenemos que padecer el resultado de un trabajo chapucero
#33 Vamos, que no has escrito una linea de código en tu vida...
#33 si dices que ya no hace falta preocuparse del ahorro de memoria y de la optimización de código, sólo espero que tu grupito de programadores no programe en C, porque sino vaya hipoteca que tienen contigo.
No todo en esta vida es hacer páginas y servicios web, hay más cosas donde sí es necesario preocuparse de esas cosas y donde se usa C.
Como un lenguaje asi puede ser popular??
long h[4];t()c,d,l,v[]=,w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]=;u(){for(i=11;++i2?V[2]:"jkl pq";i;i--)*n++=i<
25|i%12
#37 En cualquier lenguaje, incluso el más elegante, puedes ofuscar el código y que siga compilando. Todos te permiten usar variables de un solo carácter y ninguno pone pegas si a un contador le llamas pepe, a otro luis, a la variable que almacena un dato importante le llamas tontoelquelolea o reutilizas la misma variable global en toda la aplicación.
Vamos, que la culpa de escribir código cerdo no es del lenguaje sino del programador.
#37 Te traigo código ofuscado en Perl y ya te cagas la pata abajo .
#c-55" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/1018552/order/55">#55 Aquí lo tienes ;D
#!/usr/bin/perl
$_='A=15; B=30; select(stdin); $|=1; select(stdout);$|=1; system
"stty -echo -icanon eol 01"; for C(split(/s/,"010.010.010.010
77.77 022.020.020 330.030.030 440.044.000 055.550.000 666.060.".
"000")) ][D]=G"> D++}J[P]=F; I[P++] =D}%L=split(/ /,"m _".chr(72)." c 2".
chr(74)." a _m");sub a;K=~s/_/L/; printf "%c[K",27}}sub u -1){for F(0..A-1){M=G[F][D];if(R[F][D]!=M) {R[F][D]=M;a("m"."=".
(5+D).";".(F*2+5)); a("a=".(40+M).";" .(30+M));print " "x2">}}a(
"m=0;0 a=37;40")}sub r}for F(0..O-1)}}}sub l}1}sub p}1}sub o}}sub n}r(int(rand
(4)));l&&p}sub cfor(D2=D;D2>=0; D2--)}u;}}a ("m=0;0 a=0;37;40 c");print "nn".4x" "." "x(A-4).
"perltrisn".(" "x4)."--"xA."n".((" "x3)."|"." "x(A*2)."n")xB
.(" "x4). "--"xA."n";n;for(;;) else else }
if(Z eq "k"); if(Z eq "j"); if
(Z eq "l");if(Z eq " ");if(Z eq "q")}g: a("a=0 m=".(B+8).";0
" ); system "stty sane"; '; s/([A-Z])/$$1/g; s/%$/%/g; eval;
#37 Simple, por la gran potencia que tiene a medio nivel, a diferencia de los interpretados como VB