Fibonacci dizisini şu şekilde tanımlayalım:
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Bu yüzden sonsuz diziye sahibiz 1,2,3,5,8,13,
... Herhangi bir pozitif tamsayının bazı Fibonacci sayılarının toplamı olarak yazılabileceği iyi bilinmektedir. Tek uyarı, bu toplamın benzersiz olmayabilir. Fibonacci sayılarının toplamı olarak bir sayı yazmanın her zaman en az bir yolu vardır, ancak çok daha fazlası olabilir.
Zorluğunuz, stdin'i kullanarak bir ile bir milyon arasında pozitif bir tamsayı alan ve daha sonra girdiyi toplayan Fibonacci sayılarının tüm olası özetlerini kullanarak çıktı veren tam bir program yazmaktır. Özetle, Fibonacci sayıları tekrarlanmamalıdır ve sayıyı içerir 1
. Herhangi bir özette, varsa 1
, sadece bir kez mevcut olmalıdır, çünkü yukarıdaki dizinin tanımında 1
sadece bir kez görünür. Yalnızca terim içeren toplamlar geçerlidir, bu nedenle giriş numarası bir Fibonacci numarasıysa, sayının kendisi geçerli bir toplamdır ve yazdırılmalıdır. Birden fazla toplam varsa, herhangi iki toplam arasında aralarını kolayca ayırt edebilmek için boş bir satır olmalıdır.
İşte bazı örnekler.
./myfib 1
1
Böyle bir miktar var ve sadece bir terimi var, bu yüzden yazdırılan tek şey bu.
./myfib 2
2
Burada tekrarların 1+1
geçerli bir tutar olmadığını unutmayın 1
.
./myfib 3
1+2
3
İki toplam ve ikisi de aralarında boş bir çizgi ile yazdırılır.
./myfib 10
2+8
2+3+5
./myfib 100
3+8+89
1+2+8+89
3+8+34+55
1+2+3+5+89
1+2+8+34+55
3+8+13+21+55
1+2+3+5+34+55
1+2+8+13+21+55
1+2+3+5+13+21+55
Gerçek kod golf. Herhangi bir dilde en kısa kod kazanır. Lütfen kodunuzu bazı test durumlarıyla birlikte gönderin (yukarıda verdiğim kodun yanı sıra). Bağlar söz konusu olduğunda, en az iki hafta ve muhtemelen daha uzun süre bekledikten sonra en yüksek upvotes'a sahip olanı seçiyorum. Bu yüzden topluluk lütfen istediğiniz çözümleri değerlendirmekten çekinmeyin. Kodun akıllılığı / güzelliği, ilk kimin yayınladığından çok daha önemlidir.
Mutlu kodlama!