Dieses 128-sprachige Quine Ouroboros (ein Programm, das ein Programm in einer anderen Sprache ausgibt, das ein Programm in einer weiteren Sprache ausgibt (125 Sprachen später), das das ursprüngliche Programm ausgibt) ist ziemlich beeindruckend. Leider hat es eine statische Anzahl von Iterationen.
Schreiben Sie ein Programm, das ein Programm ausgibt (nicht unbedingt in einer anderen Sprache, aber es kann sein), das ein Programm ausgibt, das ein Programm ausgibt usw., das nach n Iterationen das ursprüngliche Programm zum ersten Mal ausgibt (dh kein Zwischenprodukt) Das Programm sollte mit dem Original identisch sein, da sonst ein Quine funktionieren würde, der seine Eingabe ignoriert. Dabei ist n eine nicht negative Ganzzahl, die als Eingabe bereitgestellt wird. Die Eingabe kann nicht nur eine Zahl im ursprünglichen Quellcode sein (z. B. x = <the value of n>
beim Start Ihres Programms), sondern sollte eine der folgenden sein:
- Als Befehlszeilenargument übergeben
- Lesen Sie von der Standardeingabe
- Als Argument an eine Funktion übergeben, die das neue Programm zurückgibt / ausgibt.
Für Zwischenstufen im Ouroboros kann Ihr Programm entweder ein voll funktionsfähiges Programm oder eine Funktion ohne Argumente sein, die beim Aufruf das nächste zurückgibt / ausgibt.
Sie können möglicherweise nicht aus der Quelldatei selbst lesen oder quine-ähnliche integrierte Funktionen verwenden (ich glaube nicht, dass es solche gibt, die dies tun würden, aber möglicherweise).
Um klar zu sein, sollte n = 0
das Programm seinen eigenen Quellcode ausgeben.
Wenn n = 1
, sollte das Programm ein anderes Programm ausgeben, das den ursprünglichen Quellcode ausgibt.
Und so weiter...
Wenig Bytes gewinnen!
Bearbeiten:
Ich hätte schreiben sollen: "Für Zwischenstufen im Ouroboros kann Ihr Programm entweder ein voll funktionsfähiges Programm ohne Eingabe oder eine Funktion ohne Argumente sein." Wenn Ihr Programm das nächste in der Kette ausgibt und dann auf die Eingabe wartet, ist das in Ordnung, aber Ihr Programm sollte nicht den ursprünglichen Wert von n benötigen.
getInput()
ohne Eingabe verwendet wird. Oder können wir sagen, wir geben etwas Zufälliges ein, das für spätere Iterationen nicht verwendet wird, um Fehler für das zu vermeidengetInput()
? Aka ist die aktuelle Python-Antwort gültig?n
ein Programm ausgeben müssen, das das "Anfangsprogramm" einer Ouroboros-Reihe vonn
Iterationen ist, und dass unsere Antwort nicht als eine dern
Iterationen gelten sollte. Ist das richtig?Antworten:
05AB1E , 28 Bytes
-4 Bytes + Fix dank Kevin Cruijssen
Probieren Sie es online aus!
Erläuterung
Dies funktioniert, indem die verbleibende Nummer zum Drucken an die Vorderseite des Codes angehängt wird. Dies bedeutet, dass sie dem Stapel wie eine Eingabe hinzugefügt wird. Im Basisfall der Eingabe von "0" wird die 0 auf der Vorderseite nicht verkettet.
quelle
d
ist nicht negativ (>=0
) statt positiv (>0
). Das Problem ist, dass Sie zum Überprüfen,d
ohne es zu knallen, es zuerst duplizieren müssen, dann aber auch bei der Iteration verworfen werden müssen0"quinsting"
, da sonst das Duplizierte ausgegeben wird0
. :("34çìD«s<©di®ì"34çìD«s<©di®ì
für 28 Bytes vielleicht (was immer noch ziemlich nah an Ihrem beabsichtigten Ansatz ist)? (Ich bin die aktuelle Version für Iteration Angst0"34çìD«s<Ddiì"34çìD«s<Ddiì
Ausgänge-1
vomD
uplicate ..)Runenverzauberungen , 39 Bytes
Probieren Sie es online aus!
Wäre 4 Bytes kürzer als 05AB1E mit der gleichen Taktik, wenn Eingaben kleiner oder gleich wären
10
. Da wir jedoch beliebig große Werte unterstützen müssen, wird es komplizierter.Der numerische Wert von
n
wird vorne platziert und als fortlaufendes Zahlenliteral mit analysiert´
."3X4+kSq
ist der grundlegende Quine-Code. Wenn vorne kein Wert vorhanden ist, beträgt die Stapellänge nur 1 (die Quine), andernfalls 2, damitl1=d*?
festgelegt werden kann, wie die Dinge von dort aus zu handhaben sind.Wenn es einen Wert gibt, wird ausgeführt
S:1-}'LA2+-}
: Tauschen Sie den Wert nach oben aus, subtrahieren Sie 1, duplizieren Sie ihn, lassen Sie eine Kopie am unteren Rand des Stapels, und erhalten Sie das Protokoll 10 dieses Werts mal 100 (was zur eigenen Zeichenlänge des Werts plus führt 1 für die´
), entfernen Sie so viele Zeichen vom Ende der Zeichenfolge (schneiden Sie sich effektiv vom Ende ab, sowohl dort , wo es nicht benötigt wird, als auch weil es den falschen Wert hat).C
ist ein Byte kürzer als2+
und ergibt den gleichen Wert.Wenn es keinen Wert gibt, lesen Sie einen von der Eingabe.
Unabhängig davon:
:0)2*?
duplizieren und mit Null vergleichen.Wenn nicht Null drücken
´
.Wenn Null, geben Sie den Wert ein. Wir können mit
!
anstelle von2?
und speichern ein Byte betrügen, da beim´
Versuch, das erste Byte auszuführen, es nicht numerisch ist und sofort an derselben Position den Zahlenmodus verlässt.Drucken Sie den gesamten Stapel von oben nach unten.
quelle
Java 10, 145 Bytes
Probieren Sie es online aus und sehen Sie sich die Ergebnisse einiger Iterationen an .
Erläuterung:
quine Erklärung:
var s
enthält den unformatierten Quellcode%s
wird verwendet, um diesen String mit sich selbst in sich zu setzens.format(...)
%c
,,%1$c
und34
werden zum Formatieren der doppelten Anführungszeichen verwendets.format(s,34,s)
fasst alles zusammenHerausforderungsteil:
Die erste Lambda-Funktion nimmt eine
long
Eingabe als Parameter.Long N=n;
in der ersten Iteration als Variable festgelegt . OderLong N=%s;
für die nächsten Iterationen.N>0?N-1+"L":"n"
füllt dies%s
mit einem WertN-1
, an den angehängt wird,L
da es lang ist, und konvertiert es in einen String für das%s
, wennN
es größer als 1 ist. WennN
stattdessen 0 ist (anfängliche Eingabe war0
oder dies ist die letzte Iteration des Interquine- ' loop '), dies wird stattdessen%s
mit der Initiale gefülltn
.quelle
long
Funktionsparameter, und die anderen Lambda-Funktionen verwenden einen nicht verwendetenVoid
Parameter , den ich auch immer für Herausforderungen verwende, bei denen angegeben wird, dass keine Eingabe erforderlich ist, dav->
1 Byte kürzer als ist()->
.Haskell ,
195164 BytesProbieren Sie es online aus!
Dies verwendet eine ziemlich einfache Quine-Technik. Wir modifizieren es mit einer Variablen,
a
die auf eine Zahl gesetzt ist. Wenn diese Zahl Null ist (was am Anfang steht), nehmen wir die Eingabe und geben unsere Quelle aus, wobeia
die Eingangsnummer eingestellt ist. Wenna
nicht Null ist, geben wir unsere Quelle mita
einem Wert weniger aus. Auf diese Weise wirda
bis zur Ausgabe der Originalquelle auf Null heruntergezählt.quelle
Gelee ,
2220 BytesProbieren Sie es online aus!
Versuchen Sie es mit wiederholten Codeaufrufen
quelle
R , 92 Bytes
Probieren Sie es online aus!
Wenn dies
deparse
als Betrug angesehen wird, ist hier eine Alternative:R 108 Bytes
Probieren Sie es online aus!
quelle
Perl 6 , 44 Bytes
Probieren Sie es online aus!
Übernimmt die Eingabe über die Standardeingabe und gibt ein Programm zurück, bei dem nur die erste Zahl geändert wird. Jedes nachfolgende Programm gibt dann dasselbe Programm aus, außer dass diese Nummer dekrementiert ist.
quelle
C # (Visual C # Interactive Compiler) , 112 Byte
Dank @NickKennedy viele Bytes gespart!
Probieren Sie es online aus!
quelle
n
s haben, diel
s sein sollten. Wie wäre es mit tio.run/##Sy7WTS7O/P@/…Python 3.8 (Vorabversion) ,
60565553 ByteProbieren Sie es online aus!
-2 Bytes dank Jo King
Ab der 53-Byte-Version funktioniert auch in Python 2 und Python 3.
quelle
:=
ist eine willkommene Ergänzung zu Python, das ist sicher.:=