Auto Cycler Quine

11

Machen Sie eine Quine, aber mit einer Wendung.

Erklärung

Das Quine druckt seinen Code, setzt aber sein erstes Zeichen am Ende.
(Sie können dies in umgekehrter Reihenfolge tun, aber diese Notiz in Ihre Antwort aufnehmen.)
Die Ausgabe muss dann ein Programm sein, das auch eine Lösung darstellt.

Beispiel: Angenommen, Ihr Code wurde beim foobarAusführen zurückgegeben, oobarfwas ein weiteres gültiges Programm ist.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

Regeln

  • Ihr Code darf keine Ausgabe einer Generation von Code eines anderen sein, der ganz offensichtlich stiehlt
  • Ihr Code muss länger als 2 Zeichen sein (Kurzcode macht also keinen Spaß)
  • Ihr Code muss mindestens zwei verschiedene Zeichen enthalten (Beispiel: +++ist ungültig)

Wertung

Als Herausforderung gewinnt der kürzeste Code.

IQuick 143
quelle
2
Nun, das ist ärgerlich
Dom Hastings
3
@ DomHastings Du hattest Monate, um das zu posten.
mbomb007
2
@ IQuick143 Ich denke,> 2 Zeichen ist eine gute Voraussetzung für den Grund, den Sie angegeben haben
Dylnan
5
Würde dies als "rotierende Quine" gelten? ; p
Kevin Cruijssen
3
@ mbomb007 Eine Sprache zu finden, in der dies möglich ist, ist ein Teil der Herausforderung
IQuick 143

Antworten:

19

Befunge-98 (PyFunge) , 2600 Bytes

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Probieren Sie es online aus!

Das war ein Höllenfest.

So funktioniert das:
Das Programm besteht aus einer Reihe von put-Anweisungen, die ein Programm B um sich zusammensetzen, das dann die Hälfte des zweimal verschobenen Quellbytes druckt.
Das Programm besteht eigentlich aus 2 Kopien eines 1300-Byte-Programms. Auf diese Weise wird sichergestellt, dass das gesamte 1300-Byte-Programm immer als Ganzes ausgeführt wird.

Bessere Erklärung:
Jedes Befunge-98-Quine muss Symbole wie @oder qund enthalten. ,
Problem : Keines dieser Symbole ist ein guter Ausgangspunkt, insbesondere seit @und qbeenden Sie das Programm sofort.
Lösung : Entfernen Sie diese Zeichen im Quellcode

Problem : Wie?
Lösung : Verwenden Sie p(put) -Befehle, um den Quellcode so zu ändern, dass er die erforderlichen Zeichen enthält, mit denen die um ein Byte verschobenen Inhaltsstoffe des Quellcodes gedruckt werden, und verwenden Sie nicht den gbetrügerischen Befehl.

Problem : (seufz wann werden diese enden)
Ein Befehl put setzt 3 Werte, n x ydie das Zeichen, die x-Koordinate und die y-Koordinate bestimmen. Wenn die Initialisierung dieser Werte jedoch in zwei Hälften geteilt wird, können im Anfang des Quellcodes fehlerhafte Zeichen geschrieben werden, wodurch sie unbrauchbar werden zum quining.
Lösung : (letzte, die ich verspreche)
Verwenden Sie 2 Kopien des Quellcodes, wobei die letztere die "richtige" ist. Dies behebt versehentlich ein weiteres Problem, nämlich eine put-Anweisung (p-Befehl + die konstanten Initialisierer), die in zwei Hälften geteilt wird nicht ausgeführt werden, dies wird behoben, indem 2 Kopien jeder Anweisung vorhanden sind. Das Letzte, was funktionieren muss, ist, wie wir den gesamten Quellcode aus einer halben machen.

Antwort :
Ein Bild sagt mehr als 1000 Worte.  Dann machten sie Piet.

Dies ist ein visueller Beweis dafür, warum zwei Kopien eines String-Bytes verschoben wurden == Zwei Kopien eines Byte-verschobenen Strings. Das heißt, wir können die Hälfte des Codes nehmen, ihn byteverschieben und dann zweimal drucken (ODER die Hälfte des Codes nehmen, byteverschieben, drucken, wiederholen [das passiert tatsächlich]).

So wird dies implementiert : Angenommen, 0123456789abcdef ist die Quelle

Befunge Pseudocode:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS bedeutet Print Stack (keine echte Anweisung). Wir schieben die Hälfte des Quellcodes rückwärts auf den Stapel, indem ""wir dann den Stapel drucken und dann 'das erste Zeichen abrufen ( befehlen), 0das wir vor das verschieben, 'und es zuletzt drucken, was die Byteverschiebung verursacht, und dann den Zyklus wiederholen noch einmal, um die zweite Kopie zu drucken. Eine technische Besonderheit sind die Symbole in der Quelle. Dies kann zu Problemen führen, wenn wir sie während der Ausführung des Quellcodes schreiben. Ich habe dies umgangen, indem ich weitere put-Anweisungen hinzugefügt habe, die sich extern darum kümmern.

Dadurch sieht der Code ungefähr so ​​aus: Code

Erläuterung :
Grünes Highlight: Code, der sich um das Hinzufügen von Zeichen zur Quelle
kümmert Graue Buchstaben (Probleme mit schlechter Sichtbarkeit Entschuldigung): Code, der durch grünen Code hinzugefügt wird
Rotes Highlight: Code, der das erste Zeichen der zweiten Hälfte des Quellcodes in den blauen Bereich verschiebt .
Blaue Markierung: Siehe Rote Markierung
Orange Hervorhebung: Code, der sicherstellt, dass wir nach dem Schreiben von 2-Byte-verschobenen Kopien beendet werden, indem ein @Befehl (Beenden) in den gelben Bereich eingefügt wird .

Pfeile sollten hoffentlich klarer machen, wie der Code-Fluss verläuft.

Hier kommt der letzte schwierige Teil: Woher kommt der Quellcode für Babys ?

Kurze Antwort: C # Magic
Lange Antwort: 100+ Befunge-Code-Schnipsel, die von Hand erstellt wurden und von C # -Code zusammengestellt wurden. Ich habe manuell ungefähr 100 konstante Initialisierer (ein Stück befunge-Code, der eine bestimmte Zahl zum Stapeln drückt) von Hand geschrieben und dann ein benutzerdefiniertes C # -Programm verwendet, um es in die 1300-Byte-Befunge-Ausgabe zu kompilieren, die ich dann zweimal kopierte und das Finale machte Programm.

Bist du noch da? Vielen Dank fürs Lesen! (oder zumindest bis zum Ende scrollen)
Ich hoffe, meine schlechten Witze haben Spaß gemacht und waren nicht nervig.

Hinweis: Keine put-Anweisung in diesem Code erzeugt einen ag-Befehl, der betrügen würde.

BEARBEITEN: Ich habe den Code mit dem folgenden Javascript-Code in TIO mithilfe von Entwicklertools überprüft

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);
IQuick 143
quelle
Ich freue mich sehr auf die vollständige Erklärung, aber dies scheint eine ziemliche Leistung zu sein und verdient auf jeden Fall das Kopfgeld!
Nathaniel
1
@ Nathaniel Da geht die volle Erklärung, hoffe es gefällt euch! : D
IQuick 143
1
Dieser Teil über den Umgang pmit falschen Argumenten ist genial.
Leo3065
@ leo3065 Danke :)
IQuick 143
@lQuick in der Tat ich tue!
Nathaniel