)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 0na 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 0do 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) _ . $-1Odnosi 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.