Kita semua akrab dengan urutan Fibonacci yang terkenal , yang dimulai dengan 0
dan 1
, dan setiap elemen adalah jumlah dari dua sebelumnya. Berikut adalah beberapa istilah pertama (OEIS A000045 ):
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Diberikan bilangan bulat positif , kembalikan nomor terdekat dari urutan Fibonacci, di bawah aturan ini:
Angka Fibonacci terdekat didefinisikan sebagai angka Fibonacci dengan perbedaan absolut terkecil dengan bilangan bulat yang diberikan. Misalnya,
34
adalah bilangan Fibonacci terdekat30
, karena|34 - 30| = 4
, yang lebih kecil dari bilangan terdekat kedua21
, untuk itu|21 - 30| = 9
.Jika bilangan bulat yang diberikan milik urutan Fibonacci, angka Fibonacci terdekat adalah dirinya sendiri. Sebagai contoh, angka Fibonacci terdekat
13
adalah tepat13
.Dalam kasus seri, Anda dapat memilih untuk menampilkan salah satu dari nomor Fibonacci yang keduanya paling dekat dengan input atau hanya output keduanya. Misalnya, jika input
17
, semua berikut ini adalah valid:21
,13
atau21, 13
. Jika Anda mengembalikan keduanya, harap sebutkan formatnya.
Berlaku celah default . Anda dapat mengambil input dan memberikan output melalui metode standar apa pun . Program / fungsi Anda hanya harus menangani nilai hingga 10 8 .
Uji Kasus
Input -> Output 1 -> 1 3 -> 3 4 -> 3 atau 5 atau 3, 5 6 -> 5 7 -> 8 11 -> 13 17 -> 13 atau 21 atau 13, 21 63 -> 55 101 -> 89 377 -> 377 467 -> 377 500 -> 610 1399 -> 1597
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte di setiap bahasa menang!
n
menyiratkann β₯ 1
.Jawaban:
Python 2 , 43 byte
Cobalah online!
Iterasi melalui pasangan angka Fibonacci berturut-turut
(a,b)
sampai mencapai satu di mana inputn
kurang dari titik tengahnya(a+b)/2
, lalu kembalia
.Ditulis sebagai sebuah program (47 byte):
Panjang yang sama :
sumber
Neim , 5 byte
Penjelasan:
Dalam versi terbaru dari Neim, ini dapat di-golf hingga 3 byte:
Karena daftar yang tak terbatas telah dikerjakan ulang untuk hanya naik ke nilai maksimumnya.
Cobalah online!
sumber
Python ,
5552 byteCobalah online!
sumber
R ,
7067646260 byte-2 byte terima kasih kepada djhurio!
-2 byte lebih banyak berkat djhurio (boy can he golf!)
Karena kita hanya perlu menangani nilai hingga
10^8
, ini berfungsi.Cobalah online!
Baca
n
dari stdin. yangwhile
lingkaran menghasilkan angka fibonacci diF
(dalam urutan menurun); dalam hal seri, yang lebih besar dikembalikan. Ini akan memicu sejumlah peringatan karenawhile(F<1e8)
hanya mengevaluasi pernyataan untuk elemen pertamaF
dengan peringatanAwalnya saya menggunakan
F[which.min(abs(F-n))]
, pendekatan naif, tetapi @djhurio menyarankan(F-n)^2
karena pemesanan akan sama, danorder
bukannyawhich.min
.order
mengembalikan permutasi indeks untuk memasukkan inputnya ke dalam urutan yang meningkat, jadi kita harus[1]
pada akhirnya hanya mendapatkan nilai pertama.versi lebih cepat:
hanya menyimpan dua angka fibonacci terakhir
sumber
F=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
F=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
numbers::fibonacci(x<-scan(),T)
JavaScript (ES6), 41 byte
Digabungkan oleh preferensi.
sumber
f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)
Karena Anda tidak harus bekerja dengan 0, Anda bisa bermain golf lebih banyak.Jelly ,
97 byte-2 byte terima kasih kepada @EriktheOutgolfer
Cobalah online!
Selamat datang tips golf :). Mengambil int untuk input dan mengembalikan int-list.
sumber
Β΅αΈ’
.Mathematica, 30 byte
Cobalah online!
sumber
x86-64 Kode Mesin, 24 byte
Byte kode di atas menentukan fungsi dalam kode mesin x86 64-bit yang menemukan angka Fibonacci terdekat dengan nilai input yang ditentukan,
n
,.Fungsi mengikuti konvensi pemanggilan Sistem V AMD64 (standar pada sistem Gnu / Unix), sehingga parameter tunggal (
n
) dilewatkan dalamEDI
register, dan hasilnya dikembalikan dalamEAX
register.Mnemonik perakitan tidak dikumpulkan:
Cobalah online!
Kode ini pada dasarnya membagi menjadi tiga bagian:
EAX
diatur ke 0, danEDX
diatur ke 1.Bagian selanjutnya adalah loop yang secara iteratif menghitung angka Fibonacci di kedua sisi nilai input
n
,. Kode ini didasarkan pada implementasi Fibonacci saya sebelumnya dengan pengurangan , tapi ... um ... tidak dengan pengurangan. :-) Secara khusus, ia menggunakan trik yang sama untuk menghitung angka Fibonacci menggunakan dua variabel β ini, ini adalahEAX
danEDX
register. Pendekatan ini sangat nyaman di sini, karena memberi kita angka Fibonacci yang berdekatan. Kandidat berpotensi kurang darin
ditahanEAX
, sedangkan kandidat berpotensi lebih besar darin
yang ditahan diEDX
. Saya cukup bangga dengan betapa ketatnya saya dapat membuat kode di dalam loop ini (dan bahkan lebih menggelitik bahwa saya menemukannya kembali secara mandiri, dan hanya kemudian menyadari betapa miripnya dengan jawaban pengurangan yang terkait di atas).Setelah kami memiliki nilai Fibonacci kandidat yang tersedia
EAX
danEDX
, itu adalah masalah yang secara konseptual sederhana untuk mencari tahu mana yang lebih dekat (dalam hal nilai absolut)n
. Benar-benar mengambil nilai absolut akan biaya cara terlalu banyak byte, jadi kami hanya melakukan serangkaian pengurangan yang. Komentar di sebelah kanan instruksi langkah kondisional kedua dari belakang tepat menjelaskan logika di sini. Ini bisa bergerakEDX
keEAX
, atau pergiEAX
sendiri, sehingga ketika fungsiRET
menyala, angka Fibonacci terdekat dikembalikanEAX
.Dalam kasus seri, yang lebih kecil dari dua nilai kandidat dikembalikan, karena kami menggunakan
CMOVG
alih-alihCMOVGE
melakukan seleksi. Ini adalah perubahan sepele, jika Anda lebih suka perilaku lainnya. Mengembalikan kedua nilai itu bukan hal baru, namun; hanya satu hasil integer!sumber
nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-
memangkas beberapa kolom antara kode mesin dan sumber dalam jawaban baru-baru ini.xor eax,eax
/cdq
/inc edx
. Jadi, Anda bisa membuat versi konvensi panggilan-panggilan 32-bit yang menghemat satu byte.cdq
banyak jawaban kode-golf. Konvensi panggilan khusus tidak diperlukan. Saya biasanya menggunakan__fastcall
konvensi pemanggilan Microsoft untuk kode 32-bit. Yang menyenangkan tentang ini adalah didukung oleh GCC dengan anotasi, jadi Anda masih dapat menggunakan layanan TIO yang ingin dilihat semua orang.edi
/esi
untuklodsb
/stosb
, dan hanya x86-64 SysV yang melakukan itu (fakta menyenangkan: sengaja karena alasan itu, karena beberapa fungsi meneruskan argumen mereka ke memset / memcpy, dan saya kira gcc pada saat itu suka untuk inline string ops).PowerShell ,
8074 byte(Cobalah secara online! Untuk sementara tidak merespons)
Solusi berulang. Mengambil input
$n
, menetapkan$a,$b
menjadi1,0
, dan kemudian loop dengan Fibonacci hingga$a
lebih besar dari input. Pada titik itu, kami mengindeks($b,$a)
berdasarkan pada Boolean apakah perbedaan antara elemen pertama dan$n
lebih besar dari antara$n
elemen kedua. Yang tersisa di pipa, output tersirat.sumber
JavaScript (ES6), 67 byte
Uji kasus
Tampilkan cuplikan kode
sumber
JavaScript (Babel Node) , 41 byte
Berdasarkan jawaban Python yang luar biasa ovs
Cobalah online!
Tidak disatukan
sumber
0
(not that it needs to; I just want it to):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Python, 74 bytes
Try it online!
How it works
For all k β₯ 0, since |Οβk/β5| < 1/2, Fk = Οk/β5 + Οβk/β5 = round(Οk/β5). So the return value switches from Fk β 1 to Fk exactly where k = logΟ(nβ 2β5) β 1, or n = Οk + 1/(2β5), which is within 1/4 of Fk + 1/2 = (Fk β 1 + Fk)/2.
sumber
05AB1E, 6 bytes
Try it online!
sumber
C (gcc),
86858376 bytesTry it online!
sumber
Java (OpenJDK 8),
605756 bytesTry it online!
-1 byte thanks to @Neil
sumber
Python 3, 103 bytes
Try it online!
Sadly, had to use a def instead of lambda... There's probably much room for improvement here.
Original (incorrect) answer:
Python 3, 72 bytesTry it online!
My first PPCG submission. Instead of either calculating Fibonacci numbers recursively or having them predefined, this code uses how the n-th Fibonacci number is the nearest integer to the n-th power of the golden ratio divided by the root of 5.
sumber
nearest_fib_PM2R
function I linked in my comment on the question.Taksi, 2321 byte
Cobalah online!
Cobalah online dengan komentar!
Berhenti bermain golf dengan komentar:
sumber
Python 3 , 84 byte
Cobalah online!
Ini mungkin bekerja, tetapi tentu saja tidak cepat ...
Output
True
bukan1
, tetapi dalam Python ini sama.sumber
dc, 52 byte
Cobalah online!
Mengambil input saat dijalankan menggunakan?
Diedit untuk menganggap puncak tumpukan sebagai nilai input, -1 byte.
Input disimpan dalam register
i
. Kemudian kita meletakkan 1 dan 1 pada tumpukan untuk memulai urutan Fibonacci, dan kita menghasilkan urutan sampai kita mencapai nilai yang lebih besar darii
. Pada titik ini kita memiliki dua angka dalam urutan Fibonacci pada tumpukan: satu yang kurang dari atau sama dengani
, dan satu yang lebih besar darii
. Kami mengonversinya menjadi perbedaan masing-masing dengani
dan kemudian membandingkan perbedaannya. Akhirnya kami merekonstruksi angka Fibonacci dengan menambahkan atau mengurangi perbedaannyai
.Ups, saya memuat dua register dalam urutan yang salah dan kemudian menukarnya, membuang satu byte.
sumber
C # (.NET Core) ,
6356 bytes-1 byte thanks to @Neil
-6 byte terima kasih kepada @Nevay
Cobalah online!
sumber
for(;b<n;a=b,b+=c)c=a;
menghemat satu byte?c
dengan menggunakanb+=a,a=b-a
(harus menyimpan 6 byte).Q / KDB +, 51 byte
sumber
Hexagony , 37 byte
Cobalah online!
ungolfed:
Rusak:
Seperti beberapa poster lainnya, saya menyadari bahwa ketika titik tengah terakhir dan arus lebih besar dari target, yang lebih kecil dari keduanya adalah yang terdekat atau terikat untuk yang terdekat.
Titik tengahnya adalah pada (arus + arus terakhir) / 2. Kita dapat mempersingkatnya karena berikutnya sudah + terakhir mengalir, dan jika kita gandakan bilangan target kita dengan 2, kita hanya perlu memeriksa itu (berikutnya - 2 * target)> 0, lalu kembali terakhir.
sumber
Brachylog , 22 byte
Cobalah online!
Benar-benar semua yang saya lakukan di sini adalah menyisipkan bersama klasik Fatalize. Mengembalikan solusi bilangan prima terdekat dan saya sendiri. Apakah saya nomor Fibonacci? larutan. Untungnya, yang terakhir sudah beroperasi pada variabel output; sayangnya, itu juga termasuk potongan yang diperlukan yang harus diisolasi untuk +2 byte, jadi satu-satunya titik pilihan yang dibuang adalah
β±
, membiarkannyaβ
tetap utuh.sumber
Japt
-g
, 8 byteCobalah
sumber
Java 7,
244234 Bytessumber
static
jika Anda ingin tetap menggunakan Java 7.r>c&&s<c
seharusnyar>=c&&s<=c
,s-c
seharusnyac-s
), Anda dapat menghapus spasi yang tidak diperlukan, menggunakanint f(int i){return i<2?i:f(--i)+f(--i);}
, menggunakan pernyataan pengembalian tunggal dengan operator ternary di c dan menghapus penanganan khusus karenac-s==r-c
mengembalikan salah satu nilai yang diizinkan.Pyke , 6 byte
Cobalah online!
sumber
Common Lisp, 69 byte
Cobalah online!
sumber
Perl 6 , 38 byte
Menguji
Untuk potensi percepat tambahkan
.tail(2)
sebelumnya.sort(β¦)
.Dalam kasus dasi, itu akan selalu mengembalikan yang lebih kecil dari dua nilai, karena
sort
merupakan jenis yang stabil. (dua nilai yang akan mengurutkan yang sama menjaga urutannya)sumber
Pyth, 19 byte
Coba di sini
Penjelasan
sumber
Haskell, 48 byte
Cobalah online!
sumber