Ouroboros Quine auf n-Ebene


11

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:

  1. Als Befehlszeilenargument übergeben
  2. Lesen Sie von der Standardeingabe
  3. 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 = 0das 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.



Können wir 1 Index n? Also bedeutet n = 1 Druckquellcode, n = 2 bedeutet Druckcode, der Quellcode usw. druckt.
Abgelaufene Daten

1
Werden die Iterationsversionen noch die anfängliche Eingabe haben? Nehmen wir also an, meine erste Eingabe ist 3, und ich führe das ausgegebene Programm aus. Wird es noch einen Eingang 3 geben oder überhaupt keinen Eingang? Wenn es keine Eingabe gibt, müssen wir das wohl erledigen, falls so etwas 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 vermeiden getInput()? Aka ist die aktuelle Python-Antwort gültig?
Kevin Cruijssen

Ich vermute, dass wir bei einer Ganzzahl nein Programm ausgeben müssen, das das "Anfangsprogramm" einer Ouroboros-Reihe von nIterationen ist, und dass unsere Antwort nicht als eine der nIterationen gelten sollte. Ist das richtig?
Erik der Outgolfer

@ KevinCruijssen Ich hätte das wahrscheinlich klarer sagen sollen. Die Zwischenstufen können in keiner Form eingegeben werden. Ich denke, wenn das Programm das nächste ausgibt und dann auf die Eingabe wartet, wäre das in Ordnung.
Leo Tenenbaum

Antworten:


5

05AB1E , 28 Bytes

-4 Bytes + Fix dank Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

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.


dist nicht negativ ( >=0) statt positiv ( >0). Das Problem ist, dass Sie zum Überprüfen, dohne es zu knallen, es zuerst duplizieren müssen, dann aber auch bei der Iteration verworfen werden müssen 0"quinsting", da sonst das Duplizierte ausgegeben wird 0. :(
Kevin Cruijssen

"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 Angst 0"34çìD«s<Ddiì"34çìD«s<DdiìAusgänge -1vom Duplicate ..)
Kevin Cruijssen

4

Runenverzauberungen , 39 Bytes

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

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 nwird vorne platziert und als fortlaufendes Zahlenliteral mit analysiert ´. "3X4+kSqist der grundlegende Quine-Code. Wenn vorne kein Wert vorhanden ist, beträgt die Stapellänge nur 1 (die Quine), andernfalls 2, damit l1=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). Cist ein Byte kürzer als 2+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 von 2?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.


3

Java 10, 145 Bytes

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Probieren Sie es online aus und sehen Sie sich die Ergebnisse einiger Iterationen an .

Erläuterung:

Erklärung:

  • Das var senthält den unformatierten Quellcode
  • %s wird verwendet, um diesen String mit sich selbst in sich zu setzen s.format(...)
  • %c,, %1$cund 34werden zum Formatieren der doppelten Anführungszeichen verwendet
  • s.format(s,34,s) fasst alles zusammen

Herausforderungsteil:

Die erste Lambda-Funktion nimmt eine longEingabe als Parameter.

  • Dies wird Long N=n;in der ersten Iteration als Variable festgelegt . Oder Long N=%s;für die nächsten Iterationen.
  • Die ternäre Prüfung N>0?N-1+"L":"n"füllt dies %smit einem Wert N-1, an den angehängt wird, Lda es lang ist, und konvertiert es in einen String für das %s, wenn Nes größer als 1 ist. Wenn Nstattdessen 0 ist (anfängliche Eingabe war 0oder dies ist die letzte Iteration des Interquine- ' loop '), dies wird stattdessen %smit der Initiale gefüllt n.

Die Spezifikation besagt, dass Zwischenausgaben ein vollständiges Programm oder eine Funktion ohne Argumente sein müssen
Verkörperung der Ignoranz

@EmbodimentofIgnorance Ich weiß, das habe ich. Die erste Lambda-Funktion verwendet einen longFunktionsparameter, und die anderen Lambda-Funktionen verwenden einen nicht verwendeten VoidParameter , den ich auch immer für Herausforderungen verwende, bei denen angegeben wird, dass keine Eingabe erforderlich ist, da v->1 Byte kürzer als ist ()->.
Kevin Cruijssen

2

Haskell , 195 164 Bytes

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Probieren Sie es online aus!

Dies verwendet eine ziemlich einfache Quine-Technik. Wir modifizieren es mit einer Variablen, adie auf eine Zahl gesetzt ist. Wenn diese Zahl Null ist (was am Anfang steht), nehmen wir die Eingabe und geben unsere Quelle aus, wobei adie Eingangsnummer eingestellt ist. Wenn anicht Null ist, geben wir unsere Quelle mit aeinem Wert weniger aus. Auf diese Weise wird abis zur Ausgabe der Originalquelle auf Null heruntergezählt.




1

Perl 6 , 44 Bytes

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

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.


1

C # (Visual C # Interactive Compiler) , 112 Byte

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Dank @NickKennedy viele Bytes gespart!

Probieren Sie es online aus!


Die Zwischenausgaben sind weder ein vollständiges Programm noch eine Funktion, die ein einzelnes Argument akzeptiert. Ich denke auch, dass Sie einige ns haben, die ls sein sollten. Wie wäre es mit tio.run/##Sy7WTS7O/P@/…
Nick Kennedy

1

Python 3.8 (Vorabversion) , 60 56 55 53 Byte

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Probieren Sie es online aus!

-2 Bytes dank Jo King

Ab der 53-Byte-Version funktioniert auch in Python 2 und Python 3.


Die Zwischenfunktion scheint kein vollständiges Programm oder eine Funktion zu sein, die keine Argumente akzeptiert.
Nick Kennedy

Dieser Walross-Operator :=ist eine willkommene Ergänzung zu Python, das ist sicher.
mbomb007

"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."
mbomb007

@NickKennedy Aktualisiert, um der Spezifikation zu entsprechen, und zufällig 4 Bytes gespeichert.
negative sieben

1
53 Bytes ohne Verwendung:=
Jo King
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.