Quine

Ein Quine-Programm oder Quine ist ein Programm, das beim Ausführen seinen eigenen Quellcode ausgibt. Ein Quine darf nicht „aus sich selbst heraustreten“, indem es beispielsweise den Inhalt der Datei ausdruckt, in der es enthalten ist, oder introspektive Fähigkeiten verwendet, um seine eigene Darstellung auszudrucken. Stattdessen muss es seinen eigenen Quellcode berechnen.


Der klassische Weg zur Erstellung eines solchen Programms erfolgt in zwei Schritten:

  1. Initialisiere eine Zeichenfolgevariable mit einem Platzhalter für die Interpolation.
  2. Drucke die Zeichenfolge und interpolieren Sie sie in sich selbst.

Der Trick besteht darin, die Zeichenfolge genau richtig zu wählen. Wie man das macht, ist von Sprache zu Sprache unterschiedlich und hängt von der Deklaration der Variablen, dem Bedarf an Semikolons und Zeilenumbrüchen, den erforderlichen Anführungszeichen usw. ab. Der Umgang mit Anführungszeichen ist interessant; Man muss einen Weg finden, anzugeben, dass ein Anführungszeichen gedruckt werden soll, ohne tatsächlich ein Anführungszeichen zu verwenden.

Bash

Wie die meisten Dinge in Bash verwendet auch dieses Programm eine interessante Eigenart. Obwohl einfache Anführungszeichen starke Anführungszeichen sind und nichts erweitern, interpretiert printf oktale Escapezeichen als Zeichen mit dem angegebenen Codepunkt:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

Python

In Python liefert der Formatbezeichner %r automatisch einfache Anführungszeichen. Am einfachsten ist es, wenn der Code mit einem Zeilenumbruchzeichen endet:

s='s=%r;print(s%%s)';print(s%s)

Wenn man den Code ohne Zeilenumbruch möchte, muss man Folgendes schreiben:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

Die folgenden JavaScript-Quines laufen unter node.js. Sie verwenden console.log, das immer eine neue Zeile anfügt, sodass am Ende eines jedes Skripts eine neue Zeile benötigt wird:

s="s=%j;console.log(s,s)";console.log(s,s)

Das folgende Programm ist auch interessant: Es druckt nicht seine gesamte Darstellung, aber es verlässt sich auf die Tatsache, dass Funktionen eine bestimmte Darstellung haben:

(function a(){console.log('('+a+')()')})()

Das nächste Beispiel ist nah am Cheaten, da es eval verwendet:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Rust

Rust bietet eine Möglichkeit, ein Argument in seinem formatierten Druckmakro in Anführungszeichen zu setzen. Dieses Makro erfordert jedoch, dass das erste Argument des Druckmakros ein Zeichenfolgenliteral ist! Am besten verwendet man daher den Positionsargumentbezeichner:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Dieses PHP-Programm funktioniert, indem es den Quellcode in einer Zeichenkette speichert und diese Zeichenkette dann mit printf ausgibt. Die 39 steht für das ASCII-Zeichen ', um die Anführungszeichen in der Zeichenkette korrekt zu behandeln:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Zu guter Letzt folgt HQ9+, das von Cliff Biffle entwickelt wurde:

Q
Zurück