Mari kita mendefinisikan urutan Fibonacci sebagai
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Jadi kita memiliki urutan yang tak terbatas 1,2,3,5,8,13,
... Sudah diketahui bahwa bilangan bulat positif dapat ditulis sebagai jumlah dari beberapa angka Fibonacci. Satu-satunya peringatan adalah bahwa penjumlahan ini mungkin tidak unik. Selalu ada setidaknya satu cara untuk menulis angka sebagai jumlah angka Fibonacci tetapi mungkin ada banyak lagi.
Tantangan Anda adalah untuk menulis program lengkap yang menggunakan stdin mengambil bilangan bulat positif antara satu dan satu juta inklusif, dan kemudian output menggunakan stdout semua kemungkinan penjumlahan angka-angka Fibonacci yang menjumlahkan ke input. Dalam penjumlahan, angka-angka Fibonacci tidak boleh diulang dan itu termasuk angka 1
. Dalam penjumlahan apa pun, jika 1
ada, itu harus hadir hanya sekali karena dalam definisi saya urutan di atas 1
hanya muncul sekali. Penjumlahan dengan satu-satunya istilah adalah valid sehingga jika nomor input adalah angka Fibonacci itu sendiri, maka angka itu sendiri adalah penjumlahan yang valid dan harus dicetak. Jika banyak jumlah, maka di antara dua jumlah mana pun harus ada garis kosong agar mudah dibedakan di antara keduanya.
Berikut ini beberapa contohnya.
./myfib 1
1
Hanya ada satu jumlah seperti itu dan hanya memiliki jangka waktu sehingga hanya itu yang dicetak.
./myfib 2
2
Perhatikan di sini bahwa 1+1
ini bukan jumlah yang valid karena 1
berulang.
./myfib 3
1+2
3
Dua jumlah dan keduanya dicetak dengan garis kosong di antaranya.
./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
Golf kode sejati. Kode terpendek dalam bahasa apa pun menang. Silakan kirim kode Anda dengan beberapa test case (selain yang saya berikan di atas). Dalam hal ikatan, saya memilih yang dengan upvotes tertinggi setelah menunggu setidaknya selama dua minggu dan mungkin lebih lama. Jadi komunitas jangan ragu untuk mengunggah solusi yang Anda suka. Kecerdasan / keindahan kode jauh lebih penting daripada siapa yang memposting terlebih dahulu.
Selamat coding!
Jawaban:
GolfScript, 54 karakter
Uji secara online atau lihat contohnya:
sumber
Ruby,
118114 (output array) atau138134 (output yang benar)Contoh dijalankan:
Ubah
gets
ke$*[0]
jika Anda ingin argumen baris perintah (>fibadd 100
), +1 karakter.Dengan output yang benar:
Sampel berjalan:
Yang terakhir (12804) hanya membutuhkan waktu sekitar 3 detik!
sumber
Mathematica,
8985 karakterDisingkat menjadi 85 karakter berkat David Carraher.
Mathematica memiliki fungsi bawaan
Fibonacci
, tetapi saya tidak ingin menggunakannya.sumber
i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &]
i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &] // Column
Python
206181 karakterContoh Run:
sumber
while i<1000000:v+=[i];i,j=j,i+j
import itertools as z
:, hapus baris baru setelah titik dua, masukkan garisy=input()
denganx,y,v
garis, dan hapus ruang ekstra setelahif
pernyataan akhir .Scala, 171
sumber
C #, 376 byte
Tidak Disatukan:
Metode
B
mengembalikanIEnumerable
yang mewakili seluruh set Fibonacci (tak terbatas). Metode kedua, diberi nomorn
, melihatn
angka-angka Fibonacci pertama (berlebihan di sini), menemukan semua himpunan bagian yang mungkin (power set), dan kemudian menyaring ke himpunan bagian yang jumlahnya tepatn
, dan kemudian dicetak.sumber
APL (75)
Kurang kompetitif daripada yang saya inginkan, sebagian besar karena format output.
Keluaran:
Penjelasan:
I←⎕
: baca input, simpan diI
.⍳2
: dimulai dengan daftar1 2
,{⍵,+/¯2↑⍵}
: tambahkan jumlah dari dua elemen terakhir ke daftar,⍣{I<⊃⌽⍺}
: hinggaI
lebih kecil dari elemen terakhir dari daftar.F←
: store inF
(ini adalah nomor fibonacci dari1
keI
).N←⍴F
: menyimpan jumlah angka fibonacci diN
.↓⍉(N⍴2)⊤⍳2*N
: dapatkan angka dari1
hingga2^N
, sebagai bit.S←/∘F¨
: gunakan masing-masing sebagai bitmask onF
, simpan diS
.I=+/¨S
: untuk setiap sub-daftar diS
, lihat apakah jumlah itu sama denganI
.S/⍨
: pilih ini dariS
. (Sekarang kami memiliki semua daftar nomor fibonacci yang dijumlahkanI
.){
...}¨
: untuk masing-masing:,'+',⍪⍵
: tambahkan+
di depan setiap nomor,1↓
: ambil+
back off pertama ,⎕TC[2]
: tambahkan baris baru ekstra,⎕←
: dan output.sumber
Haskell - 127
Setelah banyak iterasi saya berakhir dengan kode berikut:
Saya bisa menyelamatkan mungkin satu karakter dengan menipu dan menambahkan "0+" tambahan di depan setiap baris output.
Saya ingin berbagi versi lain (panjang 143) yang saya buat ketika mencoba golf solusi sebelumnya. Saya tidak pernah menyalahgunakan operator dan tuple sebanyak ini sebelumnya:
Kasus uji, 256:
dan 1000:
Beberapa data efisiensi karena seseorang memiliki hal ini:
sumber
05AB1E , 19 byte (Tidak bersaing)
Cobalah online!
Hitung semua jumlah yang mungkin untuk setiap yang diberikan
n
. Contoh output untuk 1000:sumber