Temukan Nomor Fibonacci terdekat


30

Kita semua akrab dengan urutan Fibonacci yang terkenal , yang dimulai dengan 0dan 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, 34adalah bilangan Fibonacci terdekat 30, karena |34 - 30| = 4, yang lebih kecil dari bilangan terdekat kedua 21, untuk itu |21 - 30| = 9.

  • Jika bilangan bulat yang diberikan milik urutan Fibonacci, angka Fibonacci terdekat adalah dirinya sendiri. Sebagai contoh, angka Fibonacci terdekat 13adalah tepat 13.

  • 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, 13atau 21, 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 , jadi kode terpendek dalam byte di setiap bahasa menang!



FWIW, berikut adalah beberapa kode Python pada SO untuk melakukan ini secara efisien untuk input besar, bersama dengan skrip yang dapat digunakan untuk menentukan waktu berbagai algoritma.
PM 2Ring

Apakah 0 dianggap sebagai bilangan bulat positif?
Alix Eisenhardt

@AlixEisenhardt No. Bilangan bulat positifn menyiratkan n β‰₯ 1.
Tn. Xcoder

Jawaban:


21

Python 2 , 43 byte

f=lambda n,a=0,b=1:a*(2*n<a+b)or f(n,b,a+b)

Cobalah online!

Iterasi melalui pasangan angka Fibonacci berturut-turut (a,b)sampai mencapai satu di mana input nkurang dari titik tengahnya (a+b)/2, lalu kembali a.

Ditulis sebagai sebuah program (47 byte):

n=input()
a=b=1
while 2*n>a+b:a,b=b,a+b
print a

Panjang yang sama :

f=lambda n,a=0,b=1:b/2/n*(b-a)or f(n,b,a+b)

15

Neim , 5 byte

f𝐖𝕖S𝕔

Penjelasan:

f       Push infinite Fibonacci list
 𝐖                     93
  𝕖     Select the first ^ elements
        This is the maximum amount of elements we can get before the values overflow
        which means the largest value we support is 7,540,113,804,746,346,429
   S𝕔   Closest value to the input in the list

Dalam versi terbaru dari Neim, ini dapat di-golf hingga 3 byte:

fS𝕔

Karena daftar yang tak terbatas telah dikerjakan ulang untuk hanya naik ke nilai maksimumnya.

Cobalah online!


Bagaimana ini 5 byte ketika ada 2 karakter di sana? Dan apa perbedaan antara solusi pertama dan kedua?
caird coinheringaahing

1
Apakah Anda menghitung byte atau karakter? Tampaknya yang pertama adalah 15 byte, dan yang kedua 7 byte.
Nateowami

Ini mungkin memiliki beberapa jenis codepage sendiri di mana setiap karakter adalah byte sendiri yang berarti yang pertama adalah 5 byte dan yang kedua adalah 3 byte. Perbedaan antara keduanya adalah bahwa yang pertama memilih 93 elemen manual pertama sedangkan snipet kedua dalam versi yang lebih baru secara otomatis memilih nilai setinggi mungkin yang dapat ditangani oleh ukuran bahasa
Roman GrΓ€f

1
@cairdcoinheringaahing Saya sering mengalami masalah dengan orang-orang yang tidak dapat melihat program saya. Cuplikan Layar
Okx

1
@ OKK Oh OK, menarik, saya tidak akan menebak.
Nateowami


8

R , 70 67 64 62 60 byte

-2 byte terima kasih kepada djhurio!

-2 byte lebih banyak berkat djhurio (boy can he golf!)

F=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]

Karena kita hanya perlu menangani nilai hingga 10^8, ini berfungsi.

Cobalah online!

Baca ndari stdin. yang whilelingkaran menghasilkan angka fibonacci di F(dalam urutan menurun); dalam hal seri, yang lebih besar dikembalikan. Ini akan memicu sejumlah peringatan karenawhile(F<1e8) hanya mengevaluasi pernyataan untuk elemen pertama Fdengan peringatan

