Auto cycler quine


11

Fai un quine ma con una svolta.

dichiarazione

Il quine stampa il suo codice ma mette il suo primo carattere alla fine.
(Puoi farlo al contrario ma includi quella nota nella tua risposta)
L'output deve quindi essere un programma che è anche una soluzione.

Esempio: supponiamo che il tuo codice fosse foobar, eseguendolo verrà restituito oobarfquale sarà un altro programma valido.

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

Regole

  • Il tuo codice non deve essere un output di una generazione del codice di qualcun altro che ovviamente ruba
  • Il codice deve contenere più di 2 caratteri (quindi il codice funzione non è divertente)
  • Il tuo codice deve contenere almeno due caratteri diversi (es: +++non è valido)

punteggio

Come una sfida di vince il codice più corto.



3
@DomHastings Hai avuto mesi per pubblicarlo.
mbomb007,

2
@ IQuick143 Penso che> 2 personaggi siano un buon requisito per il motivo che hai dichiarato
dylnan,

5
Sarebbe questo conta come un 'Quine rotante'? ; p
Kevin Cruijssen il

3
@ mbomb007 Trovare una lingua in cui questo è possibile è parte della sfida
IQuick 143,

Risposte:


19

Befunge-98 (PyFunge) , 2600 byte

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 qe ,
Problema : nessuno di questi simboli è un buon punto di partenza soprattutto da allora @e qtermina immediatamente il programma.
Soluzione : sbarazzarsi di quei caratteri nel codice sorgente

Problema : come?
Soluzione : utilizzare i pcomandi (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 gcomando che sta tradendo.

Problema : (sospiro quando finiranno)
Un comando put apre 3 valori n x yche 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 :
Un'immagine vale 1000 parole che dicono.  Quindi hanno creato Piet.

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 0che 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: Codice

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);

Non vedo davvero l'ora di avere una spiegazione completa, ma questo sembra un bel risultato e merita sicuramente la generosità!
Nathaniel,

1
@Nathaniel Ecco la spiegazione completa spero che ti piaccia! : D
IQuick 143

1
Quella parte del trattare con pargomenti errati è geniale.
leo3065,

@ leo3065 Grazie :)
IQuick 143

@lQuick davvero lo faccio!
Nathaniel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.