Фон
Визуализация терминов λ-исчисления
Знаменитый лямбда-жонглер (и гольфист кода ) Джон Тромп изобрел интересную визуализацию терминов в λ-исчислении. По его словам:
абстракции (лямбды) представлены горизонтальными линиями, переменные - вертикальными линиями, исходящими от их связующей лямбды, а приложения - горизонтальными связями, соединяющими крайние левые переменные.
Например, лямбда-член λf.λx.f (f (f (fx))) соответствует визуализации:
-------------------
| | | |
-------------------
| | | | |
| | | |----
| | |----
| |----
|----
|
Прочитайте это сверху донизу:
- Первая горизонтальная линия представляет первую λ.
- Четыре нисходящие линии представляют fs в теле.
- Аналогично, вторая горизонтальная линия представляет вторую λ, а единственная новая линия, идущая от нее, представляет x в теле.
- Крайняя правая линия f и линия x соединены горизонтальной линией, представляющей приложение (f x) .
- Следующее приложение (f (f x)) и так далее.
Церковные цифры
В позиции Церкви представляют собой специфическую последовательность терминов в Х-исчислении, принимая на следующей схеме:
0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...
задача
Учитывая введенное число n , напечатайте немного искусства ASCII, которое визуализирует n- ую церковную цифру. Например, приведенный выше пример является вашим целевым выходом, когда задано n = 4 . Для n = 0 выведите:
---
---
|
|
Контрольные примеры
Ваш ответ должен выводить точно такой же текст (по модулю завершающие символы новой строки), как этот фрагмент стека для всех целочисленных входов n ≥ 0 :
Это Код-гольф, поэтому выигрывает самый короткий код в байтах.
.repeat
.Ответы:
Retina ,
746763 байтаКоличество байтов предполагает кодировку ISO 8859-1.
Ввод одинарный , с использованием любого символа, кроме перевода строки, в качестве цифры.
Попробуйте онлайн!
объяснение
Мы начинаем с того, что превращаем каждую унарную цифру
|
(обратите внимание на конечные пробелы). Это дает нам вторую строку вывода (плюс два хвостовых пробелов , если вход, по крайней мере1
).Мы сопоставляем начало строки, чтобы добавить первую строку. Это делается с помощью некоторых специфичных для Retina функций замещения.
$*
повторяет персонажа справа столько раз, сколько его левой доли.$.'
оценивает количество символов справа от совпадения. Поскольку совпадение является только началом строки, это дает столько-
символов, сколько в строке, и---
добавляет еще три.¶
Является псевдонимом для перевода строки. Итак, теперь у нас есть первые две строки.Теперь мы добавляем следующие две строки. Мы делаем это, сопоставляя конец строки и добавляя перевод строки, снова всю строку, а затем
|
получая четвертую строку правильно.Время заявок. Ведущий
+
заставляет Retina повторять этот этап до тех пор, пока выход не перестанет изменяться (в этом случае, поскольку регулярное выражение больше не совпадает). Регулярное выражение соответствует всей последней строке, при условии, что оно содержит|
после пробела. Мы фиксируем все вплоть до|
(который будет вторым до последнего) в группе1
. Мы записываем строку обратно$&
, перевод строки, затем группу 1 (тем самым отбрасывая последнюю|
) и затем----
.Это только добавляет последнюю строку , содержащую только один
|
.Наконец, нам нужно избавиться от пробелов на второй строке.
источник
JavaScript (ES6), 112 байт
источник
f=
необходимо?f=
не является частью ответа, он нужен только для фрагмента и не считается частью байта.Python, 201 байт
источник
Python 2, 138 байт
Функция содержит дополнительный параметр, но он предназначен только для внутреннего использования. Он имеет значение по умолчанию и должен быть опущен при вызове функции. Я надеюсь, что это не нарушает правила.
Функция рисует первые 5 строк, затем рекурсивно вызывает себя, чтобы нарисовать оставшиеся строки.
Попробуйте онлайн
источник