)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Çevrimiçi deneyin!
0 tabanlıdır, bu nedenle n girişi ilk n + 1 sonucunu verir .
açıklama
OEIS'ten özyinelemeyi kullanır:
a(n) = a(n-1) + 2*a(n-2) + 1
Programdan geçelim:
)K`0
Bu sabit bir aşamadır: girişi atar ve çalışma dizesini 0
dizinin ilk değeri olarak ayarlar . )
Bir grup bu aşamaya sarar. Bu grubun kendisi hiçbir şey yapmaz, ancak hemen hemen her aşama (grup aşamaları dahil) sonucunu bir kütüğe kaydeder 0
ve programın çalışması için o kütüğün iki kopyasına ihtiyacımız olacaktır.
"$+"+¶<`.+
$.(*__2*$-1*
Burada bir sürü konfigürasyon var: "$+"+
sahneyi bir döngüye sokuyor. Bu "$+"
bir ikame $+
olarak değerlendirilir ve programın girişine, yani n'ye atıfta bulunur . Bu döngü n çalıştırıldığı anlamına gelir kere .
Sonra ¶<
her yinelemeyi, çıktının basımını saran, çıktısını alır. girişini izleyen satır besleme ile sarın (böylece ilk yineleme sıfırı, ikinci yineleme ilk yinelemenin sonucunu vb. Yazdırır).
Sahnenin kendisi, tüm çalışma dizgesini, son satırdaki yer değiştirmeyle değiştirir. Bu, kapalı bir parantez ve tekrarlama işleci için kapalı argümanlar kullanır *
, bu yüzden aslında kısadır:
$.($&*__2*$-1*_)
Parantez içindeki eşyalar üç bölüme ayrılabilir:
$&*_
: bir (n-1) _
s dizesini verir .
_
: bir tek verir _
.
2*$-1*_
: 2 * a (n-1) değerinde bir dizi verir _
. $-1
Yani önce son döngünün, sonuç günlüğüne sondan bir önceki sonucu belirtir. Bu yüzden başlamak için kayıt defterinde sıfırın kopyalarını almamız gerekiyordu, aksi takdirde bu programın ilk yinelemedeki girdisine işaret eder.
Sonra $.(…)
ortaya çıkan dizenin uzunluğunu ölçer. Başka bir deyişle, a(n) = a(n-1) + 1 + 2*a(n-2)
tekdüze geçerek hesapladık (gerçekte olmasa da: $.(…)
tembel ve sonuçta elde edilen uzunluğu doğrudan aritmetik ile belirleyebiliyorsa, içeriğini gerçekten değerlendirmiyor, bu yüzden bu oldukça verimli).
Son döngü yinelemesinin sonucu ( dizinin n + 1. elemanı), programın sonunda Retina'nın örtük çıktısı nedeniyle yazdırılır.