#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
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
14252200cookie-checkWie generiert dieser Code die Karte von Indien?yes
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