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


9

Фон

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

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

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

Наприклад, лямбда-термін λf.λx.f (f (f (fx))) відповідає візуалізації:

-------------------
 |   |   |   |
-------------------
 |   |   |   |   |
 |   |   |   |----
 |   |   |----
 |   |----
 |----
 |

Прочитайте його зверху вниз:

  • Перша горизонтальна лінія являє собою першу λ.
  • Чотири лінії низхідній від нього представляє е s в тілі.
  • Аналогічно, друга горизонтальна лінія являє собою другу λ, а одиночна нова лінія, що сходить від неї, представляє х у тілі.
  • Найправіша лінія 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.
Conor O'Brien

Чи дозволені пробіли?
Loovjo

Ні, лише слідуючі нові рядки. (Це гольф- а- анархія, і мені здається, це найкраще правило, встановлене для викликів мистецтва .)
Лінн

Відповіді:


4

Сітківка , 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

Пітон, 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]))

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 рядків, потім рекурсивно викликає себе, щоб намалювати решту рядків.

Спробуйте в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.