Sie müssen ein Programm schreiben, das den Quellcode ausgibt
- Größer als das ursprüngliche Programm (zeichenweise)
- Gibt beim Ausführen ein anderes Programm aus, das größer ist als es selbst (dh das neue Programm ist auch eine gültige Antwort auf diese Herausforderung).
Das ist Code-Golf, also gewinnt die kürzeste Antwort.
code-golf
quine
code-generation
PyRulez
quelle
quelle
:^)
Antworten:
GS2 (8636bd8e) , 0 Bytes
Dies druckt eine einzelne neue Zeile, die zwei neue Zeilen, die drei neue Zeilen usw. druckt.
Probieren Sie es online!
quelle
H9 + : 1 Zeichen
Stimmt. Ein Charakter. Gibt den Text auf 99 Flaschen Bier aus , was ein gültiges Programm ist. Alle fremden Daten zählen nicht, aber es gibt viele
9
s darin.Die Ausgabe des ausgegebenen Programms ist der Text zu 99 Flaschen Bier 59 Mal.
Diese Funktion gibt an, wie oft der Text ausgegeben wird, wenn Sie die Programmzeiten ausführen
n
(wenn meine Berechnung korrekt ist):quelle
2*59^n-2
aufgrund des "h" in "the" auch Instanzen von "Hello, world!" Enthält.GolfScript, 9 Zeichen
Dieser Code gibt Folgendes aus:
welche Ausgänge:
welche Ausgänge:
und so weiter.
Ich glaube, dies ist die kürzeste Antwort in einer "echten" Turing-vollständigen Programmiersprache.
Erläuterung:
Grundsätzlich ist der obige Originalcode eine "Quine-Ebene": Er gibt eine normale Quine aus, gefolgt von sich selbst.
In GolfScript ist jedes Codeblockliteral (z. B.
{foo}
), wenn es ungestört auf dem Stapel bleibt, ein Quine. Somit{.'.~'}
gibt es sich selbst einfach aus, genau wie jeder andere Codeblock.Der
.~
Code am Ende nimmt den letzten Codeblock auf dem Stapel, dupliziert ihn und führt die Kopie aus. Bei der Ausführung.'.~'
dupliziert der Code innerhalb des Codeblocks das oberste Element auf dem Stapel (dh die Kopie von sich selbst) und hängt die Zeichenfolge an.~
.Am Ende des Programms setzt der GolfScript-Interpreter die Zeichenfolge und gibt alles auf dem Stapel aus, der in diesem Fall aus einem
{.'.~'}
Block mehr als der Eingabe plus der Zeichenfolge besteht.~
.Bonus:
Das Hinzufügen von a
]
vor dem ersten.
(um alle Codeblöcke auf dem Stapel in einem Array zu sammeln, bevor sie dupliziert werden) lässt es exponentiell wachsen:Ausgänge:
welche Ausgänge:
welche Ausgänge:
und so weiter.
quelle
{].'.~'}.~︵ ┻━┻
Java 7: 0 Zeichen
Als Datei speichern
Blank.java
. Wenn Sie es als eine andere Datei speichern, ersetzen Sie eine Instanz vonBlank
durch den entsprechenden Dateinamen.Führen Sie dann in der Befehlszeile aus, indem Sie zuerst kompilieren und dann ausführen. Wenn das Kompilieren fehlschlägt, stoppen Sie.
Ich liste dies als Java 7 auf, da es für verschiedene Versionen von Java unterschiedlich ausgegeben werden kann.
Erste Ausgaben (nach stderr ausgegeben):
quelle
stdout
) tatsächlich nichts ausgegeben.HQ9 +, HQ9 ++ und ähnliche, 2 Zeichen
Dies ist die Ausgabe:
quelle
2^2^n
, wo das anfängliche Programm Generation 0 ist. Die Länge rekursiertm -> m^2
.n
wird die Ausgaben^n
. Das ist jedoch falsch; Wenn die Codelänge istn
, ist die Länge der Ausgaben^2
Rubin 27
Eine sehr leicht modifizierte Version davon ( via ):
Die Anzahl der
puts
Ausdrucke dieser Zeile wächst exponentiell.quelle
Lambda-Kalkül - 29
Ein einfacher Lambda-Ausdruck
Reduzierung dieser Laufzeit um eine Beta-Reduktionsrendite
Und so weiter und so fort. Es ist eine einfache Variante des Klassikers,
(λu.u u)(λu.u u)
die in der Lambda-Rechnung eine Quine darstellt. Durch die doppelte Selbstanwendung erhalten wir die doppelte Leistung.quelle
SH-Schrift, 9
Wächst exponentiell.
Entweder ausführen als
sh whatever.sh
oder als ausführbar festlegen.Windows-Version ist hier .
quelle
dc 11
Ziemlich einfach:
Die erste Zeile wird einmal pro Generation wiederholt:
Die letzte Zeile enthält die folgenden Anweisungen:
d
dupliziert den letzten auf dem Stapel (6579792) abgelegten Wert (damit wir bei jeder Ausführung eine weitere Kopie erhalten),f
druckt den gesamten Stapel (der ein Bündel derselben Nummer ist) undP
druckt die Nummer (6579792) als Byte-Stream aus, der als angezeigt wirddfP
.quelle
Redcode (rekursive Lösung)
Dies ist der Code des einfachsten Kriegers , der in Redcode geschrieben werden kann , des berühmten Wichtels :
Bei der Ausführung schreibt der Code eine Kopie seines einzelnen Befehls an die nächste Adresse im Speicher. dann führt es aus, etc.
quelle
Python 3 - 55
Dies könnte verkürzt werden, indem __ file__ durch einen Dateinamen mit einem einzelnen Zeichen ersetzt und die Datei als solche gespeichert wird. Ich war jedoch der Meinung, dass diese Antwort eher dem Sinn der Frage entspricht. Nach einer Iteration gibt es aus:
quelle
Smalltalk,
125 6157Die Golfversion sieht fast unleserlich aus, deshalb erkläre ich es zuerst (und verwende echte Bezeichner).
Dies ist eine Variante der selbstmodifizierenden Methode "Seltsamster Weg, um einen Stapelüberlauf zu erzeugen".
Die Methode druckt eine Hallo-Nachricht und ihre aktuelle Quelle aus (nur für die Demonstration). Anschließend wird der Code geändert, um eine längere Zeichenfolge auszugeben, und installiert. Schließlich wird der neue Code rekursiv aufgerufen.
Um mich vor einem sofortigen Durchgehen zu schützen, lässt es den Benutzer in jedem Zyklus bestätigen.
Kompiliere in Objekt:
Starten Sie die Show, indem Sie "eatMe_alice" an ein beliebiges Objekt senden. nichts wird tun:
nil eatMe_alice
Eine gute Variante besteht darin, den neuen Code nicht rekursiv, sondern iterativ aufzurufen, indem Sie den Aufrufstapel aufheben und erneut in die neue Methode eingeben. Dies hat den Vorteil, dass es nicht zu einer Rekursionsausnahme kommt. Ersetzen Sie dazu den rekursiven Aufruf ("self eatMe_alice") durch:
Golfen:
Offensichtlich wurde nicht nach Drucken und Selbstaufrufen gefragt, daher ist das kürzeste (für Golf), einfach einen Kommentar an meine eigene Quelle anzuhängen und ihn zurückzugeben. Als Nebeneffekt wird es auch für den nächsten Anruf installiert ...
quelle
SH-Skript,
1287Speichern Sie eine Datei mit
in ein eigenes, leeres Verzeichnis und starte von diesem Verzeichnis aus mit
sh [file]
oder setze executable.Alte Alternative mit 8 Zeichen , benötigt aber kein eigenes Verzeichnis. Speichern Sie eine Datei mit
und starte mit
sh [file]
oder setze executable.Alte Alternative mit 12 Zeichen :
Dies wird tatsächlich in die Programmdatei selbst ausgegeben, wobei jedoch nicht angegeben wurde, wo die Ausgabe erfolgen soll. Repliziert sich exponentiell.
quelle
ed
, die Manpage zu verwenden , und wollten sie nicht durchsehen ...JavaScript,
41, 40 ZeichenWenn Sie es zum ersten Mal ausführen, gibt es sich
;f()
am Ende selbst mit einem anderen aus . Nachfolgende Durchläufe der Ausgabe führen dazu, dass jede "Eingabe" -Quelle zweimal gedruckt wird.alert
wäre kürzer als,console.log
aber ich halte mehrere Warndialogfelder nicht für "die" Ausgabe, während es vernünftig erscheint, mehrere Zeilen in der Konsole als Ausgabe aufzurufen.quelle
"f(f())"
anstelle von"f();f()"
J , 1 Byte
Probieren Sie es online!
Das offene Zitat gibt offensichtlich den offenen Zitatfehler an:
Beachten Sie, dass die Fehler aufgrund der Art des J-Interpreters an STDOUT und nicht an STDERR ausgegeben werden.
Wenn das Obige als Code ausgeführt wird, wird Folgendes gedruckt:
Dann
und so weiter. Jedes Mal, wenn der Code ausgeführt wird, wird die zweite Zeile mit vier Bytes aufgefüllt
|
, um die Anforderung dieser Herausforderung zu erfüllen.J , richtige Quine-Variante, 25 Bytes
Probieren Sie es online!
Ausgänge
Und dann gibt es sich zweimal in separaten Zeilen aus:
dann
und so weiter.
Die erste Ausgabe ist eine einfache Variante von Standard-J-Quine . Die hinzugefügte
,:~
Verkettung erfolgt vertikal, wobei das resultierende 2D-Array als zwei Zeilen derselben Zeichenfolge gedruckt wird.quelle
Windows .BAT, 25
Wächst exponentiell.
Entsprechende SH-Version hier .
quelle
Retikular, 11 Bytes, nicht konkurrierend
Dies ist das Standard-Quine-Framework, mit der Ausnahme, dass
1
nach jeder Iteration ein zusätzliches gedruckt wird. Probieren Sie es online!Erste Ausgaben:
quelle
Mikroskript II, 6 Bytes
Nicht konkurrierende Sprache postdatiert die Herausforderung.
Die erste Iteration fügt
qp
dem Ende ein Extra hinzu , und jede nachfolgende Iteration fügt dem Anfang eine zusätzliche Kopie dieses ursprünglichen Programms hinzu.quelle
Runenverzauberungen , 6 Bytes
Probieren Sie es online!
Dieser war komisch. Alles, was ich tun musste, war ein von Jo King gefundenes
~
Quine zu entfernen .Jeder weitere Lauf hängt einen anderen
<
an das Ende an, zB:Alle machen nichts.
quelle
EcmaScript 6 (51 Byte):
Es produziert eine längere Version von sich selbst, die eine längere Version von sich selbst produzieren kann, die eine längere Version von sich selbst produzieren kann, usw. ...
quelle
PHP, 38
Bei jedem Lauf wird ein Semikolon hinzugefügt.
quelle
';'
. Dann würden Sie längere Ausgaben erhalten.<?=fgets(fopen(__FILE__,'r')).';';
?;<?echo fgets(fopen(__FILE__,'r'));
ECMAScript 6 (38 Zeichen)
Welche Ausgänge:
Bearbeiten
Sie könnten (28 Zeichen) tun:
Es wird jedoch unendlich oft wiederkehren und niemals irgendetwas zurückgeben ... aber dies kann gelöst werden, indem man so etwas macht (42 Zeichen):
Welches wird ausgegeben:
quelle
+_+ =_=
+1 für EmoticonsCommon Lisp, 16 Zeichen
(print `(or ,-))
Zugegeben, es ist nur interaktiv, aber in der Lage zu sein, auf das aktuelle Formular der obersten Ebene zu verweisen, ist wahrscheinlich die beste Möglichkeit, ein nicht triviales Programm zu minimieren, das der Spezifikation entspricht.
Was wirklich interessant wäre, ist das, was am schnellsten explodiert. Vielleicht sowas
(print `(progn ,@(loop repeat (length -) collect -)))
quelle
`
und,
?or
:(print -)
Julia, 66 Zeichen
Ausgabe (134 Zeichen):
Ergebnis der Ausführung des Ergebnisses (268 Zeichen):
nächstes Ergebnis (536 Zeichen):
Nächstes Ergebnis (1072 Zeichen):
Ich hoffe das entspricht den Regeln.
Es erzeugt eine größere Ausgabe und die Ausgabe selbst ist ein gültiger Quellcode, der wieder eine größere Ausgabe erzeugt.
quelle
05AB1E, 15 Byte, nicht konkurrierend
Probieren Sie es online!
Drucke
0"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý
,die druckt
0"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý
,etc.
quelle
DD
können durch ersetzt werdenÐ
.Evoloop, 9 × 9 Rechteck (81 Zellen)
Der in Golly enthaltene Evoloop-Zellularautomat unterstützt Muster, die sich "quineartig" nachbilden. Insbesondere enthalten diese Muster jeweils ein "Programm"; Ein Muster reproduziert sich, indem es zuerst das Programm ausführt (das den "Körper" der Tochter erzeugt) und dann das Programm in die Tochter kopiert.
Das Obige gilt sowohl für den bekannteren Zellularautomaten "Langton's Loops" als auch für Evoloop. Evoloop weist jedoch einen interessanten Unterschied auf: Es ist einfach, ein Muster zu erstellen, das in jeder nachfolgenden Generation wächst.
(Viel mehr interessant, meiner Meinung nach , ist die Tatsache , dass Evoloop ist ein einfacher zellulären Automaten , die Muster enthält , die sich selbst reproduzieren und in eine sehr getreuen Weise entwickeln! Ich denke , die einzigen bekannten zelluläre Automaten , die dies tun , sind Evoloop und seine Nachkommen Ein Nachteil von Evoloop besteht jedoch darin, dass es ein bestimmtes "bestes" Genom gibt, wobei die Evolution letztendlich immer zu diesem einen Genom konvergiert.
Diese Vorlage weist zwei Mängel auf. Eines ist, dass es nicht klar ist, was die "Ausgabe" eines zellularen Automaten ist. Aber ich denke, dass ein sich selbst reproduzierender Automat "nah genug" ist, um ein Quine zu sein; es ist sicherlich nicht weniger interessant! Das andere Manko ist, dass diese Muster nicht nur eine einzige Kopie von sich selbst erzeugen. Jede Kopie des ursprünglichen Musters versucht, unendlich viele Kopien von sich selbst zu erstellen, und diese Kopien interagieren letztendlich auf destruktive Weise miteinander. Ich glaube, ich habe die Anforderungen dieser Herausforderung im Geiste erfüllt, aber nicht im Buchstaben.
Ohne weiteres lautet das Muster:
Hier ist noch einmal das Muster in einem Format, das kopiert und in Golly eingefügt werden kann:
Okay, aber wie sieht es aus? Es sieht aus wie das:
In der obigen Animation können Sie sehen, wie das ursprüngliche Muster eine größere Tochter erzeugt, die eine größere Enkelin erzeugt, dann eine größere Urenkelin und schließlich eine noch größere Ur-Ur-Enkelin, die beginnt, eine noch größere dritte Ur-Ur-Tochter zu konstruieren. Enkelin. Wenn Sie dieses Muster für eine lange Zeit durchlaufen würden, würde es für immer so weitergehen (oder vielleicht würden sie irgendwann von den weiterentwickelten Organismen überholt werden, die sich viel schneller reproduzieren können; ich bin mir nicht sicher).
quelle
BATCH, 26
Fügen Sie diesen Code in eine beliebige .bat-Datei ein, und die Ausführung wird fortgesetzt (in einer Endlosschleife), und die Datei wächst ebenfalls.
quelle
%0
ist der Befehl zum Aufrufen des Skripts, das möglicherweise keine.BAT
Erweiterung hat. Mit können%~nx0
Sie den vollständigen Dateinamen der Stapeldatei abrufen..bat
ausgeführt werden. Wenn der Dateiname lautetexecute.bat
, können Sie entwederexecute
oder eingebenexecute.bat
. Beides wird funktionieren..bat
Erweiterung auszuführen , aber Sie können die Erweiterung weglassen , wenn Sie es ausführen (wenn Sie einen Befehl ohne Erweiterung eingeben, versucht Windows.com
,.exe
dann.bat
in dieser Reihenfolge). Wenn der Dateiname lautethello.bat
,>> %0
wird eine Datei mit dem Namen geschriebenhello
, die nicht das Original isthello.bat
(und nicht ausgeführt werden kann).PYG (6)
Gibt den eigenen Quellcode aus, getrennt durch Zeilenumbrüche. Die zweite Generation wäre
und so weiter.
quelle
OIL , 83 Bytes
Es werden zuerst zwei Zeilen mit einer Null gedruckt und dann jede Zeile mit Zeile 1 verglichen. Wenn sie gleich sind (was der Fall ist, wenn die Datei erschöpft ist), wird gedruckt, was sich in Zelle 26 befindet. Die resultierende Ausgabe sieht wie folgt aus: das gleiche, außer mit einem hinzugefügten
33
, der nichts tut. Nächstes Mal wird eine weitere Zeile hinzugefügt und so weiter.quelle
Hilfe, WarDoq! 1 Byte.
Druckt
Hello, World!
.Andere Zeichen als H sind gültiger (und sicherer) Quellcode (der andere Varianten von Hello World druckt).
quelle