Ouroboros Qu-level di livello n


11

Questo ouroboros di quine a 128 lingue (un programma che genera un programma in un'altra lingua, che genera un programma in un'altra lingua (125 lingue dopo), che genera il programma originale) è piuttosto impressionante. Sfortunatamente, ha un numero statico di iterazioni.

Scrivere un programma che emette un programma (non necessariamente in un'altra lingua, ma può essere), che emette un programma, che emette un programma, ecc., Che dopo n iterazioni, emette il programma originale per la prima volta (cioè nessun intermedio programma dovrebbe essere lo stesso dell'originale, perché altrimenti un quine che ignora il suo input funzionerebbe), dove n è un intero non negativo fornito come input. L'input non può essere solo un numero nel codice sorgente originale (es. Mettere x = <the value of n>all'inizio del programma), dovrebbe essere uno dei seguenti:

  1. Passato come argomento della riga di comando
  2. Leggi da input standard
  3. Passato come argomento a una funzione, che restituisce / genera il nuovo programma.

Per le fasi intermedie in ouroboros, il tuo programma può essere un programma perfettamente funzionante o una funzione senza argomenti, che, quando chiamato, restituirà / emetterà il successivo.

Potresti non leggere dal file sorgente stesso o utilizzare qualsiasi builtin simile a un quine (non credo che ce ne siano alcuni che lo farebbero, ma potrebbe esserci)

Per essere chiari, se n = 0, il programma dovrebbe generare il proprio codice sorgente.

Se n = 1, il programma dovrebbe generare un programma diverso, che genera il codice sorgente originale.

E così via...

Vince il minor numero di byte!

Modificare:

Avrei dovuto scrivere "Per le fasi intermedie dei nostrioboros, il tuo programma può essere un programma perfettamente funzionante senza input o una funzione senza argomenti". Se il tuo programma genera quello successivo nella catena, quindi attende l'input, va bene, ma il tuo programma non dovrebbe aver bisogno del valore originale di n.



Possiamo 1 indice n? Quindi n = 1 significa stampa codice sorgente, n = 2 significa stampa codice che stamperà il codice sorgente ecc.
Dati scaduti

1
Le versioni di iterazione avranno ancora l'input iniziale? Supponiamo quindi che il mio primo input sia 3 e che esegua il programma in uscita. Ci sarà ancora un input 3 o nessun input? Se non ci sono input, immagino che dobbiamo gestirli nel caso in cui qualcosa di simile getInput()venga usato senza alcun input fornito. Oppure possiamo dire di inserire qualcosa di casuale che non viene utilizzato per le iterazioni successive, per evitare errori per getInput()? Aka è valida la risposta attuale di Python?
Kevin Cruijssen,

Ho il sospetto che ciò che ci viene chiesto di fare sia, dato un numero intero n, produrre un programma che sia il "programma iniziale" di un quorino di niterazioni e che la nostra risposta non dovrebbe essere considerata come una delle niterazioni. È corretto?
Erik the Outgolfer,

@KevinCruijssen Probabilmente avrei dovuto essere più chiaro al riguardo. Le fasi intermedie non possono avere input in nessuna forma. Immagino che se il programma emette il successivo e quindi attende l'input, andrebbe bene.
Leo Tenenbaum,

Risposte:


5

05AB1E , 28 byte

-4 byte + correzione grazie a Kevin Cruijssen

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

Provalo online!


Spiegazione

Funziona aggiungendo il numero rimanente per la stampa nella parte anteriore del codice, il che significa che viene aggiunto allo stack nello stesso modo in cui un input sarebbe. Nel caso base di input di "0" non concatenerà lo 0 sul fronte.


dè non negativo ( >=0) anziché positivo ( >0). Il problema è che per verificare dsenza spuntarlo, devi prima duplicarlo, ma poi devi anche scartarlo durante l'iterazione 0"quinsting", altrimenti produrrà il duplicato 0. :(
Kevin Cruijssen,

