)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Попробуйте онлайн!
На основе 0, поэтому вход n дает первое n + 1 результаты.
объяснение
Использует рекурсию из OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Давайте пройдемся по программе:
)K`0
Это постоянный этап: он отбрасывает ввод и устанавливает рабочую строку в 0качестве начального значения последовательности. )Обертывает эту стадию в группе. Эта группа сама по себе ничего не делает, но почти каждый этап (включая групповые этапы) записывает свой результат в журнал, и нам потребуется две копии 0этого журнала для работы программы.
"$+"+¶<`.+
$.(*__2*$-1*
Здесь есть куча настроек: "$+"+оборачивает сцену в цикл. Значение "$+"рассматривается как замена и $+относится к входу программы, т.е. n . Это означает, что цикл запущен n раз.
Затем ¶<оборачивает каждую итерацию в выходной этап, который печатает входные данные этапа с завершающим переводом строки (поэтому первая итерация печатает ноль, вторая итерация печатает результат первой итерации и т. Д.).
Сам этап заменяет всю рабочую строку с подстановкой в последней строке. Тот использует неявные закрывающие скобки и неявные аргументы для оператора повторения *, так что на самом деле это сокращение от:
$.($&*__2*$-1*_)
Материал внутри скобок можно разбить на три части:
$&*_: дает строку из (n-1) _ s.
_: дает сингл _.
2*$-1*_: дает строку 2 * a (n-1) _ . $-1Относится к результату предпоследнего в журнале результата, т.е. итерации цикла до последнего. Вот почему нам нужно было сначала скопировать ноль в журнале, иначе это будет относиться к вводу программы на первой итерации.
Затем $.(…)измеряет длину полученной строки. Другими словами, мы вычислили a(n) = a(n-1) + 1 + 2*a(n-2), пройдя через унарный (хотя на самом деле это не так:$.(…) он ленив и фактически не оценивает его содержимое, если он может определить результирующую длину непосредственно с помощью арифметики, так что это даже довольно эффективно).
Результат последней итерации цикла ( n + 1- й элемент последовательности) печатается из-за неявного вывода Retina в конце программы.