Latar Belakang
Sebagian besar dari Anda tahu angka Fibonacci . Beberapa dari Anda mungkin tahu bahwa semua bilangan bulat positif dapat direpresentasikan sebagai jumlah dari satu atau lebih angka Fibonacci yang berbeda, menurut Teorema Zeckendorf . Jika jumlah istilah dalam Representasi Zeckendorf optimal dari integer n
sendiri merupakan nomor Fibonacci, kami akan memanggil n
Fibonacci "diam-diam".
Sebagai contoh:
139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci
140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci
Catatan
- Representasi Zeckendorf yang optimal dapat ditemukan menggunakan algoritma serakah. Cukup ambil angka Fibonacci terbesar <= n dan kurangi dari n hingga Anda mencapai 0
- Semua angka Fibonacci dapat direpresentasikan sebagai jumlah dari 1 angka Fibonacci (sendiri). Karena 1 adalah angka Fibonacci, semua angka Fibonacci juga merupakan Fibonacci diam-diam.
Tantangan
Tantangan Anda adalah menulis program atau fungsi yang mengambil bilangan bulat dan mengembalikan apakah bilangan bulat itu adalah Fibonacci.
Memasukkan
Anda dapat mengambil input dalam format apa pun yang masuk akal. Anda dapat berasumsi bahwa input akan berupa bilangan bulat positif tunggal.
Keluaran
Keluarkan salah satu dari dua hasil berbeda untuk apakah input tersebut diam-diam merupakan Fibonacci. Contohnya termasuk True
/ False
, 1
/ 0
, dll.
Mencetak gol
Ini kode-golf , jadi jawaban tersingkat dalam byte menang! Celah standar dilarang.
Uji Kasus
Truthy (secretly Fibonacci)
1
2
4
50
140
300099
Falsey (NOT secretly Fibonacci)
33
53
54
139
118808
sumber
Jawaban:
JavaScript (Node.js) , 54 byte
Cobalah online!
sumber
Python 2 , 77 byte
Cobalah online!
Ini menggunakan teorema bahwa kedua deskripsi OEIS A003714 adalah setara:
Kami menghasilkan cukup * angka-angka seperti itu, dan kemudian digunakann ?” Dengan menghitung 1 dalam biner.
z
sebagai pemetaan dari bilangan bulat non-negatif ke “berapa banyak istilah dalam representasi Zeckendorf dariMaka tetap untuk memeriksa apakah
z[n]
adalah angka Fibonacci, yaituz[z[n]] == 1
.* Setidaknya,n2+ 1 terasa seperti cukup, dan eksperimen itu tampaknya cukup. Saya akan membuktikannya nanti.
sumber
bin(x)
. Anda juga dapat menghapus satu dengan mengubahrange(n*n+1)
kerange(n<<n)
. (Dengan asumsi 0 tidak valid)bin(x)
, haha. Dan, hm,1<<n
sudah jauh lebih dari cukup, tapi saya ingin menjaga runtime non-astronomiJelly , 15 byte
Tautan monadik yang menerima bilangan bulat non-negatif yang menghasilkan
1
jika "Fibonacci Diam-diam" dan0
sebaliknya.Cobalah online! (terlalu tidak efisien untuk kasus uji yang lebih besar)
Bagaimana?
sumber
R , 83 byte
Cobalah online!
sumber
C # (.NET Core) ,
12411598 byteCobalah online!
-3 byte: diubah saat loop ke untuk (terima kasih kepada Olivier Grégoire )
-6 byte: beralih kembali untuk menggunakan variabel, diinisialisasi b dan c di luar loop (terima kasih kepada Kevin Cruijssen )
-17 byte: perubahan kondisi di loop kedua untuk bergerak jika keluar dari loop dan bergabung dengan return, variabel b dan c digunakan kembali dalam loop terakhir (terima kasih kepada raznagul )
Tidak Disatukan:
sumber
for(;c<=a;b=c-b)c+=b;
akan menghemat 3 byte.{}
kurung loop Anda dan meletakkan semuanya di-for
loop. Selain itu, saya menambahkan variabelr
yang kami setel1
di Andaif(e==n)
dan kembali di akhir, jadi Anda hanya punya satureturn
.e<n
Anda dapat memindahkanif
ke setelah loop dan akibatnya menggabungkannya denganreturn
untuk 101 byte .b
danc
di loop terakhir dan menghapusd
dane
.Perl 6 , 58 byte
Cobalah online!
1, &[+] ... * > $_
hanyalah urutan Fibonacci, berhenti di tempat yang nyaman dan tidak terbatas (nomor input).$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0
adalah urutan angka, dimulai dengan angka input, dan setiap elemen berturut-turut diperoleh dengan mengurangi angka Fibonacci terbesar kurang dari atau sama dengan elemen sebelumnya dari elemen sebelumnya. Urutan berakhir ketika0
tercapai. Sebagai contoh, jika$_
ini140
, maka urutan ini adalah140, 51, 17, 4, 1, 0
.Mengurangkan satu dari urutan ini memperlakukannya sebagai angka, panjangnya, dan perbedaannya adalah jumlah angka Fibonacci yang, ditambah bersama-sama, memberikan nomor input. Kemudian nomor ini diperiksa untuk keanggotaan dalam urutan Fibonacci pertama.
sumber
&[+]
sebelumnya! Selamat menghemat tidak harus mendefinisikan dua istilah awalPerl 6 , 48 byte
Cobalah online!
Mengubah input menjadi daftar Representasi Zeckendorf berulang kali hingga mencapai satu nomor dan kemudian memeriksa apakah panjang urutannya kurang dari 4.
Fungsi Zenckendorf di tengah sebagian besar dari jawaban Sean dengan beberapa perbaikan.
Penjelasan:
Sebagai contoh, urutan untuk
2
yaitu2 1
karena2
sudah merupakan angka Fibonacci. Urutan untuk140
adalah140 5 1
, dan karena 5 adalah angka Fibonacci, ini mengembalikan nilai true. Urutan untuk33
adalah33 4 2 1
, dan karena4
bukan angka Fibonacci, urutannya adalah panjang 4.sumber
05AB1E , 14 byte
Cobalah online . Tidak ada paket tes untuk semua kasus uji, karena
counter_variable
tidak dapat diatur ulang ke 0 .. Namun saya memverifikasi semua dengan tangan, dan semuanya benar.Penjelasan:
CATATAN:
counter_variable
Akan5
untuk input139
dan6
untuk input140
, karena agarΔ
-loop untuk memeriksa stack tetap sama, tentu saja iterasi tambahan.sumber
Haskell , 64 byte
Cobalah online!
sumber
Retina 0.8.2 , 61 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Konversikan ke unary.
Hitung jumlah angka Fibonacci yang dibutuhkan.
Pergantian pertama berkaitan dengan angka Fibonacci yang setidaknya 2. Pada pass pertama,
\2
belum ada, tapi untungnya itu opsional, jadi kami tidak harus mencocokkannya.\1
juga tidak ada, tapi untungnya kami memiliki alternatif\G.
yang cocok dengan satu karakter di awal pertandingan. Keduanya\2
dan\1
karenanya mengambil nilai 1.Pada operan berikutnya,
\2
ada, jadi kami mencoba mencocokkannya. Kali ini jika gagal maka\1
juga gagal (karena lebih besar dari\2
), tetapi jika berhasil, yang(?>)
mencegah backtracking, jadi jika\2
cocok tetapi\1
tidak kita tidak coba saja\1
. (\G1
selalu gagal karena kami telah maju melewati awal tambalan.) Akhirnya\2
mengambil nilai sebelumnya\1
sementara\1
mengambil jumlah dari dua nilai.Karena itu, kami mencocokkan angka Fibonacci sebanyak yang kami bisa, menambahkan seiring berjalannya waktu. Karena jumlah parsial urutannya
1, 2, 3, 5...
adalah0, 1, 3, 6, 11...
2 lebih sedikit dari angka Fibonacci, kita selesaikan dengan mencocokkan 2 di akhir.Ini jelas gagal untuk mencocokkan 1 sendiri sehingga pergantian menangani kasus itu.
Konversikan ke unary.
Uji apakah ini adalah angka Fibonacci. Ini menggunakan ide yang sama dengan tes pertama tetapi menggunakan
^
alih-alih\G
dan kami juga harus mencocokkan dengan tepat, sehingga menggunakan tangkapan opsional sebagai pengganti pergantian sebagai pegolf (tetapi meningkatkan jumlah tangkapan 1).Retina , 35 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Konversikan ke unary.
Hitung jumlah angka Fibonacci yang dibutuhkan. (Looping konversi dan penghitungan menghemat satu byte lebih dari mendapatkan penghitungan di unary di tempat pertama.)
Lakukan langkah-langkah sebelumnya dua kali total. Ini mengambil hitungan angka Fibonacci yang diperlukan untuk menjumlahkan ke jumlah angka Fibonacci.
Jika angka itu diam-diam Fibonacci maka hasilnya adalah 1.
sumber
Python 2 ,
146137 byteCobalah online!
f () adalah fungsi rekursif yang mengembalikan nilai angka Fibonacci ke-n. Diambil dari jawaban ini .
g () adalah fungsi rekursif yang mengembalikan Representasi Zeckendorf dari angka yang diberikan sebagai daftar bilangan bulat.
Karena semua angka Fibonacci akan memiliki panjang pengembalian satu item dari g (), h () memeriksa apakah panjang g () dari g (n) == 1.
EDIT: Disimpan 9 byte berkat nedla2004 . Saya selalu lupa bahwa lambdas tidak selalu merupakan solusi terbaik ...
sumber
g
fungsi sehingga saya bisa mendefinisikanf(n-1)
ke variabel. Pasangan perubahan lain dari==
ke<
mana mereka adalah sama.