483 meneos
 

Tetris en 19 líneas de código C

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.
etiquetas: tetris, linux, gnu, programación, c
usuarios: 225   anónimos: 258   negativos: 3  
62comentarios mnm karma: 540
  1. #2   Eso sí, te deja el buffer de bash hecho un asquito :-P
    votos: 4    karma: 43
  2. #3   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!
    votos: 4    karma: 43
  3. #4   #3 lo del concurso lo dice en la noticia ¬¬
    votos: 17    karma: 153
  4. #5   Tendría mas merito si el codigo no estuviera ofuscado, eso si el tetris en 19 lineas (sin ofuscar) nose que haría...
    votos: 4    karma: 25
  5. #6   #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.
    votos: 6    karma: 57
  6. #8   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 .
    votos: 3    karma: 31
     *   Ander_ Ander_
  7. #9   Si son 19 lineas en C ¿cuantas deben ser en Python? yo diría que una ;)
    votos: 2    karma: 23
     *   --130208-- --130208--
  8. #10   Lo de 19 lineas... deberían contar "sentencias" (statements). En un linea puedes poner el programa entero.
    Aún así sigue estando genial.
    votos: 6    karma: 47
  9. #11   venga #9, ponte a ello. Que siendo una sola linea seguro que no tardas nada en hacerlo.
    Es un desafio!
    votos: 5    karma: 50
  10. #12   #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.
    votos: 3    karma: 29
  11. #13   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?
    votos: 2    karma: 10
  12. #14   #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
    votos: 2    karma: 7
     *   jsianes jsianes
  13. #15   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.
    votos: 16    karma: 47
     *   pa2500 pa2500
  14. #17   en la página del autor: "1989 IOCCC Best Game"
    homepages.cwi.nl/~tromp/tetris.html

    Novedoso, novedoso, no es que sea.
    votos: 2    karma: 25
  15. #18   #15 Concurso Internacional de Codigo -----> OFUSCADO <------
    votos: 11    karma: 94
     *   --13579-- --13579--
  16. #19   #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
    votos: 1    karma: 14
     *   --13579-- --13579--
  17. #20   #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.
    votos: 1    karma: 15
     *   pa2500 pa2500
  18. #21   #13 Creo que le falta una línea al inicio:
    include <stdio.h>
    votos: 0    karma: 13
  19. #22   #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.
    votos: 8    karma: 69
  20. #23   19 es un número magico
    votos: 1    karma: 14
  21. #24   #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
    votos: 2    karma: 20
     *   undy undy
  22. #25   #24 Que no son 19, que es 1. xD
    </Pedantic mode>
    votos: 1    karma: 12
     *   --13579-- --13579--
  23. #26   #25 Es cierto, es una línea. Pese a todo sigue sin compilarme.
    votos: 0    karma: 7
  24. #27   Esperanza Aguirre es capaz de programar el crysis en tres lineas de código y en basic ¡chupaos esa!
    votos: 3    karma: 28
  25. #29   #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*/"

    xD

    #AguirreFacts

    #9 Si, en Python tambien seria una sola linea:

    import tetris
    votos: 6    karma: 60
     *   --13579-- --13579--
  26. #30   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:
    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 :-)
    votos: 0    karma: 12
     *   --29907-- --29907--
  27. #31   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
    votos: 1    karma: 17
     *   remosu remosu
  28. #32   A ver... si quitais los saltos y demás, haceis linea y todo el código desaparece, joer... xD
    votos: 1    karma: 13
  29. #33   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.
    votos: 6    karma: -19
  30. #34   #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.
    votos: 1    karma: 18
  31. #35   #33 ¡Gracias por abrirnos los ojos! Todos los demás pensábamos que éramos mejores programadores.

    #CaptainObviousStrikesBack
    votos: 10    karma: 98
  32. #36   #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 :-)
    votos: 0    karma: 6
  33. #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

    Para todo lo demas, lo que dice #35 :-)

    </Sheldon>

    #37 Si :-)
    votos: 7    karma: 68
     *   --13579-- --13579--
  34. #40   #39 Es codigo ofuscado:

    es.wikipedia.org/wiki/C%C3%B3digo_ofuscado

    Tiene que ser inentendible y nada claro. Ahi esta la gracia del codigo ofuscado.
    votos: 4    karma: 44
  35. #41   #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.
    votos: 0    karma: 6
  36. #42   #39 Ya no sé si estás empleando la ironía o no sabes lo que es un concurso de código ofuscado.
    votos: 0    karma: 7
  37. #44   Visto esto hasta ASM parece más clarificador xD , por otra parte es un odioso y a la vez buen trabajo de ofuscación :-)
    votos: 0    karma: 6
  38. #45   #13 Es por que, si os fijáis, en el fuente no hay ni un solo include.
    votos: 0    karma: 6
  39. #46   #33 Vamos, que no has escrito una linea de código en tu vida...
    votos: 2    karma: 21
  40. #47   #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.
    votos: 0    karma: 10
     *   ktzar ktzar
  41. #48   #13 GCC 4.4.4 en Fedora 13, compila perfectamente.
    votos: 0    karma: 10
  42. #49   #33 goto #18
    votos: 0    karma: 9
  43. #50   Programador programadorQueNuncaOfuscaCodigoSiempreDaNombreAVariableSuperLargosPaQueTodoElMundoSepaLoQueEstaHaciendo = ProgramadorJavaFactory.getProgramador();
    votos: 3    karma: 30
  44. #51   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.
    votos: 0    karma: 7
  45. #52   #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.
    votos: 0    karma: 6
  46. #53   Wow 19 Slocs
    votos: 0    karma: 7
  47. #54   Si tuviese huevos, lo escribieria en "white space" o "brainfuck"....
    votos: 1    karma: 2
     *   Vauldon Vauldon
  48. #55   #37 Te traigo código ofuscado en Perl y ya te cagas la pata abajo .
    votos: 1    karma: 13
  49. #56   cuanto progrmador aburrido...
    votos: 0    karma: 6
  50. #57   #13 #14 increible, Linux users que no saben compilar un programa :-|
    votos: 1    karma: 0
  51. #58   #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=0;for E(split(/./,C)){F=0;for G(split("",E)){C[P][F++
    ][D]=G} D++}J[P]=F; I[P++] =D}%L=split(/ /,"m _".chr(72)." c 2".
    chr(74)." a _m");sub a{for K(split(/ /,shift)){(K,L)=split(/=/,K
    );K=L{K};K=~s/_/L/; printf "%c[K",27}}sub u{a("a=40");for D(0..B
    -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{(N)=@_;while(N--) {Q=W;W=O=H;H=Q;for F( 0
    ..Q-1){for D(0..O-1) {Q[F][D]=K[F][D]}}for F(0..O-1){for D(0..Q-
    1){K[F][D]= Q[Q-D-1][F]}}}}sub l{for F(0..W-1){for D(0..H-1){(K[
    F][D]&& ((G[X+F][Y+D])|| (X+F<0)||(X+F>=A)|| (Y+D>=B)))&& return
    0}}1}sub p{for F(0..W-1){for D(0..H-1){(K[F][D]>0)&&(G[X+F][Y+D]
    =K[F][D]) }}1}sub o{for F(0..W-1){for D(0..H-1){(K[F][D]>0)&&(G[
    X+F][ Y+D]=0)}}}sub n{C=int(rand(P)) ;W=J[C];H=I[C];X=int(A/2)-1
    ;Y=0;for F(0..W-1){for D(0..H-1){K[F][D]= C[C][F][D]}}r(int(rand
    (4)));l&&p}sub c{d:for(D=B;D>=0;D--){for F(0..A-1){G[F][D]||next
    d}for(D2=D;D2>=0; D2--){for F(0..A-1){G[F][D2]= (D2>1)?G[F][D2-1
    ]:0; }}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(;;) {u;R=chr(1); (S,T)=select(R,U,V,
    0.01);if(S) {Z=getc;}else {if($e++>20){Z=" ";$e=0;}else{next;} }
    if(Z eq "k"){o;r(1);l||r(3);p}; if(Z eq "j"){o;X--;l||X++;p}; if
    (Z eq "l"){o;X++;l||X--;p};if(Z eq " "){o;Y++;(E=l)||Y--;p;E|| c
    |c|c|c|c|n||goto g;};if(Z eq "q"){last;}}g: a("a=0 m=".(B+8).";0
    " ); system "stty sane"; '; s/([A-Z])/$$1/g; s/%$/%/g; eval;
    votos: 3    karma: 31
  52. #59   Perl en si mismo ya viene ofuscado de fábrica
    votos: 3    karma: 31
  53. #60   #37 Simple, por la gran potencia que tiene a medio nivel, a diferencia de los interpretados como VB
    votos: 0    karma: 6
  54. #61   #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.
    votos: 1    karma: 16
  55. #62   #57 ei, que he usado el mismo comando que #19 con resultado diferente. Se ve que la version gcc es significativa.
    votos: 0    karma: 6
     *   jsianes jsianes
comentarios cerrados

menéame