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
negativos: 3   usuarios: 225   anónimos: 258  
compartir:  twitter  facebook  tuenti  
  1. 30  votos: 2   link
    el 04-08-2010 19:14 UTC por manwy manwy
  2. #2   Eso sí, te deja el buffer de bash hecho un asquito :-P
    43  votos: 4   link
    el 04-08-2010 19:16 UTC por IPanonima IPanonima
  3. #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!
    43  votos: 4   link
    el 04-08-2010 19:26 UTC por corin corin
  4. #4   #3 lo del concurso lo dice en la noticia ¬¬
    153  votos: 17   link
    el 04-08-2010 20:08 UTC por Musterol Musterol
  5. #5   Tendría mas merito si el codigo no estuviera ofuscado, eso si el tetris en 19 lineas (sin ofuscar) nose que haría...
    25  votos: 4   link
    el 04-08-2010 20:23 UTC por eduardor2k eduardor2k
  6. #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.
    57  votos: 6   link
    el 04-08-2010 21:04 UTC por corin corin
  7. #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 .
    31  votos: 3   link
    el 04-08-2010 21:15 UTC por Ander_ Ander_
  8. #9   Si son 19 lineas en C ¿cuantas deben ser en Python? yo diría que una ;)
    23  votos: 2   link
    el 04-08-2010 22:16 UTC por --130208-- --130208--
  9. #10   Lo de 19 lineas... deberían contar "sentencias" (statements). En un linea puedes poner el programa entero.
    Aún así sigue estando genial.
    47  votos: 6   link
    el 04-08-2010 22:48 UTC por --56137-- --56137--
  10. #11   venga #9, ponte a ello. Que siendo una sola linea seguro que no tardas nada en hacerlo.
    Es un desafio!
    50  votos: 5   link
    el 05-08-2010 02:17 UTC por pusilanime_hedonista pusilanime_hedonista
  11. #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.
    29  votos: 3   link
    el 05-08-2010 06:14 UTC por adrigm adrigm
  12. #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?
    10  votos: 2   link
    el 05-08-2010 06:20 UTC por quique quique
  13. #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
    7  votos: 2   link
    el 05-08-2010 06:23 UTC por jsianes jsianes
  14. #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.
    47  votos: 16   link
    el 05-08-2010 06:25 UTC por pa2500 pa2500
  15. #17   en la página del autor: "1989 IOCCC Best Game"
    homepages.cwi.nl/~tromp/tetris.html

    Novedoso, novedoso, no es que sea.
    25  votos: 2   link
    el 05-08-2010 06:37 UTC por pusilanime_hedonista pusilanime_hedonista
  16. #18   #15 Concurso Internacional de Codigo -----> OFUSCADO <------
    94  votos: 11   link
    el 05-08-2010 06:39 UTC por --13579-- --13579--
  17. #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
    14  votos: 1   link
    el 05-08-2010 06:42 UTC por --13579-- --13579--
  18. #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.
    15  votos: 1   link
    el 05-08-2010 06:44 UTC por pa2500 pa2500
  19. #21   #13 Creo que le falta una línea al inicio:
    include <stdio.h>
    13  votos: 0   link
    el 05-08-2010 06:47 UTC por cubaman cubaman
  20. #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.
    69  votos: 8   link
    el 05-08-2010 06:49 UTC por --13579-- --13579--
  21. #23   19 es un número magico
    14  votos: 1   link
    el 05-08-2010 06:55 UTC por Itilvte Itilvte
  22. #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
    20  votos: 2   link
    el 05-08-2010 06:55 UTC por undy undy
  23. #25   #24 Que no son 19, que es 1. xD
    </Pedantic mode>
    12  votos: 1   link
    el 05-08-2010 06:57 UTC por --13579-- --13579--
  24. #26   #25 Es cierto, es una línea. Pese a todo sigue sin compilarme.
    7  votos: 0   link
    el 05-08-2010 07:07 UTC por --102595-- --102595--
  25. #27   Esperanza Aguirre es capaz de programar el crysis en tres lineas de código y en basic ¡chupaos esa!
    28  votos: 3   link
    el 05-08-2010 07:14 UTC por blasfemo blasfemo
  26. #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
    60  votos: 6   link
    el 05-08-2010 07:35 UTC por --13579-- --13579--
  27. #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 :-)
    12  votos: 0   link
    el 05-08-2010 07:49 UTC por --29907-- --29907--
  28. #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
    17  votos: 1   link
    el 05-08-2010 07:50 UTC por remosu remosu
  29. #32   A ver... si quitais los saltos y demás, haceis linea y todo el código desaparece, joer... xD
    13  votos: 1   link
    el 05-08-2010 07:57 UTC por GatoSamurai GatoSamurai
  30. #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.
    -19  votos: 6   link
    el 05-08-2010 07:57 UTC por ElPerroDeLosCinco ElPerroDeLosCinco
  31. #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.
    18  votos: 1   link
    el 05-08-2010 07:58 UTC por darteaga darteaga
  32. #35   #33 ¡Gracias por abrirnos los ojos! Todos los demás pensábamos que éramos mejores programadores.

    #CaptainObviousStrikesBack
    98  votos: 10   link
    el 05-08-2010 08:02 UTC por --29907-- --29907--
  33. #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 :-)
    6  votos: 0   link
    el 05-08-2010 08:08 UTC por jsianes jsianes
  34. #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 :-)
    68  votos: 7   link
    el 05-08-2010 08:14 UTC por --13579-- --13579--
  35. #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.
    44  votos: 4   link
    el 05-08-2010 08:21 UTC por --13579-- --13579--
  36. #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.
    6  votos: 0   link
    el 05-08-2010 08:21 UTC por musg0 musg0
  37. #42   #39 Ya no sé si estás empleando la ironía o no sabes lo que es un concurso de código ofuscado.
    7  votos: 0   link
    el 05-08-2010 08:27 UTC por Eloy Eloy
  38. #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 :-)
    6  votos: 0   link
    el 05-08-2010 08:38 UTC por Manortm Manortm
  39. #45   #13 Es por que, si os fijáis, en el fuente no hay ni un solo include.
    6  votos: 0   link
    el 05-08-2010 08:38 UTC por cavefish cavefish
  40. #46   #33 Vamos, que no has escrito una linea de código en tu vida...
    21  votos: 2   link
    el 05-08-2010 09:11 UTC por HipnoSapo HipnoSapo
  41. #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.
    10  votos: 0   link
    el 05-08-2010 09:32 UTC por ktzar ktzar
  42. #48   #13 GCC 4.4.4 en Fedora 13, compila perfectamente.
    10  votos: 0   link
    el 05-08-2010 09:43 UTC por johnny32 johnny32
  43. #49   #33 goto #18
    9  votos: 0   link
    el 05-08-2010 10:09 UTC por leonard_shelby leonard_shelby
  44. #50   Programador programadorQueNuncaOfuscaCodigoSiempreDaNombreAVariableSuperLargosPaQueTodoElMundoSepaLoQueEstaHaciendo = ProgramadorJavaFactory.getProgramador();
    30  votos: 3   link
    el 05-08-2010 10:35 UTC por Ciri4n Ciri4n
  45. #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.
    7  votos: 0   link
    el 05-08-2010 10:46 UTC por --169730-- --169730--
  46. #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.
    6  votos: 0   link
    el 05-08-2010 10:53 UTC por Boguminillo Boguminillo
  47. #53   Wow 19 Slocs
    7  votos: 0   link
    el 05-08-2010 12:23 UTC por PistoleroSolitario PistoleroSolitario
  48. #54   Si tuviese huevos, lo escribieria en "white space" o "brainfuck"....
    2  votos: 1   link
    el 05-08-2010 13:15 UTC por Vauldon Vauldon
  49. #55   #37 Te traigo código ofuscado en Perl y ya te cagas la pata abajo .
    13  votos: 1   link
    el 05-08-2010 13:30 UTC por Ander_ Ander_
  50. #56   cuanto progrmador aburrido...
    6  votos: 0   link
    el 05-08-2010 14:48 UTC por poker10 poker10
  51. #57   #13 #14 increible, Linux users que no saben compilar un programa :-|
    0  votos: 1   link
    el 05-08-2010 16:29 UTC por alexis_web alexis_web
  52. #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;
    31  votos: 3   link
    el 05-08-2010 16:39 UTC por FarK FarK
  53. #59   Perl en si mismo ya viene ofuscado de fábrica
    31  votos: 3   link
    el 05-08-2010 19:29 UTC por gnugeek gnugeek
  54. #60   #37 Simple, por la gran potencia que tiene a medio nivel, a diferencia de los interpretados como VB
    6  votos: 0   link
    el 05-08-2010 23:46 UTC por JAVH JAVH
  55. #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.
    16  votos: 1   link
    el 06-08-2010 07:00 UTC por BloodStar BloodStar
  56. #62   #57 ei, que he usado el mismo comando que #19 con resultado diferente. Se ve que la version gcc es significativa.
    6  votos: 0   link
    el 06-08-2010 07:22 UTC por jsianes jsianes
comentarios cerrados

menéame