Awalnya saya menggunakan F[which.min(abs(F-n))], pendekatan naif, tetapi @djhurio menyarankan (F-n)^2karena pemesanan akan sama, dan orderbukannya which.min. ordermengembalikan permutasi indeks untuk memasukkan inputnya ke dalam urutan yang meningkat, jadi kita harus [1]pada akhirnya hanya mendapatkan nilai pertama.

versi lebih cepat:

F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][β€Œβ€‹1]

hanya menyimpan dua angka fibonacci terakhir


1
Bagus -2 byteF=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
djhurio

1
Dan versi cepat dengan jumlah byte yang samaF=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
djhurio

1
@ Djurio bagus! Terima kasih banyak.
Giuseppe

1
Saya suka ini. -2 byte lagiF=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
djhurio

Menggunakan builtin untuk menghasilkan fibnums lebih pendek:numbers::fibonacci(x<-scan(),T)
JAD

6

JavaScript (ES6), 41 byte

f=(n,x=0,y=1)=>y<n?f(n,y,x+y):y-n>n-x?x:y
<input type=number min=0 value=0 oninput=o.textContent=f(this.value)><pre id=o>0

Digabungkan oleh preferensi.


Hampir identik dengan versi yang saya kerjakan. Setidaknya Anda tidak menggunakan nama variabel yang sama atau saya akan panik.
Grax32

@Grax Huh, sekarang Anda menyebutkannya, Kucing Bisnis mengalahkan saya untuk itu ...
Neil

(Yah, hampir ... Saya membuat versi saya berfungsi dengan 0, karena mengapa tidak?)
Neil

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.
Alix Eisenhardt

6

Jelly , 9 7 byte

-2 byte terima kasih kepada @EriktheOutgolfer

β€˜RΓ†αΈžαΊ‘ΓαΉ‚

Cobalah online!

Selamat datang tips golf :). Mengambil int untuk input dan mengembalikan int-list.

            ' input -> 4
β€˜           ' increment -> 5
 R          ' range -> [1,2,3,4,5]
  Γ†αΈž        ' fibonacci (vectorizes) -> [1,1,2,3,5,8]
     ÐṂ     ' filter and keep the minimum by:
    αΊ‘       ' absolute difference -> [3,3,2,1,1,4]
            ' after filter -> [3,5]

Anda bisa menghapus Β΅αΈ’.
Erik the Outgolfer

@EriktheOutgolfer seperti pada: "Ada cara untuk melakukannya jika Anda memikirkannya", atau seperti pada "Jika Anda benar-benar hanya mundur mereka masih berfungsi"?
nmjcman101

Seperti pada "itu diizinkan oleh aturan". : P
Erik the Outgolfer

Ah. Terima kasih! (Teks pengisi)
nmjcman101


5

x86-64 Kode Mesin, 24 byte

31 C0 8D 50 01 92 01 C2 39 FA 7E F9 89 D1 29 FA 29 C7 39 D7 0F 4F C1 C3

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 dalam EDIregister, dan hasilnya dikembalikan dalam EAXregister.

Mnemonik perakitan tidak dikumpulkan:

; unsigned int ClosestFibonacci(unsigned int n);
    xor    eax, eax        ; initialize EAX to 0
    lea    edx, [rax+1]    ; initialize EDX to 1

  CalcFib:
    xchg   eax, edx        ; swap EAX and EDX
    add    edx, eax        ; EDX += EAX
    cmp    edx, edi
    jle    CalcFib         ; keep looping until we find a Fibonacci number > n

    mov    ecx, edx        ; temporary copy of EDX, because we 'bout to clobber it
    sub    edx, edi
    sub    edi, eax
    cmp    edi, edx
    cmovg  eax, ecx        ; EAX = (n-EAX > EDX-n) ? EDX : EAX
    ret

Cobalah online!

