Analyse des Codes xmas.c
- Der 1988 entstandene C-Code namens xmas.c gewann den International Obfuscated C Code Contest.
- Dieser Code ist kleiner als seine Ausgabe und zeigte eine neue Richtung für Standards zur Textkomprimierung auf.
- Wenn man den Code kompiliert und ausführt, funktioniert er ohne Parameter und sieht auf amüsante Weise so aus, als hätte jemand zufällig auf die Tasten einer Schreibmaschine gehämmert.
Ausgabe des Codes
- Führt man den Code aus, wird der Liedtext von "The Twelve Days of Christmas" ausgegeben.
- Der ausgegebene Inhalt ist der Liedtext, der die Geschenke vom ersten bis zum zwölften Weihnachtstag aufzählt.
Analyse
- Um den Code zu verstehen, muss man ihn in eine besser lesbare Form umschreiben.
- Beim Umschreiben wird sichtbar, dass mit einer bestimmten Zeichenkette eine Substitutionschiffre entschlüsselt wird.
- Die Variable
t spielt eine wichtige Rolle bei der Steuerung der Richtung der Rekursion.
- Der Code entschlüsselt über Rekursion die Substitutionschiffre und gibt den Liedtext des Weihnachtslieds aus.
Vereinfachung
- Sobald man das Programm verstanden hat, kann man es mit einigen Schleifen und C-String-Bibliotheksfunktionen vereinfachen.
- Am Ende lässt sich der Code so weit vereinfachen, dass nur noch das Ausgeben des Liedtexts übrig bleibt.
Meinung von GN⁺
- Höhepunkt der Kreativität: Der Code xmas.c ist ein hervorragendes Beispiel für obfuskierten Code mit Substitutionschiffre und Rekursion. Er zeigt, wie sich Kreativität in der Programmierung ausdrücken kann.
- Didaktischer Wert: Die Analyse und das Verständnis des Codes können für angehende Software Engineers eine gute Übung sein, um ihre Programmierfähigkeiten zu verbessern.
- Spaß und Interesse: Dieser Code bietet die Gelegenheit, den Spaß an der Programmierung zu entdecken und die Freude am Lösen komplexer Probleme zu erleben.
1 Kommentare
Hacker-News-Kommentare
Ein ähnliches Beispiel aus der TeX-Welt ist
xii.tex:pdftexausführt, kann man ein anderes Ergebnis erhalten als erwartet. Das lässt sich auf shreevatsa.net ansehen.Dieser Code erinnert an Kolmogorov-Komplexität:
Ich habe diesen Code bekommen, als er ursprünglich veröffentlicht wurde, aber unter einem anderen Dateinamen:
Der IOCCC (International Obfuscated C Code Contest) ist auch 2023 noch sehr aktiv:
Wenn man die Warnungen abschaltet, funktioniert es auch im aktuellen Code-Repository (
trunk):Auch auf Rosetta Code gibt es eine ähnliche Aufgabe:
Ich habe gute Erinnerungen daran, wie ein Professor dieses Codefragment im letzten Semester an der Universität zu Beginn der Vorlesung gezeigt hat:
Aus meiner Studienzeit erinnere ich mich, dass dieser Code in gedruckten Lernunterlagen zur C-Sprache stand und ich ihn einmal selbst abgetippt habe:
Dieser Code verwendet eine sehr alte Version der C-Sprache:
main-Funktion den alten K&R-Stil verwendet und deshalb heute nicht mehr kompilieren würde.Einer der interessanten Punkte ist die Verbindung zwischen Larry Walls zwei IOCCC-Siegen und der Tatsache, dass er Perl entworfen hat: