Q, 47 Bayt
m:{*/1_-':|(0<){y-x x bin y}[*+60(|+\)\1 0]\x}
Ölçek
+(i;m'i:1 2 3 4 5 6 7 8 9 42 1000 12345)
çiftler (i, harita (m, i)) olarak okuyun, burada m hesaplama işlevidir ve i farklı argümanlar
yazıyor
1 1
2 2
3 3
4 3
5 5
6 5
7 10
8 8
9 8
42 272
1000 12831
12345 138481852236
açıklama
n funtion\arg
function (function (function (... function (args))) n kez uygular (dahili olarak tal özyinelemeyi kullanır) ve sonuç sırasını döndürür. Fibonnaci serisinin ilk 60 öğesini şu şekilde hesaplarız: *+60(|+\)\1 0
Bu durumda işlev ( | +): + \ bir dizi üzerine uygulanan kısmi toplamları hesaplar (ex + \ 1 2 3 1 3 6) ve | sekansı tersine çevirir. Böylece her 'yineleme' önceki iki fibonacci sayısının kısmi toplamlarını hesaplar ve kısmi döndürür ters çevrilmiş toplamlar 60(|+\)\1 0
1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ... *+
bu sonuç üzerine uygulanan dizileri oluşturur (ilk amaç) ve birinci alır. 1 2 3 5 8 13 21 34 55 ..
(cond)function\args
cond true durumunda işlev (function (.. function (args)) uygular ve kısmi sonuçların sırasını döndürür
function[arg]
birden fazla argümanın bir işlevi üzerine uygulanan bir projeksiyon oluşturur (kısmi uygulama)
Bağımsız değişkenlere ad verebiliriz, ancak örtük adlar x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
x, y kısmi izdüşümlü bir lambda bildirir (arg x, fibonacci serisidir, * + 60 (| +) \ 1 0 olarak hesaplar). x, fibonacci değerlerini ve y, işlenecek sayıyı temsil eder. İkili arama (bin), daha büyük fibonacci sayısının <= y ( x bin y
) indeksini bulmak ve karşılık gelen x değerini özetlemek için kullanılır.
Kısmi sonuçlardan ürünü hesaplamak için bunları tersine çevirir ve her bir çiftin ( -':|
) farkını hesaplar , ilkini düşürür ( 1_
çünkü 0'dır) ve (( */
) ile çarparız .
Birikmiş toplamla ilgileniyorsak, kod aynıdır, +/
bunun yerine ile */
. + Veya * yerine başka bir diadik operatör de kullanabiliriz
Yürütme verimliliği hakkında
Bu yarışmada verimliliğin bir sorun olmadığını biliyorum. Ama bu problemde çizgisel maliyetten üstel maliyete kadar değişebiliriz, bu yüzden merak ediyorum.
İkinci bir versiyon geliştirdim (yorum hariç uzunluk 48 bayt) ve her iki versiyonda da 1000 kez pilleri tekrarladım.
f:*+60(|+\)\1 0;m:{*/1_-':|(0<){x-f f bin x}\x} /new version
yürütme süresi: orijinal sürüm 0'212 seg, yeni sürüm 0'037 seg
Orijinal sürüm, fonksiyon uygulaması başına bir kez fibbonaci serisini hesaplar; yeni sürüm sadece bir fibonacci hesaplar.
Her iki durumda da fibonacci serisinin hesaplanması kuyruk özyineleme kullanır
2
Olarak ayrıştırılabilir-1 + 3
. Zeckendorf teoreminin doğru ifadesi, pozitif bir Fibonacci sayısının, pozitif indekse sahip ardışık olmayan Fibonacci sayılarının toplamı olarak benzersiz şekilde ayrıştırılabileceğidir.