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 kode-golf , jadi kode terpendek dalam byte menang.
.repeat
.Jawaban:
Retina ,
746763 byteHitungan byte mengasumsikan penyandian ISO 8859-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 setidaknya1
).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.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.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 grup1
. 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.
sumber
JavaScript (ES6), 112 byte
sumber
f=
perlu?f=
bukan bagian dari jawaban, itu hanya diperlukan untuk cuplikan, dan tidak dihitung sebagai bagian dari total byte.Python, 201 byte
sumber
Python 2, 138 byte
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
sumber