?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Se viene utilizzato un interprete conforme standard, questo accetta input e output come valori byte . Per utilizzare effettivamente i numeri decimali su STDIN / STDOUT, avrai bisogno dell'interprete Python con NUMERIC_OUTPUT = Truee un'opzione aggiuntivaNUMERIC_INPUT = True .
Spiegazione
Lo scheletro del programma è
?1-( 1 -
1 )!
Leggiamo l'input Nsulla prima voce e lo diminuiamo per ottenere N-1. Inizializziamo anche la seconda voce a 1. Quindi eseguiamo il loop N-1una volta, ciascuna delle quali ottiene il valore successivo della sequenza sul secondo stack. Alla fine stampiamo ilN numero th.
L'idea del programma è di mettere ogni elemento della sequenza in una coda sulla terza voce e di decrementare il capo di quella coda in ogni iterazione. Quando la testa raggiunge 0, incrementiamo il valore della sequenza e lo rimuoviamo 0.
Ora il problema è che Prelude utilizza stack e non code. Quindi dobbiamo spostarci un po 'attorno a quello stack per usarlo come una coda.
v #
0v ^
(#)
Questo copia il valore corrente della sequenza nella prima voce (come copia temporanea), inserisce 0a nella seconda voce (per contrassegnare la fine della coda). Quindi esegue un loop per spostare (e quindi invertire) il terzo stack sul secondo. Dopo il ciclo, mettiamo la copia del valore della sequenza corrente in cima al secondo stack (che è la coda della nostra coda).
)
(#
^#1-
Sembra un po 'brutto, ma essenzialmente è un loop che sposta lo stack sulla terza voce. Dato che si )trova nella stessa colonna delle istruzioni di spostamento, la 0prima voce che inseriamo nella seconda voce finirà anche con la terza voce, quindi dobbiamo rimuoverla con un'altra #. Quindi decrementa la parte superiore della terza voce, ovvero il capo della coda.
Ora diventa un po 'fastidioso: vogliamo eseguire un po' di codice quando quel valore lo è 0, ma l'unica struttura di controllo (il ciclo) di Prelude risponde solo a valori diversi da zero.
0 (1+0)#
(0)#
Nota che la parte superiore della seconda voce è veritiera (poiché la sequenza Golomb non contiene alcuna 0s). Quindi il carico di lavoro entra in quella voce (quest'ultima coppia di parentesi). Dobbiamo solo impedire che ciò accada se il capo della coda non è 0ancora. Quindi per prima cosa abbiamo un "loop" sulla terza voce che spinge a 0sulla seconda voce se la testa della coda è ancora diversa da zero. Abbiamo anche inserito 0la terza voce per uscire immediatamente dal loop. La #terza voce rimuove quindi quella 0, o rimuove la testa della coda se quella era già pari a zero. Ora quel secondo ciclo viene inserito solo se il capo della coda era zero (e il0sulla seconda voce non è mai stato premuto). In tal caso incrementiamo il valore corrente della sequenza e premiamo a 0per uscire dal loop. Infine, ci sarà sempre uno 0in cima allo stack, che dobbiamo scartare.
Ti ho detto che la negazione logica è fastidiosa in Prelude ...
nanziché2 - n % 1. Hai qualche motivo per aspettarti che le risposte siano significativamente diverse?