Reto de código 1. ¿Preparado?
Reglas del juego: los comentarios en este artículo están cerrados y hay que responder desde este enlace. La primera persona que responda correctamente se llevará una taza de Geeky Theory, tal y como explicamos aquí (debe vivir en España). Debido a que las respuestas las puede ver todo el mundo, intentaré esconderlas "a mano" para que esén ocultas y no haya copia de respuestas. Estamos trabajando para ocultarlas automáticamente, pero ya será en el siguiente reto. La respuesta válida será aquella que este correctamente explicada para demostrar la comprensión del código. No vale con ejecutar y copiar la respuesta. El reto estará abierto 10 días a partir de su publicación.
La historia
Era el primer día de la segunda asignatura relacionada con la programación en mi carrera. Íbamos a aprender C++ y la programación orientada a objetos. Previamente habíamos cursado otra asignatura de fundamentos de programación en la que habíamos aprendido C y toda la programación procedural y, en los exámenes de esta asignatura previa siempre había preguntas del tipo "¿Qué sale por pantalla?" que te obligan a seguir la ejecución del código y la variables. Considero que la asignatura de C fue exigente y estábamos bien preparados. Pero antes de empezar las clases de C++ el profesor quiso plantearnos un reto, un reto que además tenía una jugosa recompensa.
Obviamente el reto tenía trampa, consistía en seguir un código farragoso cuanto menos. Era tan tedioso que podíamos compilarlo, ver el resultado y a partir de ahí explicar el funcionamiento. Ahora ha llegado el momento de transmitir ese reto al lector de Geeky Theory, de sacar de la posición de confort a todos los que os consideráis buenos programadores y olvidarnos del código con abundantes comentarios y documentación. No se si este código es muy famoso y ya lo habéis visto alguna vez, pero en cualquier caso dejad a los que no lo conozcan que se estrujen un poco los sesos.
El reto
El reto es "sencillo". Entender qué muestra por pantalla el código y cómo funciona el programa para que aparezca eso. El código está escrito en C.
- Nivel básico (estudiante): modificar el código, añadir paréntesis, líneas printf, usar la depuración, etc. Tras esto, compilarlo, ver el resultado y explicarlo.
- Nivel gurú informático: compilarlo, ver el resultado y explicarlo.
- Nivel informático hardcore: explicarlo sin compilarlo.
¿Te atreves?
El código
#include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
Doy fe de que compila sin errores ni warnings. Creo que es un ejemplo de recursividad y encriptación bastante avanzado.
Espero que os haya gustado y comentéis si os ha sorprendido el resultado.
Recordad que podéis responder desde este enlace.
¡Nos vemos en más publicaciones!