Coden kann ja durchaus Sport sein. Die körperliche Anstrengung mag nicht dieselbe sein, aber gesunde Ausdauer und Hunger nach neuen Herausforderungen sind durchaus hilfreich. Beides wird gebraucht, wenn ein regelrechter Wettbewerb darum betrieben wird, besondere, klassische Probleme immer wieder neu und kreativ zu lösen. Ein beliebter Zeitvertreib ist es, immer wieder neue Quines zu finden.

Quines sind Programme, welche nichts anderes machen, als ihren eigenen Quelltext vollständig auszugeben. Dabei besteht die Schwierigkeit darin, ein Abstraktionslevel zu erreichen, das über einfache Selbstreferentialität hinausgeht. Quines sind daher insofern oftmals kurzweilige und aufschlussreiche Programme, dass sie die meist Methoden und Funktionen einer Sprache kreativ ausnutzen. Wenn zudem keine Möglichkeit besteht, Code aus einer Variable zu parsen und auszuführen, erhöht sich der Schwierigkeitsgrad. Allerdings sind zwei Regeln zu beachten:

  1. Ein Quine darf keinen Input erhalten, also auch nicht die eigene Datei einlesen, sondern muss den Code selbst generieren. Es darf jedoch die Repräsentation seines Codes speichern und auslesen.
  2. Ein Quine darf nicht leer sein und daher auch keinen leeren Output generieren.

Es ist also nicht erlaubt zu schreiben:

<script>
  alert(document.querySelector("script").outerHTML);
</script>

Wenn das Quine in einer Websprache geschrieben wurde, sind allerdings meist Formatierungsunterschiede zwischen der Ausgabe im Quelltext und der Darstellung im Browser erlaubt. Wenn dabei etwa Zeilenumbrüche verloren gehen, kann das dann trotzdem gültig sein.

Dabei besteht der Reiz nicht zuletzt darin, möglichst kurze Quines zu entwickeln, welche die Grenzen ihrer jeweiligen Sprache ausloten. Aber auch solche Quines, die kettenartig Code in verschiedenen Sprachen generieren, gelten als besondere Herausforderung. Teilweise werden sie sogar in esoterischen, grafischen Sprachen wie Piet oder Brainfuck2D oder gar als zellulärer Automat im Sinne eines Von-Neumann-Universalkonstruktors entworfen.

Ein Quine entwerfen

Eine probate Möglichkeit besteht darin, das Quine zweizuteilen. Der eine Teil speichert Code, der andere führt Code aus. Der gespeicherte Code entspricht dann dem Code, der ihn ausführt und wird anschließend wieder eingefügt. Schematisch könnte man schreiben:

var a = "// enthält den Code der Funktion b";
function b() {
  // verarbeite a und füge ihren Inhalt an derselben Stelle wieder ein
}
b();

Man könnte an dieser Stelle für a einen String einfügen, welcher der Funktion b entspricht, die diesen einfach per alert() ausgibt. Dann muss allerdings darauf Acht gegeben werden, Anführungszeichen in irgendeiner Form zu maskieren. Im einfachsten Falle wird ein Ersatzzeichen eingefügt, das dann in b für das entsprechende Anführungszeichen wieder ausgetauscht wird.

a="YT0iISI7DQphbGVydChhdG9iKGEpLnJlcGxhY2UoJyEnLGEpKQ==";
alert(atob(q).replace('!',a))

Dieses Quine in JavaScript umgeht das Problem, indem die Variable a das gesamte Quine als Base64-codierten String abbildet. Der ausführende Teil decodiert zunächst a, wobei dessen Repräsentation des Quines statt YT0iISI7… lediglich „!“ enthält:

a="!";
alert(atob(a).replace('!',a))

Anschließend wird das Ausrufezeichen mit dem Base64-codierten Wert von a ersetzt und zusammen ausgegeben. 82 Zeichen sind nicht übel, allerdings ist der Base64-codierte String deutlich länger als der restliche Code.

Aber es geht noch deutlich kürzer. JavaScript hält in ES6 hilfreiche Kurznotationen bereit, sodass man mithilfe eines rekursiven Funktionsaufrufs immerhin auf 33 Zeichen kommt:

(a=()=>{alert('(a='+a+')()');})()

Wer findet noch kürzere oder noch elegantere Quines? Oder eines, das in mehreren Sprachen funktioniert?

Hinterlasse einen Kommentar