)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Cobalah online!
Berbasis 0, jadi input n memberikan hasil pertama n + 1 .
Penjelasan
Menggunakan rekursi dari OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Mari kita pergi melalui program:
)K`0
Ini adalah tahap konstan: membuang input dan mengatur string yang bekerja ke 0
, nilai awal dari urutan. The )
membungkus tahap ini dalam kelompok. Grup itu sendiri tidak melakukan apa-apa, tetapi hampir setiap tahap (termasuk tahap grup) mencatat hasilnya dalam sebuah log, dan kita akan membutuhkan dua salinan 0
log tersebut agar program dapat berfungsi.
"$+"+¶<`.+
$.(*__2*$-1*
Ada banyak konfigurasi di sini: "$+"+
membungkus panggung dalam satu lingkaran. Ini "$+"
diperlakukan sebagai substitusi, dan $+
mengacu pada input program, yaitu n . Ini berarti bahwa loop dijalankan n kali.
Kemudian ¶<
bungkus setiap iterasi dalam tahap output, yang mencetak input stage dengan trafeed linefeed (jadi iterasi pertama mencetak nol, iterasi kedua mencetak hasil iterasi pertama dan seterusnya).
Tahap itu sendiri menggantikan seluruh string kerja dengan substitusi pada baris terakhir. Yang itu menggunakan kurung penutup implisit dan argumen implisit untuk operator pengulangan *
, jadi itu sebenarnya kependekan dari:
$.($&*__2*$-1*_)
Barang-barang di dalam tanda kurung dapat dipecah menjadi tiga bagian:
$&*_
: memberikan string dari (n-1) _
s.
_
: memberikan satu _
.
2*$-1*_
: memberikan string 2 * a (n-1) _
. The $-1
mengacu pada hasil kedua dari belakang di log hasil, yaitu iterasi lingkaran sebelum terakhir. Itu sebabnya kami perlu menyalin nol pada log untuk memulai, jika tidak, ini akan merujuk pada input program pada iterasi pertama.
Kemudian $.(…)
mengukur panjang string yang dihasilkan. Dengan kata lain, kami telah menghitung a(n) = a(n-1) + 1 + 2*a(n-2)
dengan melalui unary (tidak benar-benar: $.(…)
malas dan tidak benar-benar mengevaluasi kontennya jika dapat menentukan panjang yang dihasilkan secara langsung melalui aritmatika, jadi ini bahkan cukup efisien).
Hasil iterasi loop akhir (elemen n + 1 dari urutan) dicetak karena output implisit Retina di akhir program.