Ce code imprime la carte de l'Inde. Comment ça marche?
#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
la source
la source
Réponses:
La longue chaîne est simplement une séquence binaire convertie en ASCII. La première
for
instructionb
commence à 10 et[b+++21]
après la chaîne donne 31. Traitant la chaîne comme un tableau, offset 31 est le début des données «réelles» dans la chaîne (la deuxième ligne de l'exemple de code que vous avez fourni). Le reste du code parcourt simplement la séquence de bits, convertissant les 1 et les 0 en! Et en espace et en imprimant un caractère à la fois.Version moins obscure:
L'
étrangepartie intelligente est dans lesputchar
déclarations. Prenez le premierputchar
. ASCII'Z'
est 90 en décimal, donc 90/9 = 10 qui est un caractère de nouvelle ligne. Dans le second, le nombre décimal 33 est ASCII pour'!'
. Basculer le bit de poids faible de 33 vous donne 32, qui est ASCII pour un espace. Cela provoque!
l'impression sib
est impair, et un espace vierge à imprimer sib
est pair. Le reste du code est simplement là pour parcourir le "pointeur"a
dans la chaîne.la source
Fondamentalement, la chaîne est un codage de longueur d'exécution de l'image: les caractères alternés dans la chaîne indiquent combien de fois dessiner un espace et combien de fois dessiner un point d'exclamation consécutivement. Voici une analyse des différents éléments de ce programme:
La chaîne encodée
Les 31 premiers caractères de cette chaîne sont ignorés. Le reste contient des instructions pour dessiner l'image. Les caractères individuels déterminent le nombre d'espaces ou de points d'exclamation à dessiner consécutivement.
Boucle extérieure pour
Cette boucle parcourt les caractères de la chaîne. Chaque itération augmente la valeur de
b
de un et affecte le caractère suivant de la chaîne àa
.Boucle for intérieure
Cette boucle dessine des caractères individuels et une nouvelle ligne chaque fois qu'elle atteint la fin de la ligne. Le nombre de caractères dessinés est de
a - 64
. La valeur dec
passe de 10 à 90 et se réinitialise à 10 lorsque la fin de ligne est atteinte.le
putchar
Cela peut être réécrit comme:
Il dessine le caractère approprié, selon qu'il
b
est pair ou impair, ou une nouvelle ligne si nécessaire.la source
b
commence à 10 et l'indice est(b++)+21
, qui commence à 31.