169 votes

Comment fonctionne ce code générer la carte de l'Inde?

Ce code imprime la carte de l'Inde. Comment ça fonctionne?

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

154voto

bta Points 22525

Le long de la chaîne est simplement une séquence binaire converti en ASCII. La première for déclaration fait b au départ à 10, et de l' [b+++21] après que la chaîne de rendements 31. Le traitement de la chaîne comme un tableau, le décalage 31 est le début de la "réel" de données dans la chaîne (la deuxième ligne dans l'exemple de code que vous avez fournies. Le reste du code parcourt simplement la séquence de bits, la conversion de la 1 et de 0 !'s et des espaces blancs et l'impression d'un caractère à la fois.

Moins d'obfuscation version:

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

L' étrange astuce est dans l' putchar des déclarations. Prendre la première putchar. ASCII 'Z' est de 90 en décimal, donc 90 / 9 = 10, qui est un caractère de saut de ligne. Dans la deuxième décimale, 33 est l'ASCII pour '!'. Le basculement de la faible peu de 33 vous donne 32, qui est l'ASCII pour un espace. Cela provoque ! à être imprimé si b est impair, et un espace vide pour être imprimé si b est même. Le reste du code est simplement là pour marcher le "pointeur" a par le biais de la chaîne.

89voto

interjay Points 51000

Fondamentalement, la chaîne est un codage de l'image: Alternance de caractères dans la chaîne dire combien de fois pour dessiner un espace, et comment beaucoup de temps pour dessiner un point d'exclamation à la suite. Voici une analyse des différents éléments de ce programme:

La chaîne codée

Les 31 premiers caractères de cette chaîne sont ignorés. Le reste contiennent des instructions pour le dessin de l'image. Les caractères individuels de déterminer combien d'espaces ou points d'exclamation à dessiner de façon consécutive.

Externe pour la boucle

Cette boucle va sur les caractères dans la chaîne. Chaque itération augmente la valeur de b par un, et attribue le caractère suivant dans la chaîne d' a.

Boucle intérieure

Cette boucle dessine des caractères individuels, et un retour à la ligne à chaque fois qu'il atteint la fin de la ligne. Le nombre de caractères dessinée a - 64. La valeur de c va de 10 à 90, et se remet à 10 lors de la fin de la ligne est atteint.

L' putchar

Cela peut être réécrit comme suit:

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

Il dessine le caractère approprié, selon qu' b est pair ou impair, ou un saut de ligne en cas de besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X