Bu kod Hindistan haritasını nasıl oluşturur?


169

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

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

63
Sadece gizlenmiş C ... bu tür deliliğe adanmış bütün toplumlar var.
Mark


2
#include "Stdio.h": Bu tüm derleyicilerde çalışır mı? Yanlış kodlarla çalışma kodu alabileceğinizi görmek beni şaşırttı. Belki Windows'da (büyük / küçük harfe duyarlı olmayan FS)
alternatif

2
Bunun gibi daha eğlenceli kodlar için [Uluslararası Gizli C Kodu Yarışması] [ ioccc.org/] adresine bakın .
DarkDust

12
Sadece kodun kasıtlı olarak anlaşılmasının zor olduğunu ve yeni başlayan bir seviyeden C öğrenmesi söz konusu olduğunda, onu anlamaktan kazanılacak çok şey olmadığını unutmayın.
Tyler McHenry

Yanıtlar:


154

Uzun dize, ASCII'ye dönüştürülmüş bir ikili dizidir. İlk forifade b10'da başlar ve [b+++21]sonra dize 31 verir. Dizeye bir dizi olarak işlendiğinde, ofset 31, dizedeki "gerçek" verilerin başlangıcıdır (sağladığınız kod örneğindeki ikinci satır). Kodun geri kalanı, bit dizisi arasında dolaşır ve 1'leri ve 0'ları! Ve boşluklarına dönüştürür ve her seferinde bir karakter yazdırır.

Daha az gizlenmiş sürüm:

#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ı olduğu putcharifadeleri. İlkini al putchar. ASCII 'Z'ondalık olarak 90'dır, bu nedenle yeni satır karakteri olan 90/9 = 10'dur. İkincisinde, ondalık 33 ASCII'dir '!'. Düşük dereceli 33 biti değiştirmek, size bir boşluk için ASCII olan 32 verir. Bu tuhafsa !yazdırılmaya bve düzse boş bir alana yazdırılmaya neden olur b. Kodun geri kalanı adize boyunca "işaretçi" yürümek için sadece orada .


22
Dize bir bit dizisi değildir (kodda bit kaydırma işlemi olmadığını unutmayın). Görüntünün çalışma uzunluğu kodlamasıdır.
interjay

89

Temel olarak, dize görüntünün çalışma uzunluğu kodlamasıdır : Dizedeki alternatif karakterler kaç kez boşluk çizileceğini ve kaç kez art arda ünlem işareti çizileceğini belirtir. İşte bu programın farklı unsurlarının bir analizi:

Kodlanmış dize

Bu dizenin ilk 31 karakteri yok sayılır. Geri kalanı görüntüyü çizmek için talimatlar içerir. Tek tek karakterler art arda kaç boşluk veya ünlem işareti çizileceğini belirler.

Döngü için dış

Bu döngü dizgideki karakterlerin üzerinden geçer. Her yineleme değerini bir arttırır bve dizedeki bir sonraki karakteri atar a.

Döngü için iç

Bu döngü tek tek karakterler ve satır sonuna geldiğinde yeni satır çizer. Çizilen karakter sayısı a - 64. Go değeri c10'dan 90'a gider ve satır sonuna ulaşıldığında 10'a döner.

putchar

Bu şu şekilde yeniden yazılabilir:

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

bÇift veya tek olmasına bağlı olarak uygun karakteri veya gerektiğinde yeni satır çizer .


1
İlk 31 karakter neden yok sayılıyor?
Pankaj Mahato

3
@PankajMahato çünkü b10'da başlıyor ve endeks, (b++)+2131'de başlıyor.
interjay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.