Este código imprime el mapa de la India. ¿Como funciona?
#include <stdio.h>
main()
{
int a,b,c;
int count = 1;
for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
Hq!WFs XDt!" [b+++21]; )
for(; a-- > 64 ; )
putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
return 0;
}
c
obfuscation
narayanpatra
fuente
fuente
Respuestas:
La cadena larga es simplemente una secuencia binaria convertida a ASCII. La primera
for
declaraciónb
comienza en 10, y[b+++21]
después de que la cadena produce 31. Tratando la cadena como una matriz, el desplazamiento 31 es el comienzo de los datos "reales" en la cadena (la segunda línea en el ejemplo de código que proporcionó). El resto del código simplemente recorre la secuencia de bits, convirtiendo los 1 y 0 en! Y espacios en blanco e imprimiendo un carácter a la vez.Versión menos ofuscada:
La
extrañaparte inteligente está en lasputchar
declaraciones. Toma el primeroputchar
. ASCII'Z'
es 90 en decimal, entonces 90/9 = 10 que es un carácter de nueva línea. En el segundo, el decimal 33 es ASCII para'!'
. Alternar el bit de orden inferior de 33 le da 32, que es ASCII para un espacio. Esto hace!
que se imprima sib
es impar y que se imprima un espacio en blanco sib
es par. El resto del código simplemente está ahí para recorrer el "puntero" aa
través de la cadena.fuente
Básicamente, la cadena es una codificación de longitud de ejecución de la imagen: los caracteres alternos en la cadena dicen cuántas veces dibujar un espacio y cuántas veces dibujar un signo de exclamación consecutivamente. Aquí hay un análisis de los diferentes elementos de este programa:
La cadena codificada
Los primeros 31 caracteres de esta cadena se ignoran. El resto contiene instrucciones para dibujar la imagen. Los caracteres individuales determinan cuántos espacios o signos de exclamación dibujar de forma consecutiva.
Exterior para lazo
Este bucle pasa sobre los caracteres de la cadena. Cada iteración aumenta el valor de
b
en uno y asigna el siguiente carácter de la cadena aa
.Interior para bucle
Este bucle dibuja caracteres individuales y una nueva línea cada vez que llega al final de la línea. El número de caracteres dibujados es
a - 64
. El valor dec
va de 10 a 90 y se restablece a 10 cuando se alcanza el final de la línea.los
putchar
Esto se puede reescribir como:
Dibuja el carácter apropiado, dependiendo de si
b
es par o impar, o una nueva línea cuando sea necesario.fuente
b
comienza a las 10 y el índice es(b++)+21
, que comienza a las 31.