Визуализируйте церковные цифры

9

Фон

Визуализация терминов λ-исчисления

Знаменитый лямбда-жонглер (и гольфист кода ) Джон Тромп изобрел интересную визуализацию терминов в λ-исчислении. По его словам:

абстракции (лямбды) представлены горизонтальными линиями, переменные - вертикальными линиями, исходящими от их связующей лямбды, а приложения - горизонтальными связями, соединяющими крайние левые переменные.

Например, лямбда-член λ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 :

Это , поэтому выигрывает самый короткий код в байтах.

Линн
источник
Ваш фрагмент дает мне ошибку.
Дрянная Монахиня
@ LeakyNun какой браузер? Некоторые браузеры не поддерживают .repeat.
Конор О'Брайен
Разрешены ли пробелы?
Loovjo
Нет, только конечные переводы строк. (Это à la anarchy golf, и я чувствую, что это лучший набор правил для задач ascii-art .)
Линн

Ответы:

4

Retina , 74 67 63 байта

Количество байтов предполагает кодировку ISO 8859-1.

.
 |  
^
$.'$*----¶
\z
¶$` |
+`(.+\|) .+$
$&¶$1----
$
¶ |
  ¶
¶

Ввод одинарный , с использованием любого символа, кроме перевода строки, в качестве цифры.

Попробуйте онлайн!

объяснение

.
 |  

Мы начинаем с того, что превращаем каждую унарную цифру | (обратите внимание на конечные пробелы). Это дает нам вторую строку вывода (плюс два хвостовых пробелов , если вход, по крайней мере 1).

^
$.'$*----¶

Мы сопоставляем начало строки, чтобы добавить первую строку. Это делается с помощью некоторых специфичных для Retina функций замещения. $*повторяет персонажа справа столько раз, сколько его левой доли. $.'оценивает количество символов справа от совпадения. Поскольку совпадение является только началом строки, это дает столько -символов, сколько в строке, и ---добавляет еще три. Является псевдонимом для перевода строки. Итак, теперь у нас есть первые две строки.

\z
¶$` |

Теперь мы добавляем следующие две строки. Мы делаем это, сопоставляя конец строки и добавляя перевод строки, снова всю строку, а затем |получая четвертую строку правильно.

+`(.+\|) .+$
$&¶$1----

Время заявок. Ведущий +заставляет Retina повторять этот этап до тех пор, пока выход не перестанет изменяться (в этом случае, поскольку регулярное выражение больше не совпадает). Регулярное выражение соответствует всей последней строке, при условии, что оно содержит |после пробела. Мы фиксируем все вплоть до |(который будет вторым до последнего) в группе 1. Мы записываем строку обратно $&, перевод строки, затем группу 1 (тем самым отбрасывая последнюю |) и затем ----.

$
¶ |

Это только добавляет последнюю строку , содержащую только один |.

  ¶
¶

Наконец, нам нужно избавиться от пробелов на второй строке.

Мартин Эндер
источник
2

JavaScript (ES6), 112 байт

f=
n=>`${d=`-`.repeat(n*4+3)}
${(b=` |  `.repeat(n)).slice(0,-2)}
${d}
${b} |
${b.replace(/ \|  /g,`$' |----
`)} |`
;
<input id=i type=number min=0 oninput=o.textContent=f(this.value)>
<pre id=o></pre>

Нил
источник
Нужны ли все новые строки? Кроме того, это f=необходимо?
NoOneIsHere
@NoOneIsHere Новые строки являются частью строки шаблона. Он f=не является частью ответа, он нужен только для фрагмента и не считается частью байта.
Нил
2

Python, 201 байт

from pylab import*
n=input()
p=array(list(' -|\n'))
a=zeros((n+5,n*4+4),int)
for k in range(n):l=4*k+5;a[:-k-1,l]=2;a[-k-2,l-3:l+1]=1
a[:,1]=2
a[1,-3]=0
a[0]=a[2]=1
a[:,-1]=3
print''.join(ravel(p[a]))
user2070206
источник
1

Python 2, 138 байт

def f(n,a=1):
 if ~n:b="---\n";c=" |";d="  "+c;print("-"*n*4+b+c*(n>0)+d*(n-1)+"\n"+"-"*n*4+b+c+d*n+"\n")*a+c+d*(n-1)+"-"*4*(n>0);f(n-1,0)

Функция содержит дополнительный параметр, но он предназначен только для внутреннего использования. Он имеет значение по умолчанию и должен быть опущен при вызове функции. Я надеюсь, что это не нарушает правила.

Функция рисует первые 5 строк, затем рекурсивно вызывает себя, чтобы нарисовать оставшиеся строки.

Попробуйте онлайн

Чак Моррис
источник