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
fordeclaraciónbcomienza 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 lasputchardeclaraciones. 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 sibes impar y que se imprima un espacio en blanco sibes par. El resto del código simplemente está ahí para recorrer el "puntero" aatravé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
ben 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 decva de 10 a 90 y se restablece a 10 cuando se alcanza el final de la línea.los
putcharEsto se puede reescribir como:
Dibuja el carácter apropiado, dependiendo de si
bes par o impar, o una nueva línea cuando sea necesario.fuente
bcomienza a las 10 y el índice es(b++)+21, que comienza a las 31.