Kode ini pada dasarnya membagi menjadi tiga bagian:

  • Bagian pertama sangat sederhana: itu hanya menginisialisasi register kerja kami. EAXdiatur 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 adalah EAXdan EDXregister. Pendekatan ini sangat nyaman di sini, karena memberi kita angka Fibonacci yang berdekatan. Kandidat berpotensi kurang dari n ditahan EAX, sedangkan kandidat berpotensi lebih besar dari n 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 EAXdan EDX, 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 bergerak EDXke EAX, atau pergi EAXsendiri, sehingga ketika fungsi RETmenyala, angka Fibonacci terdekat dikembalikan EAX.

Dalam kasus seri, yang lebih kecil dari dua nilai kandidat dikembalikan, karena kami menggunakan CMOVGalih-alih CMOVGEmelakukan seleksi. Ini adalah perubahan sepele, jika Anda lebih suka perilaku lainnya. Mengembalikan kedua nilai itu bukan hal baru, namun; hanya satu hasil integer!


Daftar NASM bagus untuk jawaban codegolf, karena mereka mencampur byte kode mesin dengan sumber komentar asli agak kompak. Saya biasa nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-memangkas beberapa kolom antara kode mesin dan sumber dalam jawaban baru-baru ini.
Peter Cordes

1
Dalam kode 32-bit, Anda bisa mendapatkan eax = 0 dan edx = 1 hanya dalam 4 byte, bukan 5, dengan xor eax,eax/ cdq/ inc edx. Jadi, Anda bisa membuat versi konvensi panggilan-panggilan 32-bit yang menghemat satu byte.
Peter Cordes

Dulu saya melakukan itu, @Peter, tetapi ada banyak kebingungan di sini atas pengiriman berada di "assembly" atau "kode mesin". Rupanya beberapa pengguna yang berpengalaman berpendapat bahwa ada perbedaan, dan keberatan saya menghitung byte kode mesin untuk jawaban yang disajikan dengan menggunakan mnemonik perakitan. Tentu saja, saya pikir ini bodoh, karena "perakitan" hanyalah representasi mnemonik dari byte mesin, tetapi saya kalah suara. Saya telah menemukan bahwa presentasi yang terpisah menciptakan lebih sedikit gesekan, walaupun saya pribadi tidak menyukainya.
Cody Grey

Trik lainnya bagus β€” terima kasih. Saya seharusnya memikirkan itu, saya menggunakan cdqbanyak jawaban kode-golf. Konvensi panggilan khusus tidak diperlukan. Saya biasanya menggunakan __fastcallkonvensi 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.
Cody Grey

Ah ya, semua konvensi pendaftaran panggilan lama bekerja untuk Anda. Jawaban codegolf terbaru saya memerlukan pointer di edi/ esiuntuk lodsb/ 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).
Peter Cordes

4

PowerShell , 80 74 byte

param($n)for($a,$b=1,0;$a-lt$n;$a,$b=$b,($a+$b)){}($b,$a)[($b-$n-gt$n-$a)]

(Cobalah secara online! Untuk sementara tidak merespons)

Solusi berulang. Mengambil input $n, menetapkan $a,$bmenjadi 1,0, dan kemudian loop dengan Fibonacci hingga $alebih besar dari input. Pada titik itu, kami mengindeks ($b,$a)berdasarkan pada Boolean apakah perbedaan antara elemen pertama dan $nlebih besar dari antara $nelemen kedua. Yang tersisa di pipa, output tersirat.


4

JavaScript (ES6), 67 byte

f=(n,k,y)=>(g=k=>x=k>1?g(--k)+g(--k):k)(k)>n?x+y>2*n?y:x:f(n,-~k,x)

Uji kasus


4

JavaScript (Babel Node) , 41 byte

f=(n,i=1,j=1)=>j<n?f(n,j,j+i):j-n>n-i?i:j

Berdasarkan jawaban Python yang luar biasa ovs

Cobalah online!

Tidak disatukan

f=(n,i=1,j=1)=> // Function f: n is the input, i and j are the most recent two Fibonacci numbers, initially 1, 1
 j<n?           // If j is still less than n
  f(n,j,j+i)    //  Try again with the next two Fibonacci numbers
 :              // Else:
  j-n>n-i?i:j   //  If n is closer to i, return i, else return j

