)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Probieren Sie es online!
0-basiert, also gibt der Eingang n den ersten n + 1 Ergebnisse.
Erläuterung
Verwendet die Rekursion von OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Lass uns das Programm durchgehen:
)K`0
Dies ist eine konstante Phase: Sie verwirft die Eingabe und setzt den Arbeitsstring auf 0
den Anfangswert der Sequenz. Das )
schließt diese Etappe in eine Gruppe. Diese Gruppe selbst führt nichts aus, aber fast jede Phase (einschließlich Gruppenphasen) zeichnet das Ergebnis in einem Protokoll auf, und wir benötigen zwei Kopien des 0
Protokolls, damit das Programm funktioniert.
"$+"+¶<`.+
$.(*__2*$-1*
Hier gibt es eine Reihe von Konfigurationen: "$+"+
Wickelt die Bühne in eine Schleife. Das "$+"
wird als Substitution behandelt und $+
bezieht sich auf die Eingabe des Programms, dh n . Dies bedeutet, dass die Schleife ausgeführt wird n- mal ausgeführt wird.
Anschließend wird ¶<
jede Iteration in eine Ausgangsstufe eingeschlossen, die die Stufen druckt Eingang mit einem nachgestellten Zeilenvorschub druckt (die erste Iteration druckt die Null, die zweite Iteration druckt das Ergebnis der ersten Iteration usw.).
Die Bühne selbst ersetzt den gesamten Arbeitsstring durch die Ersetzung in der letzten Zeile. Dass man verwendet eine implizite schließenden Klammer und implizite Argumente für den Wiederholungsoperator *
, es ist so tatsächlich die Abkürzung für:
$.($&*__2*$-1*_)
Das Zeug in den Klammern kann in drei Teile zerlegt werden:
$&*_
: gibt eine Zeichenfolge von a (n-1) _
s.
_
: gibt eine Single _
.
2*$-1*_
: ergibt eine Zeichenkette von 2 * a (n-1) _
. Das$-1
bezieht sich auf das vorletzte Ergebnis im Ergebnisprotokoll, dh die Schleifeniteration vor dem letzten. Aus diesem Grund mussten wir zunächst Kopien der Null im Protokoll erstellen, da sich dies sonst auf die Eingabe des Programms bei der ersten Iteration beziehen würde.
Dann $.(…)
misst die Länge des resultierenden Strings. Mit anderen Worten, wir haben berechnet, a(n) = a(n-1) + 1 + 2*a(n-2)
indem wir durch unary gegangen sind (obwohl nicht wirklich:$.(…)
ist faul und wertet den Inhalt nicht wirklich aus, wenn es die resultierende Länge direkt durch Arithmetik bestimmen kann, was sogar sehr effizient ist).
Das Ergebnis der letzten Schleifeniteration (das n + 1- te Element der Sequenz) wird aufgrund der impliziten Ausgabe von Retina am Ende des Programms gedruckt.