Tugas Anda:
Tulis program atau fungsi untuk memeriksa apakah angka yang dimasukkan adalah angka Fibonacci . Angka Fibonacci adalah angka yang terkandung dalam urutan Fibonacci.
Fibonacci Sequence didefinisikan sebagai:
F(n) = F(n - 1) + F(n - 2)
Dengan benih sedang F(0) = 0
dan F(1) = 1
.
Memasukkan:
Integer non-negatif antara 0 dan 1.000.000.000 yang mungkin atau mungkin bukan angka Fibonacci.
Keluaran:
Nilai kebenaran / kepalsuan yang menunjukkan apakah input adalah angka Fibonacci atau tidak.
Contoh:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Mencetak:
Ini adalah kode-golf , kemenangan jumlah byte terendah.
code-golf
sequence
decision-problem
fibonacci
Gryphon - Pasang kembali Monica
sumber
sumber
Jawaban:
Neim , 2 byte
Penjelasan:
Bekerja sama seperti itu Hip saya menjadi jawaban Square , tetapi menggunakan daftar infinite yang berbeda:,
f
untuk fibonacci.Cobalah!
sumber
66 D5
JavaScript (ES6), 34 byte
Secara rekursif menghasilkan urutan Fibonacci hingga menemukan item lebih besar dari atau sama dengan input, lalu mengembalikan item == input.
sumber
Retina , 23 byte
Cobalah online!
Input di unary, output
0
atau1
.Penjelasan
Urutan Fibonacci adalah kandidat yang baik untuk solusi dengan referensi ke depan, yaitu "backreference" yang merujuk baik ke kelompok sekitarnya atau yang muncul kemudian di regex (dalam hal ini, kami sebenarnya menggunakan keduanya). Saat mencocokkan angka seperti ini, kita perlu mencari tahu ekspresi rekursif untuk perbedaan antara elemen urutan. Misalnya, untuk mencocokkan angka segitiga, kami biasanya cocok dengan segmen sebelumnya ditambah satu. Untuk mencocokkan angka kuadrat (yang perbedaannya adalah angka ganjil), kami cocok dengan segmen sebelumnya ditambah dua.
Karena kita memperoleh angka-angka Fibonacci dengan menambahkan elemen kedua-ke-terakhir ke yang terakhir, perbedaan di antara mereka juga hanya angka-angka Fibonacci. Jadi kita harus mencocokkan setiap segmen sebagai jumlah dari dua segmen sebelumnya. Inti dari regex adalah ini:
Sekarang ini berakhir sampai menambah angka Fibonacci mulai dari 1 , yaitu 1, 1, 2, 3, 5, ... . Mereka add sampai dengan 1, 2, 4, 7, 12, ... . Yaitu mereka satu kurang dari angka Fibonacci, jadi kami menambahkan
1
di akhir. Satu-satunya kasus ini tidak mencakup adalah nol, jadi kami memiliki^$
alternatif di awal untuk membahas itu.sumber
^$|^(^1|\2?+(\1))*1$
^
.Regex (ECMAScript flavour),
392358328224206165 byteTeknik-teknik yang perlu ikut bermain untuk mencocokkan angka Fibonacci dengan regex ECMAScript (dalam unary) jauh dari cara terbaik dilakukan dalam kebanyakan rasa regex lainnya. Kurangnya referensi atau rekursi maju / bersarang berarti bahwa tidak mungkin untuk secara langsung menghitung atau menjaga total apa pun yang berjalan. Kurangnya tampilan membuatnya sering menjadi tantangan bahkan untuk memiliki cukup ruang untuk bekerja.
Banyak masalah harus didekati dari perspektif yang sama sekali berbeda, dan tampaknya tidak dapat diatasi sampai kedatangan beberapa wawasan kunci. Ini memaksa Anda untuk menggunakan jaring yang jauh lebih luas dalam menemukan properti matematika mana dari angka-angka yang Anda kerjakan yang mungkin dapat digunakan untuk membuat masalah tertentu dapat dipecahkan.
Pada bulan Maret 2014, inilah yang terjadi untuk angka Fibonacci. Melihat halaman Wikipedia, pada awalnya saya tidak bisa menemukan jalan, meskipun satu properti tertentu tampak sangat menggoda. Kemudian teukon matematik menguraikan metode yang membuatnya cukup jelas akan mungkin dilakukan, menggunakan properti itu bersama dengan yang lain. Dia enggan untuk benar-benar membangun regex. Reaksinya ketika saya melanjutkan dan melakukannya:
Seperti posting ECMAScript regex matematika unary saya yang lain, saya akan memberikan peringatan: Saya sangat merekomendasikan belajar bagaimana menyelesaikan masalah matematika unary di ECMAScript regex. Ini merupakan perjalanan yang menarik bagi saya, dan saya tidak ingin merusaknya bagi siapa pun yang mungkin ingin mencobanya sendiri, terutama mereka yang tertarik pada teori bilangan. Lihat posting itu untuk daftar masalah yang direkomendasikan untuk ditandai dengan spoiler bertanda satu per satu.
Jadi jangan membaca lebih jauh jika Anda tidak ingin beberapa sihir regex unary dimanjakan untuk Anda . Jika Anda ingin mencoba mencari tahu sendiri keajaiban ini, saya sangat menyarankan memulai dengan menyelesaikan beberapa masalah dalam ECMAScript regex sebagaimana diuraikan dalam pos yang ditautkan di atas.
Tantangan yang awalnya saya hadapi: Bilangan bulat positif x adalah angka Fibonacci jika dan hanya jika 5x 2 + 4 dan / atau 5x 2 - 4 adalah kuadrat sempurna. Tetapi tidak ada ruang untuk menghitung ini dalam suatu regex. Satu-satunya tempat kita harus bekerja adalah angka itu sendiri. Kami bahkan tidak memiliki cukup ruang untuk mengalikan dengan 5 atau mengambil kuadrat, apalagi keduanya.
ide teukon tentang bagaimana menyelesaikannya ( awalnya diposting di sini ):
Dan di sini adalah mockup dari algoritma di C yang saya tulis sebagai tes sebelum mengimplementasikannya di regex.
Jadi tanpa basa-basi lagi, inilah regex:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Cobalah online!
Dan versi komentar yang dicetak cantik:
Algoritma multiplikasi tidak dijelaskan dalam komentar-komentar itu, tetapi dijelaskan secara singkat dalam paragraf posting regex angka saya yang berlimpah .
Saya mempertahankan enam versi berbeda dari regex Fibonacci: empat ratchet dari panjang terpendek ke kecepatan tercepat dan menggunakan algoritma yang dijelaskan di atas, dan dua lainnya yang menggunakan algoritma yang berbeda, jauh lebih cepat tetapi jauh lebih panjang, yang seperti yang saya temukan sebenarnya dapat kembali indeks Fibonacci sebagai pertandingan (menjelaskan bahwa algoritma di sini berada di luar cakupan posting ini, tetapi dijelaskan dalam Gist diskusi asli ). Saya tidak berpikir saya akan mempertahankan versi regex yang sangat mirip lagi, karena pada saat itu saya sedang melakukan semua pengujian di PCRE dan Perl, tetapi mesin regex saya cukup cepat sehingga masalah kecepatan tidak lagi penting (dan jika konstruk tertentu menyebabkan kemacetan, saya dapat menambahkan pengoptimalan untuk itu) - walaupun saya mungkin akan mempertahankan satu versi tercepat dan satu versi terpendek, jika perbedaannya dalam kecepatan cukup besar.
Versi "mengembalikan indeks Fibonacci minus 1 sebagai kecocokan" (tidak banyak golf):
Cobalah online!
Semua versi ada di github dengan riwayat komit penuh optimasi golf:
regex untuk pencocokan angka Fibonacci - pendek, kecepatan 0.txt (yang terpendek tetapi paling lambat, seperti dalam posting ini)
regex untuk pencocokan angka Fibonacci - pendek, kecepatan 1.txt
regex untuk pencocokan angka Fibonacci - pendek, kecepatan 2.txt
regex untuk pencocokan angka Fibonacci - pendek, kecepatan 3.txt
regex untuk mencocokkan angka Fibonacci - regex tercepat.txt
untuk mencocokkan angka Fibonacci - return index.txt
sumber
Python 3 , 48 byte
Cobalah online!
sumber
int
akan mengatur bilah lebih tinggi (masih tidak besar sembarang), tetapi kami juga tidak memaksa jawaban C untuk menggunakan bilangan bulat 64-bit (atau 128-bit dengan gcc). Bagaimanapun, diizinkan untuk menggunakan algoritma yang sama dalam satu bahasa tetapi tidak yang lain tampaknya tidak masuk akal.Python 2,
4844 byteCobalah online
Terima kasih kepada Jonathan Allan karena telah menghemat 4 byte
sumber
False
dan nilai salahTrue
: TIO!n-a
sebagai penggantin==a
dan memiliki -1 dan 0 sebagai nilai pengembalian Anda.-101
atau beberapa hasil lainnya sebagai gantinya-1
.05AB1E ,
87 bytePenjelasan:
Cobalah online!
-1 terima kasih kepada Jonathan Allan untuk solusi 0-bukan-fibonacci-nomor.
sumber
n
(menyimpan byte) sepertiÅF
inklusif dan¹å
akan menghasilkan apa pun0
untukn=0
?Perl 6 , 23 byte
sumber
{(0,1,*+*...^*>$_).tail==$_}
adalah apa yang akan saya posting pada awalnya. Saya mungkin sempat untuk mengatur operator pada akhirnya.Serius , 3 byte
Cobalah online!
Mengembalikan indeks +1 dalam daftar angka Fibonacci jika benar, jika tidak mengembalikan falsy.
Penjelasan:
sumber
Jelly ,
8 76 byteCobalah online!
Bagaimana?
Catatan:
‘
, diperlukan agar karya ini untuk 2 dan 3 , karena mereka adalah 3 rd dan 4 th nomor Fibonacci - melampaui 3 semua nomor Fibonacci lebih besar dari indeks mereka.-
diperlukan (bukan hanya‘R
) sehingga karya ini untuk 0 karena 0 adalah 0 th nomor Fibonacci;sumber
3
:)ZX81 BASIC
180151100~ 94 byte BASIC tokenizedDengan terima kasih kepada Moggy di forum SinclairZXWorld, berikut ini adalah solusi yang jauh lebih rapi yang menghemat lebih banyak byte.
Ini akan menghasilkan 1 jika angka Fibonacci dimasukkan, atau nol jika tidak. Meskipun ini menghemat byte, ini jauh lebih lambat daripada solusi lama di bawah ini. Untuk kecepatan (tetapi lebih banyak byte BASIC), lepaskan
VAL
pembungkus di sekitar angka literal string. Inilah solusi lama dengan beberapa penjelasan:Amandemen di atas menyimpan byte BASIC lebih lanjut untuk mengkondensasi
IF
pernyataan menjadi satuPRINT
baris 12; byte lainnya disimpan dengan menggunakanVAL
kata kunci dan, dan menggunakanGOTO CODE "£"
, yang dalam set karakter ZX81 adalah 12. String menyimpan lebih banyak byte atas angka karena semua nilai numerik disimpan sebagai float sehingga mengambil lebih banyak ruang di tumpukan VAR.sumber
5 IF R<F THEN NEXT I
- buruk saya!C #, 109 byte
Pasti bisa ditingkatkan, tetapi saya tidak punya waktu.
sumber
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(hanya 80 byte). Cobalah online!a+=b
alih - aliha=a+b
danb+=a
bukannyab=a+b
.> <> ,
2119 + 3 =2422 byteInput diharapkan berada di stack saat program dimulai, jadi +3 byte untuk
-v
flag.Cobalah online!
Ini bekerja dengan menghasilkan angka-angka Fibonacci sampai lebih besar atau sama dengan angka input, kemudian memeriksa angka yang dihasilkan terakhir untuk kesetaraan dengan input. Output
1
jika itu adalah angka Fibonacci,0
jika tidak.Untuk memastikan bahwa
0
ditangani dengan benar, seed adalah-1 1
- angka pertama yang dihasilkan akan0
lebih daripada1
.Terima kasih kepada @cole untuk menunjukkan bahwa
i
dapat digunakan untuk mendorong-1
ke stack ketika STDIN kosong. Sangat pintar!Versi sebelumnya:
sumber
i
bukan01-
.i
seperti-1
ketika tidak ada input ke STDIN, saya tidak akan mempertimbangkan itu. Bagus sekali!Mathematica, 37 byte
-4 byte dari @ngenisis
sumber
Fibonacci[0]
memberi0
, sehingga Anda dapat menyimpan4
byte dengan memasukkan0
dalamTable
kisaran. Anda dapat menyimpan byte lain menggunakan notasi infiks untukTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 byte)
Cobalah online!
Bukan solusi golf, tetapi ingin menggunakan metode langsung memeriksa apakah "5 * x ^ 2 +/- 4" adalah kotak yang sempurna .
Penjelasan:
catatan:
Dalam kasus "0" ia mengembalikan "2" karena baik 4 dan -4 adalah kuadrat sempurna, sama dengan 1 yang menghasilkan "1 1". Anggap output non-nol sebagai "benar", dan 0 sebagai "palsu".
sumber
Pari / GP , 32 byte
Cobalah online!
sumber
PHP , 44 byte
Cobalah online!
PHP , 58 byte
Cobalah online!
sumber
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 byteUji sendiri!
Alternatif (masih 49 byte)
Tidak terlalu orisinal: ini versi iteratif yang polos dan dasar.
Ini berfungsi untuk angka hingga 1,836,311,903 (nomor fibonacci ke-47) disertakan. Di atas itu, hasilnya tidak terdefinisi (termasuk loop infinite potensial).
Terima kasih kepada Kevin Cruijssen dan David Conrad karena membantu bermain golf :)
sumber
n==0
ken<1
. Dalam pertanyaan itu menyatakan " Bilangan bulat non-negatif antara 0 dan 1.000.000.000 ".b+=a;a=b-a;
C # (.NET Core) , 51 byte
Cobalah online!
-6 byte terima kasih kepada @Oliver!
Solusi ini menggunakan fungsi rekursif yang cukup mudah.
n
adalah angka yang akan diuji.a
danb
merupakan 2 angka terbaru dalam urutan.TIO link menunjukkan ini berfungsi untuk 1134903170 yang melebihi nilai maksimum yang dibutuhkan oleh tantangan.
sumber
a<n
untuk 51 byteAlchemist ,
205134 byteTerima kasih besar kepada ASCII-only untuk penggabungan yang agak pintar, menghemat 71 byte !!
Cobalah secara online atau verifikasi dalam batch!
Tidak disatukan
sumber
0
cek untuk byte lebih sedikit dengan biaya nondeterminismeb
-atom pada perbaikan inisialisasi itu (dan menyimpan 2 byte): D Terima kasihJelly , 5 byte
Cobalah online!
Mengembalikan 0 untuk angka-angka non-Fibonacci, dan posisi 1-diindeks dari angka dalam urutan Fibonacci untuk angka-angka Fibonacci.
Penjelasan:
sumber
Dyalog APL, 17 byte
Cobalah online!
sumber
R,
4340 bytepryr::f
menciptakan fungsi:Menggunakan
DescTools::Fibonacci
untuk membuatx+1
angka-angka fibonacci pertama dan memeriksa untuk dimasukkan.x+1
karena fibnum ketiga adalah 2, dan itu tidak akan cukup untuk memeriksa dimasukkannya 3.Untungnya
Desctools::Fibonacci(0)=0
, itu adalah freebee yang bagus.-3 byte terima kasih kepada MickyT
sumber
-1:x+1
akan menghemat satu byte, tetapi0:45
akan menghemat tiga dan mencakup rentang yang diperlukanpryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 byte
Cobalah online! Ini mengeksploitasi fakta bahwa input akan berada dalam kisaran 0 hingga 1.000.000.000, maka kita perlu memeriksa hanya 45 angka Fibonacci pertama.
f=0:scanl(+)1f
menghasilkan daftar angka Fibonacci yang tak terbatas,take 45f
adalah daftar 45 angka Fibonacci pertama danelem
memeriksa apakah input ada dalam daftar ini.Versi tidak terbatas: 36 byte
Cobalah online! Untuk apa pun
n
, ambil yang pertaman+3
angka Fibonacci akan menjamin itun
akan ada dalam daftar ini jika itu adalah nomor Fibonacci.Perhatikan bahwa pendekatan ini luar biasa tidak efisien untuk angka tinggi yang bukan angka Fibonacci, karena semua
n+3
angka Fibonacci perlu dihitung.sumber
Javascript (ES6 tanpa operator **), 44 byte
Bergantung pada rasio antara angka Fibonacci berturut-turut mendekati rasio emas. Nilai c adalah bagian fraksional dari input dibagi dengan rasio emas - jika inputnya adalah Fibonacci maka ini akan sangat dekat dengan 1 dan nilai c-c² akan sangat kecil.
Tidak sesingkat beberapa jawaban JS lainnya tetapi berjalan dalam O (1) waktu.
sumber
Julia 0,4 , 29 byte
Cobalah online!
Jika ini bukan bagaimana Anda melakukan jawaban Julia, beri tahu saya. Saya tidak yakin bagaimana input bekerja pada TIO.
sumber
!m=
) atau lambda (menghitungm->
). Lebih penting lagi, ini gagal untuk 0 apa adanya.R,
3231 byteMengambil input dari stdin, mengembalikan
TRUE
atauFALSE
jika perlu.sumber
Common Lisp,
6154 byteCobalah online!
Pengurangan ukuran sehubungan dengan versi sebelumnya:
dipicu oleh gagasan bahwa untuk menghasilkan urutan angka Fibonacci hanya diperlukan dua variabel, bukan tiga.
sumber
Mathematica, 33 byte
sumber
@*
(dan kemudian menjatuhkan final@#&
)JS (ES6), 57 byte
Menggunakan metode carusocomputing . Banyak pegolf daripada jawaban saya yang lain .
Tidak disatukan
sumber