This was commented on my answer but it would make it stop working for 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)
Neil

4

Python, 74 bytes

import math
r=5**.5
p=r/2+.5
lambda n:round(p**int(math.log(n*2*r,p)-1)/r)

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.


Damn, I knew something like this had to be possible. Well done! (+1)
SteamyRoot




3

Python 3, 103 bytes

import math
def f(n):d=5**.5;p=.5+d/2;l=p**int(math.log(d*n,p))/d;L=[l,p*l];return round(L[2*n>sum(L)])

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 bytes

lambda n:r(p**r(math.log(d*n,p))/d)
import math
d=5**.5
p=.5+d/2
r=round

Try 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.


Nice job! Welcome to PPCG :)
musicman523

To fairly calculate the byte count of your code I think you need to assign the lambda, as shown in the other Python answers. However, this algorithm doesn't always work correctly for n in range(1, 1+10**8). Eg, n=70 returns 89, but it should return 55. Here are the n values < 120 that it gives wrong answers for: (27, 44, 70, 71, 114, 115, 116). For testing purposes, you may like to use the nearest_fib_PM2R function I linked in my comment on the question.
PM 2Ring

@ PM2Ring Anda benar, saya membuat kesalahan bodoh ... Saya sekarang memiliki solusi yang benar, tetapi dengan lebih banyak byte. Sedangkan untuk lambda, saya yakin Anda salah. Saya percaya jawaban yang menugaskan lambda hanya melakukannya karena mereka menggunakan rekursi. Jawaban Python 3 lainnya tidak memberikan lambda pertama, misalnya.
SteamyRoot

3

Taksi, 2321 byte

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Trunkers.Go to Trunkers:n 1 l 1 l.0 is waiting at Starchild Numerology.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 1 l 2 l.Pickup a passenger going to Bird's Bench.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.[a]Pickup a passenger going to Rob's Rest.Pickup a passenger going to Magic Eight.Go to Bird's Bench:n 1 r 2 r 1 l.Go to Rob's Rest:n.Go to Trunkers:s 1 l 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Magic Eight.Go to Zoom Zoom:n.Go to Trunkers:w 3 l.Go to Magic Eight:e 1 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Firemouth Grill.Go to Firemouth Grill:w 1 r.Go to Rob's Rest:w 1 l 1 r 1 l 1 r 1 r.Pickup a passenger going to Cyclone.Go to Bird's Bench:s.Pickup a passenger going to Addition Alley.Go to Cyclone:n 1 r 1 l 2 l.Pickup a passenger going to Addition Alley.Pickup a passenger going to Bird's Bench.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Switch to plan "a".[b]Go to Trunkers:w 1 l.Pickup a passenger going to Cyclone.Go to Bird's Bench:w 1 l 1 r 1 l.Pickup a passenger going to Cyclone.Go to Rob's Rest:n.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 l 1 l 2 l.Pickup a passenger going to Sunny Skies Park.Pickup a passenger going to What's The Difference.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 l.Pickup a passenger going to Magic Eight.Go to Sunny Skies Park:e 1 r 1 l.Go to Cyclone:n 1 l.Pickup a passenger going to Sunny Skies Park.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:n 1 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to Magic Eight.Go to Magic Eight:e 1 r 2 l 2 r.Switch to plan "c" if no one is waiting.Go to Sunny Skies Park:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to Cyclone:n 1 l.Switch to plan "d".[c]Go to Cyclone:w 1 l 2 r.[d]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Cobalah online!
Cobalah online dengan komentar!

Berhenti bermain golf dengan komentar:

