2010-08-20 17 views
156

Este código imprime el mapa de India. ¿Como funciona?¿Cómo genera este código el mapa de India?

#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; 
} 
+0

¿captura de pantalla de la salida? –

+55

Es solo ofuscado C ... hay sociedades enteras dedicadas a este tipo de locura. – Mark

+11

Salida: http: // codepad.org/ngiITeZ4 –

Respuesta

145

La cadena larga es simplemente una secuencia binaria convertida a ASCII. La primera instrucción for hace que b comience en 10, y [b+++21] después de que la cadena ceda 31. Tratando la cadena como una matriz, el desplazamiento 31 es el inicio de los datos "reales" en la cadena (la segunda línea en el código muestra previsto). El resto del código simplemente recorre la secuencia de bits, convirtiendo los 1 y 0 en! Y espacio en blanco e imprimiendo un carácter a la vez.

menos ofuscado versión:

#include "stdio.h" 
int main (void) { 
    int a=10, b=0, c=10; 
    char* bits ="TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!"; 
    a = bits[b]; 
    while (a != 0) { 
     a = bits[b]; 
     b++; 
     while (a > 64) { 
      a--; 
      if (++c == 'Z') { 
       c /= 9; 
       putchar(c); 
      } else { 
       putchar(33^(b & 0x01)); 
      } 
     } 
    } 
    return 0; 
} 

El extraña parte más inteligente está en las declaraciones putchar. Tome el primer putchar. 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 por un espacio. Esto ocasiona que se imprima ! si b es impar, y un espacio en blanco para imprimir si b es par. El resto del código está simplemente allí para recorrer el "puntero" a a través de la cadena.

+20

La cadena no es una secuencia de bits (tenga en cuenta que no hay operaciones de cambio de bits en el código). codificación por longitud de ejecución de la imagen. – interjay

85

Básicamente, la cadena es run-length encoding de la imagen: los caracteres alternos en la cadena indican cuántas veces se debe dibujar un espacio y cuántas veces se debe dibujar un signo de admiración consecutivamente. He aquí un análisis de los diferentes elementos de este programa:

La cadena codificada

se ignoran los primeros 31 caracteres de esta cadena. El resto contiene instrucciones para dibujar la imagen. Los personajes individuales determinan cuántos espacios o signos de exclamación dibujarán consecutivamente.

exterior de bucle

Este bucle pasa a través de los caracteres de la cadena. Cada iteración aumenta el valor de b en uno, y asigna el siguiente carácter de la cadena al a.

interior para bucle

Este bucle empates caracteres individuales, y una nueva línea cada vez que se llega al final de la línea. La cantidad de caracteres dibujados es a - 64. El valor de c va de 10 a 90 y se restablece a 10 cuando se alcanza el final de la línea.

El putchar

Esto puede reescribirse como:

++c; 
if (c==90) {  //'Z' == 90 
    c = 10;  //Note: 10 == '\n' 
    putchar('\n'); 
} 
else { 
    if (b % 2 == 0) 
     putchar('!'); 
    else 
     putchar(' '); 
} 

Se dibuja el carácter apropiado, dependiendo de si b es par o impar o un salto de línea cuando sea necesario.

+1

¿Por qué se ignoran los primeros 31 caracteres? –

+3

@PankajMahato porque 'b' comienza en 10 y el índice es' (b ++) + 21', que comienza en 31. – interjay

Cuestiones relacionadas