Jak ten kod generuje mapę Indii?

Ten kod drukuje mapę Indii. Jak to działa?

#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;
}
 159
Author: Sankalp, 2010-08-20

2 answers

Długi łańcuch jest po prostu sekwencją binarną przekonwertowaną do ASCII. Pierwsza instrukcja for sprawia, że {[2] } zaczyna się od 10, a [b+++21] po łańcuchu daje 31. Traktując łańcuch jako tablicę, offset 31 jest początkiem "rzeczywistych" danych w łańcuchu (druga linia w podanym kodzie). Reszta kodu po prostu zapętla sekwencję bitów, konwertując 1 i 0 Na !"s i białe spacje i drukowanie po jednym znaku na raz.

Mniej zaciemnione Wersja:

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

dziwna mądra część jest w putchar wypowiedziach. Weź pierwszą putchar. ASCII 'Z' jest liczbą dziesiętną 90, więc 90 / 9 = 10, która jest znakiem nowej linii. W drugim, dziesiętnym 33 jest ASCII dla '!'. Przełączenie bitu niskiego rzędu 33 daje 32, czyli ASCII dla spacji. To powoduje, że ! jest wydrukowane, jeśli b jest nieparzyste, a spacja jest wydrukowana, jeśli b jest parzyste. Reszta kodu jest po prostu tam, aby przejść "wskaźnik" a przez sznurek.

 149
Author: bta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-20 17:58:07

Zasadniczo, łańcuch znaków jest kodowaniem run-length obrazu: znaki naprzemienne w łańcuchu mówią, ile razy narysować spację, a ile razy narysować wykrzyknik kolejno. Oto analiza różnych elementów tego programu:

Zakodowany łańcuch

Pierwsze 31 znaków tego ciągu jest ignorowanych. Reszta zawiera instrukcje dotyczące rysowania obrazu. Poszczególne znaki określają ile spacji lub wykrzykniki do rysowania kolejno.

Zewnętrzne dla pętli

Ta pętla przechodzi nad znakami w łańcuchu. Każda iteracja zwiększa wartość b o jeden i przypisuje następny znak w łańcuchu do a.

Wewnętrzna pętla for

Ta pętla rysuje pojedyncze znaki i nowy wiersz, gdy dociera do końca linii. Liczba wylosowanych znaków to a - 64. Wartość c przechodzi z 10 do 90 i resetuje się do 10, gdy koniec linii został osiągnięty.

Na putchar

Można to przepisać jako:

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

Rysuje odpowiedni znak, w zależności od tego, czy b jest parzyste, nieparzyste, czy też w razie potrzeby znak nowego wiersza.

 86
Author: interjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-20 18:02:32