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 q
und enthalten. ,
Problem : Keines dieser Symbole ist ein guter Ausgangspunkt, insbesondere seit @
und q
beenden 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 g
betrügerischen Befehl.
Problem : (seufz wann werden diese enden)
Ein Befehl put setzt 3 Werte, n x y
die 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 :
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), 0
das 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:
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);