)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Wypróbuj online!
Oparte na 0, więc wejście n daje pierwsze n + 1 wyników.
Wyjaśnienie
Wykorzystuje rekurencję z OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Przejdźmy przez program:
)K`0
Jest to stały etap: odrzuca dane wejściowe i ustawia ciąg roboczy 0
na wartość początkową sekwencji. )
Otacza ten etap w grupie. Ta grupa sama nie robi nic, ale prawie każdy etap (w tym etapy grupy) zapisuje swój wynik w dzienniku, a 0
do działania programu potrzebujemy dwóch kopii tego dziennika.
"$+"+¶<`.+
$.(*__2*$-1*
Jest tu kilka konfiguracji: "$+"+
owija scenę w pętlę. "$+"
Są traktowane jako zmiany i $+
oznacza wejście programu, to znaczy n . Oznacza to, że pętla jest uruchamiana n razy.
Następnie ¶<
owija każdą iterację w stopień wyjściowy, który drukuje dane wejściowe stopnia z końcowym przesuwem linii (więc pierwsza iteracja drukuje zero, druga iteracja drukuje wynik pierwszej iteracji itd.).
Sam etap zastępuje cały ciąg roboczy podstawieniem w ostatnim wierszu. Ten korzysta z niejawnego nawiasu zamykającego i niejawnych argumentów dla operatora powtarzania *
, więc w rzeczywistości jest to skrót od:
$.($&*__2*$-1*_)
Elementy w nawiasach można podzielić na trzy części:
$&*_
: daje ciąg (n-1) _
s.
_
: daje singiel _
.
2*$-1*_
: daje ciąg 2 * a (n-1) _
. $-1
Odnosi się do wyniku przedostatniego w dzienniku wynikowego, czyli iteracji pętli przed ostatnim. Dlatego musieliśmy na początku skopiować zero w logu, w przeciwnym razie odnosi się to do danych wejściowych programu przy pierwszej iteracji.
Następnie $.(…)
mierzy długość wynikowego ciągu. Innymi słowy, obliczyliśmy a(n) = a(n-1) + 1 + 2*a(n-2)
przechodząc przez jednoargumentowy (ale nie bardzo: $.(…)
jest leniwy i tak naprawdę nie ocenia jego zawartości, jeśli może określić wynikową długość bezpośrednio za pomocą arytmetyki, więc jest to nawet całkiem wydajne).
Wynik końcowej iteracji pętli ( n + 1- ty element sekwencji) jest drukowany z powodu niejawnego wyjścia Retiny na końcu programu.