Angka Fibonacci
Bilangan Fibonacci mulai dengan f(1) = 1
dan f(2) = 1
(beberapa termasuk f(0) = 0
tapi ini tidak relevan dengan tantangan ini. Kemudian, untuk n > 2
, f(n) = f(n-1) + f(n-2)
.
Tantangan
Tugas Anda adalah untuk menemukan dan menampilkan angka n
positif -th yang dapat dinyatakan sebagai produk angka Fibonacci. Anda dapat memilih untuk membuatnya 0-diindeks atau 1-diindeks, mana yang lebih cocok untuk Anda, tetapi Anda harus menentukan ini dalam jawaban Anda.
Juga, jawaban Anda harus menghitung istilah ke-100 dalam waktu yang wajar.
Testcases
n result corresponding product (for reference)
1 1 1
2 2 2
3 3 3
4 4 2*2
5 5 5
6 6 2*3
7 8 2*2*2 or 8
8 9 3*3
9 10 2*5
10 12 2*2*3
11 13 13
12 15 3*5
13 16 2*2*2*2 or 2*8
14 18 2*3*3
15 20 2*2*5
16 21 21
17 24 2*2*2*3 or 3*8
18 25 5*5
19 26 2*13
20 27 3*3*3
100 315 3*5*21
Referensi
code-golf
number-theory
fibonacci
Biarawati Bocor
sumber
sumber
7
tidak dapat dinyatakan sebagai produk angka Fibonacci. Oleh karena itu, angka yang1
diperlukan adalah1
,2
nd adalah2
, ..., yang6
ke - i6
, tetapi7
ke - i8
.corresponding product
" hanya untuk klarifikasi. Kode Anda hanya perlu menampilkan "result
".Jawaban:
Jelly ,
26242321 byteCobalah online!
Bagaimana itu bekerja
sumber
Julia, 79 byte
Cobalah online!
Latar Belakang
Dalam Advanced Problem and Solutions, H-187: Fibonacci adalah kuadrat , pengusul menunjukkan hal itu
di mana L n menunjukkan nomor Lucas ke- n , dan itu - sebaliknya - jika
maka n adalah angka Fibonacci dan m adalah angka Lucas.
Bagaimana itu bekerja
Kami mendefinisikan operator biner
<|
untuk tujuan kami. Ini tidak terdefinisi dalam versi terbaru Julia, tetapi masih diakui sebagai operator oleh parser.Saat dipanggil hanya dengan satu argumen ( n ),
<|
inisialisasi k sebagai 1 . Sementara n adalah positif, ia mengurangkan ! K ( 1 jika k adalah produk dari angka-angka Fibonacci, 0 jika tidak) dari n dan secara rekursif menyebut dirinya sendiri, menambah k sebesar 1 . Setelah n mencapai 0 , jumlah produk yang diinginkan telah ditemukan, jadi<|
kembalikan nilai k sebelumnya , yaitu, ~ -k = k - 1 .Operator unary
!
, didefinisikan ulang sebagai tes untuk produk angka Fibonacci, mencapai tugasnya sebagai berikut.Jika k = 1 , k adalah produk angka Fibonacci. Dalam hal ini, kami menaikkan nilai kembali
any(...)
ke daya ~ -k = k - 1 = 0 , sehingga hasilnya adalah 1 .Jika k> 1 , hasilnya akan menjadi nilai
any(....)
, yang akan mengembalikan true jika dan hanya jika predikat√(5i^2+[4,-4])%1∋k%i<!(k÷i)
mengembalikan true untuk beberapa integer i sedemikian rupa sehingga 2 ≤ i ≤ k .Kondisi dirantai dalam pegangan predikat jika
k%i
milik√(5i^2+[4,-4])%1
dank%i
kurang dari!(k÷i)
.√(5i^2+[4,-4])%1
mengambil akar kuadrat dari 5i 2 + 4 dan 5i 2 - 4 dan menghitung residu modulo 1 mereka . Setiap modulus adalah 0 jika angka yang sesuai adalah kuadrat sempurna, dan angka positif kurang dari 1 sebaliknya.Karena
k%i
mengembalikan bilangan bulat, itu hanya dapat menjadi milik array moduli jika k% i = 0 (yaitu, k dapat dibagi oleh i ) dan setidaknya satu di antara 5i 2 + 4 dan 5i 2 - 4 adalah kuadrat sempurna (yaitu, i adalah angka Fibonacci).!(k÷i)
secara rekursif memanggil 1 dengan argumen k ÷ i (divisi integer), yang akan lebih besar dari 0 jika dan hanya jika k ÷ i adalah produk dari angka Fibonacci.Dengan induksi, ! memiliki properti yang diinginkan.
sumber
Python, 90 byte
Fungsi utama
g
menampilkank
produk Fibonacci, yang diindeks 1. Ini menghitungg(100)
sebagai315
hampir seketika. Itu berjalan begitu dengan resep rekursif umum menghitung angkan
mencarik
contoh yang memenuhi fungsif
. Setiap instance tersebut menurunkan jumlah yang diperlukank
hingga mencapai0
.Fungsi tambahan
f
menguji angka untuk menjadi produk Fibonacci. Secara rekursif menghasilkan angka-angka Fibonacci dalam argumen opsionala
danb
. Ini menampilkan "ya" jika salah satu dari yang berikut ini benar:n<2
. Ini menyiratkann==1
, produk sepele)n%a<f(n/a)
. Ini memerlukann%a==0
danf(n/a)==True
, yaitu, yangn
merupakan kelipatan dari angka Fibonaccia
, dan menghilangkan faktor inia
masih menghasilkan produk Fibonacci.n-a>0<f(n,b,a+b)
, setara dengann>a and f(n,b,a+b)
. Memeriksa bahwa nomor Fibonacci saat ini sedang diuji tidak setidaknyan
, dan beberapa angka Fibonacci yang lebih besar berfungsi. Terima kasih kepada Dennis untuk menghemat 2 byte menggunakan hubung singkat ketimpanganand
.Fungsi ini
g
bisa lebih pendek satu bytejika
g(k)
selalu paling banyakk*k
, yang saya tidak yakin secara asimptotik benar. Sebuah terikat dari2**k
mencukupi, tapi kemudiang(100)
membutuhkan waktu terlalu lama. Mungkin sebaliknya rekursifg
dapat dilakukan dif
.sumber
g(k)
melebihik*k
kapank = 47000
dan di atas.Perl 6 ,
9593 byte(0 indeks berbasis)
Uji:
Penjelasan:
sumber
Python 3,
175170148 byteBerkat @ Dennis untuk -22 byte
Mengambil input dari STDIN dan mencetak ke STDOUT. Ini satu-diindeks. Menghitung jangka waktu ke-100 kira-kira membutuhkan sepersepuluh detik.
Bagaimana itu bekerja
Cobalah di Ideone
sumber
Python 2,
120107 byteUji di Ideone .
Bagaimana itu bekerja
Kami menginisialisasi F sebagai tuple (2, 3) (dua angka Fibonacci pertama lebih besar dari 1 ), k sebagai 0 dan n sebagai bilangan bulat yang dibaca dari STDIN.
Sementara n adalah positif, kami melakukan hal berikut:
Tambah jumlah Fibonacci berikutnya, dihitung sebagai F [k] + F [-1] , yaitu, jumlah dari dua elemen terakhir dari F ke tupel F .
Peningkatan k .
Kurangi g (k) dari n .
g mengembalikan 1 jika dan hanya jika k adalah produk dari angka Fibonacci, jadi begitu n mencapai 0 , k adalah angka Fibonacci ke- n dan kami mencetaknya ke STDOUT.
g mencapai tujuannya sebagai berikut.
Jika k adalah 1 , ini adalah produk dari angka Fibonacci, dan
1/k
pastikan kami mengembalikan 1 .Jika k lebih besar dari 1 , kita sebut
g(k/i)
rekursif untuk semua nomor Fibonacci saya di F .g(k/i)
secara rekursif menguji apakah k / i adalah produk angka Fibonacci. Jikag(k/i)
pengembalian 1 dan i membagi k secara merata, k% i = 0 dan syaratk%i<g(k/i)
berlaku, maka g akan mengembalikan 1 jika dan hanya jika ada bilangan Fibonacci sehingga k adalah produk dari bilangan Fibonacci dan produk lain dari bilangan Fibonacci.sumber
JavaScript (ES6), 136
Cukup lambat bermain golf dengan cara ini, istilah komputasi 100 dalam waktu sekitar 8 detik di PC saya.
Kurang golf dan lebih cepat juga (menghindari
eval
)Uji
sumber
Haskell, 123 byte
Sangat malas, tidak terbatas!
Mungkin bukan jalan pintas, tetapi saya harus mencoba pendekatan ini, generalisasi dari metode yang cukup terkenal untuk menghitung daftar nomor palu.
f
adalah daftar angka fibonacci mulai dari 2. Untuk singkatnya, katakanlah bahwa lol (daftar daftar) adalah daftar tak terbatas dari daftar tak terbatas yang diurutkan, diurutkan berdasarkan elemen pertama mereka.m
adalah fungsi untuk menggabungkan lol, menghapus duplikat. Ia menggunakan dua fungsi pembantu infiks.?
menyisipkan daftar diurutkan tak terbatas ke dalam lol.#
menghapus nilai dari lol yang mungkin muncul sebagai kepala daftar pertama, memasukkan kembali daftar yang tersisa?
.Akhirnya,
l
adalah daftar angka yang merupakan produk dari angka fibonacci, didefinisikan sebagai 1 diikuti oleh gabungan dari semua daftar yang diperoleh dengan mengalikannyal
dengan nomor fibonacci. Baris terakhir menyatakan fungsi yang diperlukan (seperti biasa tanpa mengikatnya ke nama, jadi jangan salin apa adanya) menggunakan!!
untuk mengindeks ke dalam daftar, yang membuat fungsi 0-diindeks.Tidak ada masalah menghitung angka 100 atau 100.000.
sumber
Sekam , 13 byte
Perhatikan bahwa Husk lebih baru dari tantangan ini. Namun itu dan fungsi yang paling berguna untuk golf ini (
Ξ
) tidak dibuat dengan tantangan ini.Cobalah online!
Versi yang lebih efisien untuk 14 byte:
Cobalah online!
sumber
Python 2,
129128125123121 byteUji di Ideone .
sumber