Urutan Fibonacci yang terkenal adalah F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)
(untuk tantangan ini kita mulai dengan 0).
Tantangan Anda: Diberikan n , hasilkan jumlah semua angka Fibonacci d untuk semua pembagi d dari angka Fibonacci n . Jika Anda lebih suka notasi formal,
Input : bilangan bulat positif n
Output : jumlahnya
Sebagai contoh, pertimbangkan n=4
. F(4) = 3
Pembagi 3 adalah 1 dan 3, jadi hasilnya seharusnya F(1) + F(3) = 1 + 2 = 3
.
Untuk n=6
,, F(6) = 8
dan pembagi 8 adalah 1, 2, 4, 8, jadi outputnya adalah F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26
.
Kasus uji:
1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26
Ini adalah kode-golf , jawaban terpendek dalam byte yang menang. Celah standar berlaku.
code-golf
number-theory
fibonacci
division
Neil A.
sumber
sumber
Jelly , 7 byte
Cobalah online!
Penjelasan:
sumber
Mathematica, 29 byte
sumber
Mathematica Disederhanakan , 14 byte
Oh well, ini akhirnya identik dengan solusi @ MartinEnder ...
sumber
N
)Japt , 11 byte
Cobalah online!
sumber
05AB1E , 11 byte
Cobalah online!
Penjelasan
sumber
Haskell, 54 byte
Contoh penggunaan:
g 6
->26
. Cobalah online!sumber
Alice ,
3836 byteTerima kasih kepada Leo karena telah menghemat 2 byte.
Cobalah online!
Hampir dipastikan tidak optimal. Alur kontrolnya cukup rumit dan walaupun saya cukup senang dengan berapa byte yang disimpan di versi sebelumnya, saya merasa bahwa saya terlalu rumit, mungkin ada yang lebih sederhana dan lebih sederhana. lebih pendek.
Penjelasan
Pertama, saya perlu menguraikan sedikit tentang tumpukan alamat pengirim Alice (RAS). Seperti banyak fungeoids lainnya, Alice memiliki perintah untuk melompat-lompat dalam kode. Namun, ia juga memiliki perintah untuk kembali ke tempat asal Anda, yang memungkinkan Anda menerapkan subrutin dengan cukup mudah. Tentu saja, ini menjadi bahasa 2D, subrutin benar-benar hanya ada dengan konvensi. Tidak ada yang menghentikan Anda memasuki atau meninggalkan subrutin melalui cara lain selain perintah kembali (atau pada titik mana pun dalam subrutin), dan tergantung pada bagaimana Anda menggunakan RAS, bagaimanapun, mungkin tidak ada hierarki lompat / kembali yang bersih.
Secara umum, ini diimplementasikan dengan memiliki perintah lompat
j
mendorong alamat IP saat ini ke RAS sebelum melompat. Perintah kembalik
kemudian muncul alamat RAS dan melompat ke sana. Jika RAS kosong,k
tidak melakukan apa-apa.Ada juga cara lain untuk memanipulasi RAS. Dua di antaranya relevan untuk program ini:
w
mendorong alamat IP saat ini ke RAS tanpa melompat ke mana pun. Jika Anda mengulangi perintah ini, Anda dapat menulis loop sederhana dengan nyaman&w...k
, yang sudah saya lakukan di jawaban sebelumnya.J
sepertij
tetapi tidak ingat alamat IP saat ini di RAS.Penting juga untuk dicatat bahwa RAS tidak menyimpan informasi tentang arah IP. Jadi kembali ke alamat dengan
k
akan selalu menjaga arah IP saat ini (dan karena itu juga apakah kita dalam mode Kardinal atau Ordinal) terlepas dari bagaimana kita melewatij
atauw
yang mendorong alamat IP di tempat pertama.Dengan itu, mari kita mulai dengan melihat subrutin dalam program di atas:
Subrutin ini menarik elemen bawah tumpukan, n , ke atas dan kemudian menghitung angka Fibonacci F (n) dan F (n +1) (meninggalkannya di atas tumpukan). Kita tidak pernah membutuhkan F (n +1) , tetapi akan dibuang di luar subrutin, karena bagaimana
&w...k
loop berinteraksi dengan RAS (yang memerlukan loop ini pada akhir subrutin). Alasan kami mengambil elemen dari bawah alih-alih dari atas adalah bahwa ini memungkinkan kami memperlakukan tumpukan lebih seperti antrian, yang berarti kami dapat menghitung semua angka Fibonacci dalam sekali jalan tanpa harus menyimpannya di tempat lain.Inilah cara kerja subrutin ini:
Akhir dari loop agak rumit. Selama ada salinan alamat 'w' di stack, ini akan memulai iterasi berikutnya. Setelah habis, hasilnya tergantung pada bagaimana subrutin itu dipanggil. Jika subrutin dipanggil dengan 'j', 'k' terakhir kembali ke sana, sehingga ujung loop berlipat ganda sebagai kembalinya subrutin. Jika subrutin dipanggil dengan 'J', dan masih ada alamat dari sebelumnya di stack, kita lompat ke sana. Ini berarti jika subrutin dipanggil dalam loop luar itu sendiri, 'k' ini kembali ke awal loop luar itu . Jika subrutin dipanggil dengan 'J' tetapi RAS kosong sekarang, maka 'k' ini tidak melakukan apa-apa dan IP hanya terus bergerak setelah loop. Kami akan menggunakan ketiga kasus ini dalam program.
Akhirnya, ke program itu sendiri.
Ini hanya dua kunjungan singkat ke mode Ordinal untuk membaca dan mencetak bilangan bulat desimal.
Setelah itu
i
, adaw
yang mengingat posisi saat ini sebelum melewati subrutin, karena yang kedua/
. Doa pertama dari subrutin ini menghitungF(n)
dan memberiF(n+1)
masukann
. Setelah itu kami melompat kembali ke sini, tapi kami bergerak ke timur sekarang, jadi sisa dari operator program dalam mode Kardinal. Program utama terlihat seperti ini:Di sini,
31J
ada panggilan lain ke subrutin dan karenanya menghitung angka Fibonacci.sumber
Aksioma, 68 byte
beberapa tes
sumber
Pari / GP , 34 byte
Cobalah online!
sumber
Python 2 ,
8984 byte-5 byte berkat ovs
Cobalah online!
sumber
R, 77 byte
Manfaatkan perpustakaan 'gmp'. Ini memiliki fungsi Fibonacci bawaan dan menyediakan kemampuan untuk melakukan sejumlah besar. Ini menyebabkan beberapa masalah dengan seqs dan berlaku, meskipun masih lebih kecil daripada membuat fungsi Fibonacci saya sendiri.
Penjelasan
Uji
Tanpa menggunakan gmp
81 byte , Fungsi rekursif yang lambat sekali ketika angka (9+) besar dipilih
88 byte , formula Binet yang akan bekerja cukup baik dengan angka yang lebih besar, tetapi masih mencapai batas integer dengan cukup cepat
sumber
Perl 6 , 49 byte
sumber
CJam , 26 byte
Cobalah online!
Saya yakin itu bisa dilakukan dengan lebih baik. Penjelasan:
Idenya adalah untuk memiliki array angka Fibonacci dan dot produkkan dengan array dengan 1s dan 0s jika angka itu adalah atau bukan merupakan pembagi input.
sumber
JavaScript (ES6),
7665 byteUji kasus
Tampilkan cuplikan kode
sumber
JavaScript (ES6),
10510410310197 byteCobalah
sumber
(z=g(i)/y)>~~z
ke(z=g(i)/y)%1
, jika Anda hanya memeriksa bahwaz
adalah bilangan bulat.g(z)
keg(z|0)
tapi membawa kita kembali ke hitungan byte yang sama.Q, 75 byte
sumber
C (gcc) ,
939080 byteCobalah online!
sumber
Tambahkan ++ , 89 byte
Cobalah online!
sumber