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;
}
c
obfuscation
narayanpatra
źródło
źródło
Odpowiedzi:
Długi ciąg to po prostu sekwencja binarna przekonwertowana na ASCII. Pierwsza
for
instrukcjab
rozpoczyna się od 10, a następująca[b+++21]
po łańcuchu daje 31. Traktując łańcuch jako tablicę, przesunięcie 31 jest początkiem „rzeczywistych” danych w ciągu (druga linia w podanym przykładzie kodu). Reszta kodu po prostu przechodzi w pętli przez sekwencję bitów, konwertując jedynki i zera na znaki! I białe znaki i wypisując po jednym znaku na raz.Mniej zaciemniona wersja:
Dziwnemądry część znajduje się wputchar
sprawozdaniu. Zrób pierwszyputchar
. ASCII'Z'
to 90 dziesiętnie, więc 90/9 = 10, który jest znakiem nowej linii. W drugim dziesiętne 33 to ASCII dla'!'
. Przełączenie dolnego bitu 33 daje 32, czyli ASCII dla spacji. Powoduje to, że!
zostanie wydrukowane, jeślib
jest nieparzyste, a puste miejsce, jeślib
jest parzyste. Reszta kodu jest po prostu po to, by przejść „wskaźnik”a
przez łańcuch.źródło
Zasadniczo ciąg jest kodowaniem obrazu na całej długości : naprzemienne znaki w ciągu mówią, ile razy należy narysować spację i ile razy należy narysować po kolei znak wykrzyknika. Oto analiza różnych elementów tego programu:
Zakodowany ciąg
Pierwsze 31 znaków tego ciągu jest ignorowanych. Reszta zawiera instrukcje dotyczące rysowania obrazu. Poszczególne znaki określają, ile spacji lub wykrzykników należy narysować kolejno.
Zewnętrzna pętla
Ta pętla przechodzi przez znaki w ciągu. Każda iteracja zwiększa wartość o
b
jeden i przypisuje następny znak w ciągua
.Wewnętrzna pętla
Ta pętla rysuje pojedyncze znaki i znak nowej linii za każdym razem, gdy osiągnie koniec wiersza. Liczba narysowanych znaków wynosi
a - 64
. Wartośćc
zmienia się od 10 do 90 i resetuje do 10 po osiągnięciu końca linii.Plik
putchar
Można to przepisać jako:
Rysuje odpowiedni znak, w zależności od tego, czy
b
jest parzysty, czy nieparzysty, lub w razie potrzeby nową linię.źródło
b
zaczyna się od 10, a indeks jest(b++)+21
, który zaczyna się od 31.