Visualisasikan angka-angka Gereja

9

Latar Belakang

Visualisasi istilah λ-kalkulus

Lambda-juggler terkenal (dan pegolf kode ) John Tromp merancang visualisasi yang menarik dari istilah dalam λ-calculus. Dalam kata-katanya:

abstraksi (lambda) diwakili oleh garis-garis horizontal, variabel-variabel dengan garis-garis vertikal yang turun dari lambda pengikatnya, dan aplikasi oleh tautan-tautan horisontal yang menghubungkan variabel-variabel paling kiri.

Misalnya, istilah lambda λf.λx.f (f (f (fx)))) sesuai dengan visualisasi:

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

Baca dari atas ke bawah:

  • Garis horizontal pertama mewakili λ pertama.
  • Empat garis yang turun darinya mewakili huruf f dalam tubuh.
  • Demikian pula, garis horizontal kedua mewakili λ kedua, dan garis baru tunggal turun dari itu mewakili x dalam tubuh.
  • Garis f paling kanan dan garis x dihubungkan oleh garis horizontal yang mewakili aplikasi (f x) .
  • Aplikasi selanjutnya adalah (f (f x)) , dan sebagainya.

Angka gereja

The angka Gereja adalah urutan tertentu dari istilah dalam λ-kalkulus, mengambil pola berikut:

0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...

Tugas

Diberi nomor input n , cetak beberapa seni ASCII yang memvisualisasikan angka Gereja ke- n . Sebagai contoh, contoh di atas adalah output target Anda ketika diberikan n = 4 . Untuk n = 0 , cetak:

---

---
 |
 |

Uji kasus

Jawaban Anda harus menampilkan teks yang persis sama (modulo trailing newlines) seperti snipet tumpukan ini untuk semua input integer n ≥ 0 :

Ini adalah , jadi kode terpendek dalam byte menang.

Lynn
sumber
Cuplikan Anda memberi saya kesalahan.
Leaky Nun
@ LeakyNun browser yang mana? Beberapa browser tidak mendukung .repeat.
Conor O'Brien
Apakah spasi tambahan diperbolehkan?
Loovjo
Tidak, hanya mengikuti baris baru. (Ini adalah à la anarki golf, dan saya merasa ini adalah aturan terbaik yang ditetapkan untuk tantangan ascii-art .)
Lynn

Jawaban:

4

Retina , 74 67 63 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Input dalam bentuk unary , menggunakan karakter apa pun kecuali baris baris sebagai digit.

Cobalah online!

Penjelasan

.
 |  

Kami mulai dengan mengubah setiap digit unary menjadi | (perhatikan spasi tambahan). Ini memberi kita baris kedua dari output (ditambah dua spasi tambahan jika input setidaknya 1).

^
$.'$*----¶

Kami mencocokkan awal string untuk menambahkan baris pertama. Ini dilakukan dengan menggunakan beberapa fitur substitusi khusus-Retina. $*mengulangi karakter di sebelah kanan sebanyak arugment kirinya. $.'mengevaluasi jumlah karakter di sebelah kanan pertandingan. Karena pertandingan hanyalah permulaan dari string, ini memberi sebanyak -karakter dalam string dan ---menambahkan tiga lainnya. Ini adalah alias untuk umpan baris. Jadi sekarang kita punya dua baris pertama.

\z
¶$` |

Sekarang kita menambahkan dua baris berikutnya. Kami melakukan ini dengan mencocokkan ujung string dan menambahkan linefeed, seluruh string lagi dan kemudian |untuk mendapatkan baris keempat yang benar.

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

Waktu untuk aplikasi. Yang memimpin +membuat Retina mengulangi tahap ini sampai output berhenti berubah (dalam hal ini karena regex tidak cocok lama). Regex cocok dengan seluruh baris terakhir, asalkan berisi |pengikut dengan spasi. Kami menangkap semuanya hingga |(yang akan menjadi yang kedua hingga terakhir) dalam grup 1. Kami menulis baris kembali dengan $&, linefeed, lalu grup 1 (dengan demikian menjatuhkan yang terakhir |) dan kemudian ----.

$
¶ |

Ini hanya menambahkan baris terakhir yang hanya mengandung satu |.

  ¶
¶

Akhirnya kita harus menyingkirkan spasi tambahan di baris kedua.

Martin Ender
sumber
2

JavaScript (ES6), 112 byte

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>

Neil
sumber
Apakah semua baris baru diperlukan? Apakah f=perlu?
NoOneIsHere
@NoOneIsHere Baris baru adalah bagian dari string templat. Ini f=bukan bagian dari jawaban, itu hanya diperlukan untuk cuplikan, dan tidak dihitung sebagai bagian dari total byte.
Neil
2

Python, 201 byte

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]))
pengguna2070206
sumber
1

Python 2, 138 byte

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)

Fungsi ini berisi parameter tambahan, tetapi hanya untuk penggunaan internal. Ini memiliki nilai default dan harus dihilangkan saat memanggil fungsi. Saya harap ini tidak melanggar aturan.

Fungsi menggambar 5 baris pertama, lalu secara rekursif memanggil dirinya untuk menggambar baris yang tersisa.

Cobalah online

Chuck Morris
sumber