Wie generiert dieser Code die Karte von Indien?

Lesezeit: 3 Minuten

Benutzeravatar von narayanpatra
Narayanpatra

Dieser Code druckt die Karte von Indien. Wie funktioniert es?

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

  • Es ist nur verschleiertes C … es gibt ganze Gesellschaften, die sich dieser Art von Wahnsinn verschrieben haben.

    – Markieren

    20. August 2010 um 17:33 Uhr

  • Ausgabe: codepad.org/ngiITeZ4

    – Andreas Rejbrand

    20. August 2010 um 17:35 Uhr

  • #include “Stdio.h” : Funktioniert das auf allen Compilern? Ich bin überrascht zu sehen, dass Sie funktionierenden Code mit Fehlverschlüssen erhalten können. Vielleicht ist es unter Windows (nicht case sensitive FS)

    – Alternative

    20. August 2010 um 17:44 Uhr

  • Für mehr Spaßcode wie diesen siehe [The International Obfuscated C Code Contest][ioccc.org/].

    – Dunkler Staub

    20. August 2010 um 17:44 Uhr

  • Beachten Sie nur, dass der Code ist absichtlich schwer zu verstehen, und es bringt nicht viel, es herauszufinden, was das Erlernen von C auf Anfängerniveau betrifft.

    – Tyler McHenry

    20. August 2010 um 17:45 Uhr

Benutzeravatar von bta
bta

Die lange Zeichenfolge ist einfach eine in ASCII konvertierte Binärsequenz. Der Erste for Aussage macht b Beginnen Sie um 10, und die [b+++21] nachdem die Zeichenfolge 31 ergibt. Wenn Sie die Zeichenfolge als Array behandeln, ist Offset 31 der Beginn der “echten” Daten in der Zeichenfolge (die zweite Zeile in dem von Ihnen bereitgestellten Codebeispiel). Der Rest des Codes durchläuft einfach die Bitsequenz, wandelt die 1 und 0 in ! und Leerzeichen um und gibt jeweils ein Zeichen aus.

Weniger verschleierte 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;
}

Das seltsam schlaues Teil ist in der putchar Aussagen. Nehmen Sie die erste putchar. ASCII 'Z' ist 90 dezimal, also 90 / 9 = 10, was ein Zeilenumbruchzeichen ist. In der zweiten Dezimalzahl steht 33 für ASCII '!'. Wenn Sie das niederwertige Bit von 33 umschalten, erhalten Sie 32, was ASCII für ein Leerzeichen ist. Dies bewirkt ! zu drucken, wenn b ungerade ist, und ein Leerzeichen gedruckt werden soll, wenn b ist gerade. Der Rest des Codes ist einfach dazu da, den “Zeiger” zu gehen. a durch die Schnur.

  • Die Zeichenfolge ist keine Bitfolge (beachten Sie, dass der Code keine Bitverschiebungsoperationen enthält). Es ist eine Lauflängenkodierung des Bildes.

    – zwischenjay

    20. August 2010 um 18:04 Uhr

Grundsätzlich ist die Zeichenfolge a Lauflängencodierung des Bildes: Abwechselnde Zeichen in der Zeichenfolge geben an, wie oft nacheinander ein Leerzeichen und wie oft ein Ausrufezeichen zu zeichnen ist. Hier ist eine Analyse der verschiedenen Elemente dieses Programms:

Die codierte Zeichenfolge

Die ersten 31 Zeichen dieser Zeichenfolge werden ignoriert. Der Rest enthält Anweisungen zum Zeichnen des Bildes. Die einzelnen Zeichen bestimmen, wie viele Leerzeichen oder Ausrufezeichen nacheinander gezeichnet werden.

Äußere for-Schleife

Diese Schleife geht über die Zeichen in der Zeichenfolge. Jede Iteration erhöht den Wert von b um eins und weist das nächste Zeichen in der Zeichenfolge zu a.

Innere For-Schleife

Diese Schleife zeichnet einzelne Zeichen und einen Zeilenumbruch, wenn sie das Zeilenende erreicht. Die Anzahl der gezeichneten Zeichen ist a - 64. Der Wert von c geht von 10 auf 90 und wird auf 10 zurückgesetzt, wenn das Zeilenende erreicht ist.

Das putchar

Dies kann umgeschrieben werden als:

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

Es zeichnet das entsprechende Zeichen, je nachdem, ob b ist gerade oder ungerade oder bei Bedarf ein Zeilenumbruch.

  • Warum werden die ersten 31 Zeichen ignoriert?

    – Pankaj Mahato

    5. Juni 2014 um 18:47 Uhr

  • @PankajMahato weil b beginnt bei 10 und der Index ist (b++)+21die am 31.

    – zwischenjay

    6. Juni 2014 um 20:41 Uhr

1425220cookie-checkWie generiert dieser Code die Karte von Indien?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy