Hace 13 años | Por manwy a bitelia.com
Publicado hace 13 años por manwy a bitelia.com

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.

Comentarios

D

Lo de 19 lineas... deberían contar "sentencias" (statements). En un linea puedes poner el programa entero.
Aún así sigue estando genial.

D

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.

D

#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.

g

#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

D

#24 Que no son 19, que es 1. lol

D

#25 Es cierto, es una línea. Pese a todo sigue sin compilarme.

B

#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.

leonard_shelby

#33 goto #18

d

#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.

D

Eso sí, te deja el buffer de bash hecho un asquito

c

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!

c

#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.

D

#3 #4 Es que lo dice la entradilla

g

Perl en si mismo ya viene ofuscado de fábrica

D

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 .

Ciri4n

Programador programadorQueNuncaOfuscaCodigoSiempreDaNombreAVariableSuperLargosPaQueTodoElMundoSepaLoQueEstaHaciendo = ProgramadorJavaFactory.getProgramador();

D

Y yo que creía que mi código natural era inentendible...

b

Esperanza Aguirre es capaz de programar el crysis en tres lineas de código y en basic ¡chupaos esa!

D

#27: #AguirreFacts No lo olvides.

e

Tendría mas merito si el codigo no estuviera ofuscado, eso si el tetris en 19 lineas (sin ofuscar) nose que haría...

pusilanime_hedonista

en la página del autor: "1989 IOCCC Best Game"
http://homepages.cwi.nl/~tromp/tetris.html

Novedoso, novedoso, no es que sea.

D

Si son 19 lineas en C ¿cuantas deben ser en Python? yo diría que una

pusilanime_hedonista

venga #9, ponte a ello. Que siendo una sola linea seguro que no tardas nada en hacerlo.
Es un desafio!

D

#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.

r

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

Itilvte

19 es un número magico

GatoSamurai

A ver... si quitais los saltos y demás, haceis linea y todo el código desaparece, joer... lol

D

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

quique

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?

jsianes

#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

D

#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

jsianes

#57 ei, que he usado el mismo comando que #19 con resultado diferente. Se ve que la version gcc es significativa.

a

#13 #14 increible, Linux users que no saben compilar un programa

D

#13 Creo que le falta una línea al inicio:
include

cavefish

#13 Es por que, si os fijáis, en el fuente no hay ni un solo include.

D

#13 GCC 4.4.4 en Fedora 13, compila perfectamente.

PistoleroSolitario

Wow 19 Slocs

D

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.

E

#39 Ya no sé si estás empleando la ironía o no sabes lo que es un concurso de código ofuscado.

D

#42 Lo segundo.

poker10

cuanto progrmador aburrido...

HeXmit

Visto esto hasta ASM parece más clarificador lol, por otra parte es un odioso y a la vez buen trabajo de ofuscación

Vauldon

Si tuviese huevos, lo escribieria en "white space" o "brainfuck"....

ElPerroDeLosCinco

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.

D

#38 Pero como? si no se entiende ni es claro ni nada

ktzar

#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.

jsianes

#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

D

#33 Vamos, que no has escrito una linea de código en tu vida...

B

#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.

D

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

musg0

#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.

D

#37 Te traigo código ofuscado en Perl y ya te cagas la pata abajo .

F

#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;

J

#37 Simple, por la gran potencia que tiene a medio nivel, a diferencia de los interpretados como VB