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.


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.


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>


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]))

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.