[ Find the Fibonacci number closest to the input ]
[ Inspired by: https://codegolf.stackexchange.com/q/133365 ]


[ n = STDIN ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Trunkers.
Go to Trunkers: north 1st left 1st left.


[ Initialize with F0=0 and F1=1 ]
0 is waiting at Starchild Numerology.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 1st left 2nd left.
Pickup a passenger going to Bird's Bench.
Pickup a passenger going to Cyclone.
Go to Cyclone: west 1st right 4th left.


[ For (i = 1; n > F(i); i++) { Store F(i) at Rob's Rest and F(i-1) at Bird's Bench } ]
[a]
Pickup a passenger going to Rob's Rest.
Pickup a passenger going to Magic Eight.
Go to Bird's Bench: north 1st right 2nd right 1st left.
Go to Rob's Rest: north.
Go to Trunkers: south 1st left 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: west 2nd right.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Magic Eight.
Go to Zoom Zoom: north.
Go to Trunkers: west 3rd left.
Go to Magic Eight: east 1st right.
Switch to plan "b" if no one is waiting.

[ n >= F(i) so iterate i ]
Pickup a passenger going to Firemouth Grill.
Go to Firemouth Grill: west 1st right.
Go to Rob's Rest: west 1st left 1st right 1st left 1st right 1st right.
Pickup a passenger going to Cyclone.
Go to Bird's Bench: south.
Pickup a passenger going to Addition Alley.
Go to Cyclone: north 1st right 1st left 2nd left.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Bird's Bench.
Go to Addition Alley: north 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left.
Switch to plan "a".


[b]
[ F(i) > n which means n >= F(i-1) and we need to figure out which is closer and print it]
Go to Trunkers: west 1st left.
Pickup a passenger going to Cyclone.
Go to Bird's Bench: west 1st left 1st right 1st left.
Pickup a passenger going to Cyclone.
Go to Rob's Rest: north.
Pickup a passenger going to Cyclone.
Go to Cyclone: south 1st left 1st left 2nd left.
Pickup a passenger going to Sunny Skies Park.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to What's The Difference.
[ Passengers:n, n, F(i-1) ]
Go to What's The Difference: north 1st left.
Pickup a passenger going to Magic Eight.
[ Passengers:n, n-F(i-1) ]
Go to Sunny Skies Park: east 1st right 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Sunny Skies Park.
Pickup a passenger going to What's The Difference.
[ Passengers: n-F(i-1), F(i-1), F(i) ]
Go to Sunny Skies Park: north 1st right.
Pickup a passenger going to What's The Difference.
[ Passengers: n-F(i-1), F(i), n ]
Go to What's The Difference: north 1st right 1st left.
[ Passengers: n-F(i-1), F(i)-n ]
Pickup a passenger going to Magic Eight.
Go to Magic Eight: east 1st right 2nd left 2nd right.
Switch to plan "c" if no one is waiting.

[ If no one was waiting, then {n-F(i-1)} < {F(i)-n} so we return F(i-1) ]
Go to Sunny Skies Park: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to Cyclone: north 1st left.
Switch to plan "d".

[c]
[ Otherwise {n-F(i-1)} >= {F(i)-n} so we return F(i) ]
[ Note: If we didn't switch to plan c, we still pickup F(i) but F(i-1) will be the *first* passenger and we only pickup one at The Babelfishery ]
[ Note: Because of how Magic Eight works, we will always return F(i) in the event of a tie ]
Go to Cyclone: west 1st left 2nd right.
[d]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

2

Python 3 , 84 byte

lambda k:min(map(f,range(2*k)),key=lambda n:abs(n-k))
f=lambda i:i<3or f(i-1)+f(i-2)

Cobalah online!

Ini mungkin bekerja, tetapi tentu saja tidak cepat ...

Output Truebukan 1, tetapi dalam Python ini sama.


2

dc, 52 byte

si1d[dsf+lfrdli>F]dsFxli-rlir-sdd[lild-pq]sDld<Dli+p

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 dari i. Pada titik ini kita memiliki dua angka dalam urutan Fibonacci pada tumpukan: satu yang kurang dari atau sama dengan i, dan satu yang lebih besar dari i. Kami mengonversinya menjadi perbedaan masing-masing dengan idan kemudian membandingkan perbedaannya. Akhirnya kami merekonstruksi angka Fibonacci dengan menambahkan atau mengurangi perbedaannya i.

Ups, saya memuat dua register dalam urutan yang salah dan kemudian menukarnya, membuang satu byte.


Fungsi diizinkan.
CalculatorFeline

Terima kasih, saya berulang kali melewatkannya di teks tantangan.
brhfl

2

C # (.NET Core) ,63 56 bytes

-1 byte thanks to @Neil

-6 byte terima kasih kepada @Nevay

n=>{int a=0,b=1;for(;b<n;a=b-a)b+=a;return n-a>b-n?b:a;}

Cobalah online!


Apakah for(;b<n;a=b,b+=c)c=a;menghemat satu byte?
Neil

Anda dapat menghapus cdengan menggunakan b+=a,a=b-a(harus menyimpan 6 byte).
Nevay


2

Hexagony , 37 byte

?\=-${&"*.2}+".|'=='.@.&}1.!_|._}$_}{

Cobalah online!

ungolfed:

   ? \ = - 
  $ { & " * 
 . 2 } + " .
| ' = = ' . @
 . & } 1 . !
  _ | . _ }
   $ _ } { 

Rusak:

start:
? { 2 ' * //set up 2*target number
" ' 1     //initialize curr to 1

main loop:
} = +     //next + curr + last
" -       //test = next - (2*target)
branch: <= 0 -> continue; > 0 -> return

continue:
{ } = &   //last = curr
} = &     //curr = next


