)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Essayez-le en ligne!
Basé sur 0, donc l'entrée n donne le premier n + 1 résultats.
Explication
Utilise la récursivité d'OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Passons en revue le programme:
)K`0
Il s'agit d'une étape constante: elle supprime l'entrée et définit la chaîne de travail sur 0
, la valeur initiale de la séquence. L' )
encapsule cette étape dans un groupe. Ce groupe lui-même ne fait rien, mais presque chaque étape (y compris les étapes de groupe) enregistre son résultat dans un journal, et nous aurons besoin de deux copies de 0
ce journal pour que le programme fonctionne.
"$+"+¶<`.+
$.(*__2*$-1*
Il y a un tas de configuration ici: "$+"+
enveloppe la scène en boucle. Le "$+"
est traité comme une substitution et $+
fait référence à l'entrée du programme, c'est-à-dire n . Cela signifie que la boucle est exécutée n fois.
¶<
Enveloppe ensuite chaque itération dans une étape de sortie, qui imprime entrée de avec un saut de ligne de fin (donc la première itération imprime le zéro, la deuxième itération imprime le résultat de la première itération et ainsi de suite).
L'étape elle-même remplace la chaîne de travail entière par la substitution sur la dernière ligne. Celui-ci utilise une parenthèse de fermeture implicite et des arguments implicites pour l'opérateur de répétition *
, il est donc en fait court pour:
$.($&*__2*$-1*_)
Le contenu entre parenthèses peut être divisé en trois parties:
$&*_
: donne une chaîne de a (n-1) _
s.
_
: donne un single _
.
2*$-1*_
: donne une chaîne de 2 * a (n-1) _
. Le $-1
fait référence à l'avant-dernier résultat dans le journal des résultats, c'est-à-dire l'itération de boucle avant le dernier. C'est pourquoi nous avions besoin de copies du zéro sur le journal pour commencer, sinon cela ferait référence à l'entrée du programme lors de la première itération.
$.(…)
Mesure ensuite la longueur de la chaîne résultante. En d'autres termes, nous avons calculé a(n) = a(n-1) + 1 + 2*a(n-2)
en passant par unaire (pas vraiment cependant: $.(…)
est paresseux et n'évalue pas réellement son contenu s'il peut déterminer la longueur résultante directement par arithmétique, donc c'est même assez efficace).
Le résultat de l'itération finale de la boucle (le n + 1 ème élément de la séquence) est imprimé en raison de la sortie implicite de Retina à la fin du programme.