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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Provalo online!
Questo è stato un inferno.
Come funziona:
il programma è un insieme di istruzioni put che assembla un programma B attorno a se stesso che quindi stampa metà del byte di origine spostato due volte.
Il programma è in realtà 2 copie di un programma da 1300 byte, questo è quindi garantito che l'intero programma da 1300 byte venga sempre eseguito nel suo insieme.
Spiegazione migliore:
ogni quine di Befunge-98 deve contenere simboli come @
o q
e ,
Problema : nessuno di questi simboli è un buon punto di partenza soprattutto da allora @
e q
termina immediatamente il programma.
Soluzione : sbarazzarsi di quei caratteri nel codice sorgente
Problema : come?
Soluzione : utilizzare i p
comandi (put) per modificare il codice sorgente in modo da includere i caratteri richiesti che stamperanno i contenuti del codice sorgente spostati di un byte e non utilizzare il g
comando che sta tradendo.
Problema : (sospiro quando finiranno)
Un comando put apre 3 valori n x y
che determinano carattere, x-coord, y-coord tuttavia quando l'inizializzazione di questi valori è divisa a metà può scrivere caratteri cattivi nel codice sorgente iniziale rendendolo inutile per quining.
Soluzione : (l'ultimo che prometto)
Usa 2 copie del codice sorgente, quest'ultimo è "corretto" questo risolve accidentalmente un altro problema che è che un'istruzione put (comando p + gli inizializzatori costanti) che è divisa a metà sarà non eseguito, questo viene risolto avendo 2 copie di ogni istruzione. L'ultima cosa che deve funzionare è come rendere l'intero codice sorgente della metà?
Risposta :
Questa è una prova visiva del perché due copie di una stringa di byte spostata == Due copie di una stringa di byte spostata. Ciò significa che possiamo prendere metà del codice, spostarlo a byte, quindi stamparlo due volte (OPPURE prendere metà del codice, spostarlo a byte, stampare, ripetere [Questo è ciò che accade effettivamente])
Come viene implementato : supponiamo che 0123456789abcdef sia l'origine
Pseudocodice Befunge:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS significa Print Stack (non una vera istruzione). Spingiamo la metà del codice sorgente in ordine inverso sullo stack usando ""
quindi stampiamo lo stack e quindi recuperiamo ( '
comando) il primo carattere 0
che spostiamo davanti '
e lo stampiamo per ultimo che causa lo spostamento di byte, quindi ripetiamo il ciclo ancora una volta per stampare la seconda copia. Un tecnicismo da affrontare sono i simboli all'interno del sorgente, questo può causare problemi se lo scriviamo durante l'esecuzione del codice sorgente, ho aggirato questo aggiungendo più dichiarazioni put che si occupano esternamente di esso.
Questo rende il codice simile al seguente:
Spiegazione :
Evidenziazione verde: codice che si occupa dell'aggiunta di caratteri nell'origine
Lettere grigie (scusa per la scarsa visibilità dei probi): Codice che viene aggiunto dal codice verde
Evidenziazione rossa: Codice che sposta il primo carattere della seconda metà del codice sorgente nell'area Blu .
Evidenziazione blu: vedere Evidenziazione rossa Evidenziazione
arancione: codice che assicura che terminiamo dopo aver scritto copie spostate a 2 byte inserendo un @
comando (termina) nell'area gialla.
Si spera che le frecce rendano più chiaro come va il flusso del codice.
Ecco l'ultima parte difficile: da
dove viene il codice sorgente dei bambini ?
Risposta breve: C # Magic
Risposta lunga: 100+ frammenti di codice Befunge realizzati a mano compilati dal codice C #. Ho scritto manualmente circa 100 inizializzatori costanti (un pezzo di codice befunge che spinge un certo numero per impilarli) a mano e quindi ho usato un programma C # personalizzato per compilarlo nell'output Befunge da 1300 byte, che poi copiavo incollato due volte e ho fatto il finale programma.
Sei ancora qui? Grazie mille per aver letto! (o almeno scorrendo fino alla fine)
Spero che le mie brutte battute siano state divertenti e non fastidiose.
Nota: nessuna istruzione put in questo codice crea un comando ag che sarebbe barare.
EDIT: ho verificato il codice utilizzando il seguente codice Javascript in TIO utilizzando strumenti di sviluppo
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);