)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Provalo online!
Basato su 0, quindi input n dà i primi n + 1 risultati.
Spiegazione
Utilizza la ricorsione da OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Andiamo attraverso il programma:
)K`0
Questa è una fase costante: scarta l'input e imposta la stringa di lavoro su 0
, il valore iniziale della sequenza. Questo )
avvolge questa fase in un gruppo. Quel gruppo stesso non fa nulla, ma quasi tutte le fasi (comprese le fasi del gruppo) registrano il risultato in un registro e 0
per far funzionare il programma sono necessarie due copie del registro.
"$+"+¶<`.+
$.(*__2*$-1*
C'è un sacco di configurazioni qui: "$+"+
avvolge il palco in un ciclo. La "$+"
viene trattata come una sostituzione, e $+
si riferisce all'ingresso del programma, ossia n . Ciò significa che il ciclo è eseguito n volte.
Quindi ¶<
avvolge ogni iterazione in uno stage di output, che stampa l' input dello stage con un avanzamento riga finale (quindi la prima iterazione stampa lo zero, la seconda iterazione stampa il risultato della prima iterazione e così via).
Lo stage stesso sostituisce l'intera stringa di lavoro con la sostituzione sull'ultima riga. Quello utilizza una parentesi di chiusura implicita e argomenti impliciti per l'operatore di ripetizione *
, quindi in realtà è l'abbreviazione di:
$.($&*__2*$-1*_)
Il materiale all'interno delle parentesi può essere suddiviso in tre parti:
$&*_
: fornisce una stringa di a (n-1) _
s.
_
: dà un singolo _
.
2*$-1*_
: fornisce una stringa di 2 * a (n-1) _
. Il si $-1
riferisce al penultimo risultato nel registro dei risultati, vale a dire l'iterazione del ciclo prima dell'ultimo. Ecco perché all'inizio avevamo bisogno di copie dello zero nel registro, altrimenti ciò si riferirebbe all'input del programma sulla prima iterazione.
Quindi $.(…)
misura la lunghezza della stringa risultante. In altre parole, abbiamo calcolato a(n) = a(n-1) + 1 + 2*a(n-2)
passando per unario (non proprio se:$.(…)
è pigro e non ne valuta effettivamente il contenuto se può determinare la lunghezza risultante direttamente attraverso l'aritmetica, quindi è anche abbastanza efficiente).
Il risultato dell'iterazione del ciclo finale ( n + 1 ° elemento della sequenza) viene stampato a causa dell'output implicito di Retina alla fine del programma.