2010-08-20 8 views
156

Bu kod, Hindistan'ın haritasını yazdırır. O nasıl çalışır?Bu kod Hindistan haritasını nasıl oluşturur?

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

Çıkışın ekran görüntüsü? –

+55

Sadece gizlenmiş C ... bu çılgınlığa adanmış bütün toplumlar var. – Mark

+11

Çıkış: http: // codepad.org/ngiITeZ4 –

cevap

145

Uzun dize, ASCII'ye dönüştürülen bir ikili dizidir. İlk for bildirimi, b ifadesini, 10 ve dize verildikten sonra [b+++21] yapar. Dizeyi bir dizi olarak işleme, ofset 31 dizede "gerçek" verilerin başlangıcıdır (kod örneğindeki ikinci satır) sağlanan). Kodun geri kalanı sadece bit dizisinden geçer, 1'leri ve 0'ları! 'Ya ve boşluklara dönüştürür ve bir kerede bir karakter basar.

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

garip akıllı parçası putchar tablolara geçerli:

Az versiyonunu karartılmış. İlk putchar'u alın. ASCII 'Z', ondalık olarak 90'tır, yani 90/9 = 10, bir satırsonu karakteridir. İkincisi, ondalık 33, '!' için ASCII'dir. 33'ün düşük sıralı bitini değiştirmek, bir alan için ASCII olan 32'yi size verir. Bu, b tekilse !'un yazdırılmasına neden olur ve b ise bile yazdırılacak boş bir alan olur. Kodun geri kalanı sadece dize aracılığıyla "işaretçi" a yürümek için var.

+20

Dize bir bit dizisi değil (kodda bit vardiyası işlemlerinin olmadığını unutmayın). görüntünün uzunluk-uzunluk kodlaması – interjay

85

Temel olarak, dize, görüntünün run-length encoding'udur: Dizede yer alan alternatif karakterler, bir alanın kaç kez çizildiğini ve kaç kez bir ünlem işareti ardışık olarak çizildiğini belirtir. İşte bu programın farklı unsurların bir analizidir:

bu dizenin ilk 31 karakter göz ardı edilir

kodlanmış dize. Kalan görüntü çizme talimatları içerir. Tek tek karakterler, ardışık olarak kaç boşluk veya ünlem işareti çizeceğini belirler. döngü

için

Dış Bu döngü dizesinde karakteri geçtiği. Her yineleme, b değerini bir artırır ve dizgideki sonraki karakteri a olarak atar. döngü

Bu döngü için

İç ayrı ayrı karakterleri çizer ve yeni satır her satırın sonuna ulaşır. Çizilen karakter sayısı a - 64'dur. c değeri 10'dan 90'a gider ve satır sonuna ulaşıldığında 10'a sıfırlanır. Bu gerektiğinde b çift ya da tek ya da bir satır olmasına bağlı olarak, uygun karakter çizer

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

: olarak

putchar

Bu yeniden yazılabilir.

+1

İlk 31 karakter neden yok sayılıyor? –

+3

@PankajMahato, çünkü 'b' 10'dan başlıyor ve indeks 31'den başlayan '(b ++) + 21' dir. – interjay