Este código imprime o mapa da Índia. 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
fonte
fonte
Respostas:
A cadeia longa é simplesmente uma sequência binária convertida em ASCII. A primeira
for
instruçãob
inicia em 10 e,[b+++21]
depois que a sequência produz 31. Tratando a sequência como uma matriz, o deslocamento 31 é o início dos dados "reais" na sequência (a segunda linha no exemplo de código que você forneceu). O restante do código simplesmente percorre a sequência de bits, convertendo o 1 e o 0 em! E o espaço em branco e imprimindo um caractere de cada vez.Versão menos ofuscada:
A parte
estranha einteligente está nasputchar
declarações. Pegue o primeiroputchar
. ASCII'Z'
é 90 em decimal, então 90/9 = 10, que é um caractere de nova linha. No segundo, o decimal 33 é ASCII para'!'
. Alternar o bit de baixa ordem de 33 fornece 32, que é ASCII para um espaço. Isso faz!
com que seja impresso seb
for ímpar e um espaço em branco a ser impresso seb
for par. O restante do código está simplesmente lá para percorrer o "ponteiro"a
pela string.fonte
Basicamente, a sequência é uma codificação de duração da imagem: Caracteres alternativos na sequência dizem quantas vezes desenhar um espaço e quantas vezes desenhar um ponto de exclamação consecutivamente. Aqui está uma análise dos diferentes elementos deste programa:
A cadeia codificada
Os primeiros 31 caracteres dessa sequência são ignorados. O restante contém instruções para desenhar a imagem. Os caracteres individuais determinam quantos espaços ou pontos de exclamação serão desenhados consecutivamente.
Loop externo
Este loop passa por cima dos caracteres na string. Cada iteração aumenta o valor de
b
um e atribui o próximo caractere na sequência aa
.Interno para loop
Esse loop desenha caracteres individuais e uma nova linha sempre que chega ao final da linha. O número de caracteres desenhados é
a - 64
. O valor dec
vai de 10 a 90 e redefine para 10 quando o final da linha é atingido.o
putchar
Isso pode ser reescrito como:
Desenha o caractere apropriado, dependendo se
b
é par ou ímpar, ou uma nova linha quando necessário.fonte
b
começa às 10 e o índice é(b++)+21
, que começa às 31.