return:
{ } ! @   //print last

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.


2

Brachylog , 22 byte

;Iβ‰œ-.∧{0;1⟨t≑+⟩ⁱhℕ↙.!}

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.



1

Java 7, 244 234 Bytes

 String c(int c){for(int i=1;;i++){int r=f(i);int s=f(i-1);if(r>c && s<c){if(c-s == r-c)return ""+r+","+s;else if(s-c > r-c)return ""+r;return ""+s;}}} int f(int i){if(i<1)return 0;else if(i==1)return 1;else return f(i-2)+f(i-1);}

Mengapa Anda tidak menggunakan Java 8 dan mengubahnya menjadi lambda? Anda juga dapat menghapus staticjika Anda ingin tetap menggunakan Java 7.
Okx

Anda memiliki dua kesalahan dalam kode Anda ( r>c&&s<cseharusnya r>=c&&s<=c, s-cseharusnya c-s), Anda dapat menghapus spasi yang tidak diperlukan, menggunakan int f(int i){return i<2?i:f(--i)+f(--i);}, menggunakan pernyataan pengembalian tunggal dengan operator ternary di c dan menghapus penanganan khusus karena c-s==r-cmengembalikan salah satu nilai yang diizinkan.
Nevay

@Nay, saya tidak melihat kesalahan, saya sudah mencobanya tanpa gagal
0x45




1

Perl 6 , 38 byte

{(0,1,*+*...*>$_).sort((*-$_).abs)[0]}

Menguji

{   # bare block lambda with implicit parameter ο½’$_ο½£

  ( # generate Fibonacci sequence

    0, 1,  # seed the sequence
    * + *  # WhateverCode lambda that generates the rest of the values
    ...    # keep generating until
    * > $_ # it generates one larger than the original input
           # (that larger value is included in the sequence)

  ).sort(           # sort it by
    ( * - $_ ).abs  # the absolute difference to the original input
  )[0]              # get the first value from the sorted list
}

Untuk potensi percepat tambahkan .tail(2)sebelumnya .sort(…).

Dalam kasus dasi, itu akan selalu mengembalikan yang lebih kecil dari dua nilai, karena sortmerupakan jenis yang stabil. (dua nilai yang akan mengurutkan yang sama menjaga urutannya)


1

Pyth, 19 byte

JU2VQ=+Js>2J)hoaNQJ

Coba di sini

Penjelasan

JU2VQ=+Js>2J)hoaNQJ
JU2                  Set J = [0, 1].
   VQ=+Js>2J)        Add the next <input> Fibonacci numbers.
              oaNQJ  Sort them by distance to <input>.
             h       Take the first.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.