"34çìD«s<©di®ì"34çìD«s<©di®ìforse per 28 byte (che è ancora abbastanza vicino all'approccio previsto)? (Temo la versione corrente di iterazione 0"34çìD«s<Ddiì"34çìD«s<Ddiìuscite -1dalla Duplicate ..)
Kevin Cruijssen

4

Incantesimi runici , 39 byte

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

Provalo online!

Sarebbe 4 byte più corto di 05AB1E usando la stessa tattica se gli input fossero inferiori o uguali a 10. Ma poiché dobbiamo supportare valori arbitrariamente grandi, diventa più complicato.

Il valore numerico di nviene posizionato nella parte anteriore e analizzato come un numero continuo usando letteralmente ´. "3X4+kSqè il codice quine di base. Se non è presente alcun valore nella parte anteriore, la lunghezza dello stack sarà solo 1 (il quine), altrimenti 2 consentirà di l1=d*?determinare come gestire le cose da lì.

  • Se esiste un valore, S:1-}'LA2+-}esegue: scambia il valore in alto, sottrai 1, duplicalo, lasciando una copia in fondo alla pila, ottieni il Registro 10 di quel valore per 100 (risultante nella lunghezza del carattere del valore, più 1 per il ´), rimuovi quel numero di caratteri dalla fine della stringa (troncandosi efficacemente dalla fine, sia dove non è necessario sia perché ha un valore errato). Cè un byte più corto di 2+e risulta nello stesso valore.

  • Se non esiste un valore, leggerne uno dall'input.

Indipendentemente da ciò: :0)2*?duplicare e confrontare con zero.

  • Se spinta diversa da zero ´.

  • Se zero, fai apparire il valore. Possiamo imbrogliare usando !invece di 2?e salvare un byte perché quando ´tenta di eseguire il primo byte che vede è non numerico e immediatamente esce dalla modalità numerica nella stessa posizione.

Stampa l'intera pila dall'alto verso il basso.


3

Java 10, 145 byte

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

Provalo online e vedi gli output di alcune iterazioni .

Spiegazione:

spiegazione:

  • Il var scontiene il codice sorgente non formattato
  • %s è usato per mettere questa stringa in sé con s.format(...)
  • %c, %1$ce 34vengono utilizzati per formattare le virgolette doppie
  • s.format(s,34,s) mette tutto insieme

Parte sfida:

La prima funzione lambda accetta un longinput come parametro.

  • Questo è impostato in variabile Long N=n;nella prima iterazione. O Long N=%s;per le prossime iterazioni.
  • Il controllo ternario N>0?N-1+"L":"n"lo riempirà %sdi valore N-1, aggiunto in Lquanto è un lungo e per convertirlo in una stringa per il %s, se Nè maggiore di 1. Se Ninvece è 0 (l'input iniziale era 0o questa è l'ultima iterazione dell'interquino- ' loop '), riempirà invece %sl'iniziale n.

Secondo le specifiche, gli output intermedi devono essere un programma completo o una funzione senza argomenti
Embodiment of Ignorance

@EmbodimentofIgnorance Lo so, questo è quello che ho. La prima funzione lambda accetta un longparametro-funzione, e le altre funzioni lambda accettano un Voidparametro inutilizzato , che uso sempre anche per le sfide che affermano di non ricevere input perché v->è 1 byte più corto di ()->.
Kevin Cruijssen,

2

Haskell , 195 164 byte

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

Provalo online!

Questo utilizza una tecnica piuttosto semplice. Lo modifichiamo con una variabile aimpostata su un numero. Se quel numero è zero (che è all'inizio) prendiamo input e produciamo la nostra sorgente con aset al numero input. Se anon è zero, produciamo la nostra sorgente con aimpostato su uno in meno. In questo modo il aconto alla rovescia arriva a zero prima di emettere la fonte originale.



2

R , 92 byte

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Provalo online!

Se deparsesi ritiene che barare, ecco un'alternativa:

R , 108 byte

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Provalo online!


1

Perl 6 , 44 byte

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

Provalo online!

Accetta input tramite input standard e restituisce un programma in cui l'unica cosa modificata è il primo numero. Ogni programma successivo produrrà quindi lo stesso programma, tranne con quel numero decrementato.



1

Python 3.8 (pre-release) , 60 56 55 53 byte

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

Provalo online!

-2 byte grazie a Jo King

A partire dalla versione 53 byte, funziona anche in Python 2 e Python 3.


La funzione intermedia non sembra essere un programma completo o una funzione che non accetta argomenti.
Nick Kennedy,

Quell'operatore tricheco :=è una gradita aggiunta a Python, questo è certo.
mbomb007,

"Per le fasi intermedie nei nostrioboros, il tuo programma può essere un programma perfettamente funzionante o una funzione senza argomenti , che, quando chiamato, restituirà / emetterà il prossimo."
mbomb007,

@NickKennedy Aggiornato per rispettare le specifiche e per coincidenza salvato 4 byte.
negativo sette

1
53 byte senza usare:=
Jo King
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.