ค้นหา Fibonacci Number ที่ใกล้เคียงที่สุด


30

เราทุกคนคุ้นเคยกับการที่มีชื่อเสียงลำดับฟีโบนักชีที่เริ่มต้นด้วย0และ1และแต่ละองค์ประกอบคือผลรวมของก่อนหน้านี้สองที่ ต่อไปนี้เป็นคำศัพท์สองสามคำแรก (OEIS A000045 ):

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584

รับจำนวนเต็มบวกคืนจำนวนใกล้เคียงที่สุดของลำดับ Fibonacci ภายใต้กฎเหล่านี้:

  • จำนวนฟีโบนักชีที่อยู่ใกล้จะถูกกำหนดเป็นจำนวนฟีโบนักชีมีความแตกต่างแน่นอนที่เล็กที่สุดที่มีจำนวนเต็มกำหนด ยกตัวอย่างเช่น34เป็นจำนวนฟีโบนักชีที่อยู่ใกล้30เพราะ|34 - 30| = 4ซึ่งมีขนาดเล็กกว่าที่ใกล้เคียงที่สุดที่สองซึ่ง21|21 - 30| = 9

  • หากจำนวนเต็มที่กำหนดเป็นของลำดับ Fibonacci จำนวน Fibonacci ที่ใกล้เคียงที่สุดคือตัวของมันเอง ยกตัวอย่างเช่นจำนวนฟีโบนักชีที่อยู่ใกล้ตรง1313

  • ในกรณีที่มีการผูกคุณอาจเลือกที่จะส่งออกหนึ่งในหมายเลขฟีโบนักชีที่อยู่ใกล้กับอินพุทหรือเอาท์พุทพวกเขาทั้งสอง ตัวอย่างเช่นถ้าใส่เป็น17ทั้งหมดต่อไปนี้จะถูกต้อง: 21, หรือ13 21, 13ในกรณีที่คุณส่งคืนทั้งสองโปรดระบุรูปแบบ

มีการใช้ช่องโหว่เริ่มต้น คุณสามารถใช้การป้อนข้อมูลและจัดให้มีการส่งออกผ่านวิธีการมาตรฐานใดโปรแกรมของคุณ / ฟังก์ชั่นจะต้องจัดการกับค่าถึง 10 8


กรณีทดสอบ

อินพุต -> เอาท์พุท

1 -> 1
3 -> 3
4 -> 3 หรือ 5 หรือ 3, 5
6 -> 5
7 -> 8
11 -> 13
17 -> 13 หรือ 21 หรือ 13, 21
63 -> 55
101 -> 89
377 -> 377
467 -> 377
500 -> 610
1399 -> 1597

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในทุกภาษาชนะ!


Sandbox
Mr. Xcoder

FWIW นี่คือรหัส Python บางตัวบน SO เพื่อทำสิ่งนี้อย่างมีประสิทธิภาพสำหรับอินพุตขนาดใหญ่พร้อมกับสคริปต์ที่สามารถใช้สำหรับกำหนดเวลาอัลกอริทึมต่างๆ
PM 2Ring

0 ถือเป็นจำนวนเต็มบวกหรือไม่
Alix Eisenhardt

@AlixEisenhardt เลขจำนวนเต็มบวกnn ≥ 1หมายถึง
Mr. Xcoder

คำตอบ:


21

Python 2 , 43 ไบต์

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

ลองออนไลน์!

iterates ผ่านคู่ของตัวเลข Fibonacci ติดต่อกัน(a,b)จนกว่าจะถึงหนึ่งที่การป้อนข้อมูลที่nมีค่าน้อยกว่าจุดกึ่งกลางของพวกเขาแล้วผลตอบแทน(a+b)/2a

เขียนเป็นโปรแกรม (47 ไบต์):

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

ความยาวเท่ากัน:

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

15

Neim , 5 ไบต์

f𝐖𝕖S𝕔

คำอธิบาย:

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

ใน Neim รุ่นใหม่ล่าสุดสามารถเล่นได้ที่ 3 ไบต์:

fS𝕔

เนื่องจากรายการที่ไม่มีที่สิ้นสุดได้รับการทำใหม่เพื่อให้ได้มูลค่าสูงสุดเท่านั้น

ลองออนไลน์!


5 ไบต์นี้เป็นอย่างไรเมื่อมี 2 ตัวอักษร? และความแตกต่างระหว่างวิธีที่หนึ่งและที่สองคืออะไร?
caird coinheringaahing

1
คุณนับไบต์หรือตัวอักษร? ปรากฏขึ้นเป็นครั้งแรกคือ 15 ไบต์และ 7 ไบต์ที่สอง
Nateowami

นี่อาจมีเพจรหัสของตัวเองบางตัวที่อักขระแต่ละตัวเป็นไบต์ของตัวเองความหมายตัวแรกคือ 5 ไบต์และที่สองคือ 3 ไบต์ ความแตกต่างระหว่างคนทั้งสองคือคนแรกเลือกคู่มือ 93 องค์ประกอบแรกในขณะที่คนที่สองในรุ่นที่ใหม่กว่าจะเลือกค่าสูงสุดที่เป็นไปได้โดยอัตโนมัติซึ่งภาษา int ขนาดสามารถจัดการได้
Roman Gräf

1
@cairdcoinheringaahing ฉันมักจะมีปัญหากับคนที่ไม่สามารถดูโปรแกรมของฉันได้ สกรีน
ช็อต

1
@ Okx โอ้ตกลงน่าสนใจฉันจะไม่เดา
Nateowami


8

R , 70 67 64 62 60 ไบต์

-2 ไบต์ขอบคุณ djhurio!

ไบต์เพิ่มเติมอีก 2 ขอบคุณ djhurio (เด็กชายเขาสามารถกอล์ฟ!)

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

เนื่องจากเราต้องจัดการค่าสูงสุด10^8เท่านั้นจึงใช้งานได้

ลองออนไลน์!

อ่านnจาก stdin whileห่วงสร้างตัวเลข fibonacci ในF(ในการลดการสั่งซื้อ); ในกรณีที่เสมอกันจะถูกส่งคืนมากขึ้น สิ่งนี้จะทริกเกอร์คำเตือนจำนวนหนึ่งเพราะwhile(F<1e8)จะประเมินเฉพาะคำสั่งสำหรับองค์ประกอบแรกที่Fมีคำเตือน

เดิมผมใช้F[which.min(abs(F-n))]วิธีที่ไร้เดียงสา แต่ @djhurio ปัญหา(F-n)^2ตั้งแต่การสั่งซื้อจะเทียบเท่าและแทนorder ส่งกลับค่าการเรียงลำดับของดัชนีเพื่อใส่ข้อมูลลงในลำดับที่เพิ่มขึ้นดังนั้นเราจึงต้องการในตอนท้ายเพื่อรับเฉพาะค่าแรกเท่านั้นwhich.minorder[1]

รุ่นที่เร็วกว่า:

F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][‌​1]

เก็บหมายเลขฟีโบนักชีสองอันสุดท้ายเท่านั้น


1
ทำได้ดีนี่. -2 bytesF=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
djhurio

1
และรุ่นที่รวดเร็วซึ่งมีจำนวนไบต์เท่ากันF=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
djhurio

1
@djhurio ดีมาก! ขอบคุณมาก.
Giuseppe

1
ฉันชอบสิ่งนี้. -2 bytes อีกครั้งF=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
djhurio

การใช้ builtin เพื่อสร้าง fibnums นั้นสั้นกว่า:numbers::fibonacci(x<-scan(),T)
JAD

6

JavaScript (ES6), 41 ไบต์

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

ปัดเศษขึ้นตามความชอบ


เกือบเหมือนเวอร์ชั่นที่ฉันใช้งานอยู่ อย่างน้อยคุณก็ไม่ได้ใช้ชื่อตัวแปรเดียวกันมิเช่นนั้นฉันก็จะถูกทำให้แย่
Grax32

@Grax Huh ตอนนี้คุณพูดถึงมันธุรกิจแมวตีฉันไปที่ ...
Neil

(อืมเกือบ ... ฉันทำให้เวอร์ชันของฉันใช้งานได้กับ 0 เพราะเหตุใด?)
Neil

f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)เนื่องจากคุณไม่ต้องทำงานกับ 0 คุณจึงสามารถตีกอล์ฟได้อีกเล็กน้อย
Alix Eisenhardt

6

เยลลี่ , 9 7 ไบต์

-2 ไบต์ขอบคุณ @EriktheOutgolfer

‘RÆḞạÐṂ

ลองออนไลน์!

เคล็ดลับการเล่นกอล์ฟยินดีต้อนรับ :) รับค่า int สำหรับอินพุตและส่งคืนค่า 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]

µḢคุณสามารถลบ
Erik the Outgolfer

@EriktheOutgolfer เป็น: "มีวิธีที่จะทำถ้าคุณคิดเกี่ยวกับมัน" หรือใน "ถ้าคุณเพียงแค่ backspace พวกเขามันยังคงทำงาน"?
nmjcman101

เช่นเดียวกับใน "กฎอนุญาต" : P
Erik the Outgolfer

อา ขอขอบคุณ! (ข้อความตัวเติม)
nmjcman101


5

x86-64 รหัสเครื่อง 24 ไบต์

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

ไบต์ข้างต้นของรหัสกำหนดฟังก์ชั่นใน 64 บิตรหัสเครื่อง x86 ที่พบจำนวน Fibonacci nที่ใกล้เคียงกับมูลค่าการป้อนข้อมูลที่ระบุ,

ฟังก์ชั่นนี้เป็นไปตามหลักการเรียกประชุม System V AMD64 (มาตรฐานบนระบบ Gnu / Unix) เช่นเดียวกับที่nส่งผ่านพารามิเตอร์ในการEDIลงทะเบียนและส่งคืนผลลัพธ์ในEAXรีจิสเตอร์

คำย่อของชุดประกอบ Ungolfed:

; 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

ลองออนไลน์!

รหัสนั้นแบ่งออกเป็นสามส่วนโดยทั่วไป:

  • ส่วนแรกนั้นง่ายมากมันเพิ่งเริ่มต้นการลงทะเบียนการทำงานของเรา EAXถูกตั้งค่าเป็น 0 และEDXตั้งค่าเป็น 1
  • ส่วนต่อไปคือวงที่ซ้ำคำนวณตัวเลข Fibonacci nในด้านของมูลค่าการป้อนข้อมูลอย่างใดอย่างหนึ่ง รหัสนี้เป็นไปตามการปรับใช้ Fibonacci ก่อนหน้าของฉันด้วยการลบแต่…อืม…ไม่ได้มีการลบ :-) โดยเฉพาะมันใช้เคล็ดลับแบบเดียวกันกับการคำนวณหมายเลขฟีโบนักชีโดยใช้ตัวแปรสองตัว - ที่นี่นี่คือEAXและEDXลงทะเบียน วิธีการนี้สะดวกมากที่นี่เพราะให้หมายเลขฟิโบน่าชีติดกับเรา ผู้สมัครอาจน้อยกว่า nจะถูกเก็บไว้ในEAXขณะที่ผู้สมัครที่มีศักยภาพมากกว่า nจะจัดขึ้นในEDX. ฉันภูมิใจมากที่ฉันสามารถสร้างโค้ดภายในลูปนี้ได้อย่างรัดกุม (และยิ่งทำให้ฉันค้นพบมันอีกครั้งอย่างอิสระและต่อมาก็พบว่ามันคล้ายกับคำตอบการลบที่เชื่อมโยงข้างต้น)

  • เมื่อเรามีผู้สมัครที่มีค่าที่มีอยู่ใน Fibonacci EAXและEDXมันเป็นเรื่องง่ายแนวคิดของการหาที่หนึ่งเป็นผู้ใกล้ชิด (ในแง่ของค่าสัมบูรณ์) nเพื่อ อันที่จริงการค่าสัมบูรณ์จะใช้วิธีไบต์มากเกินไปดังนั้นเราเพียงแค่ทำชุดของ subtractions ความคิดเห็นออกไปทางด้านขวาของคำสั่งการย้ายตามเงื่อนไขสุดท้ายอธิบายตรรกะที่นี่ นี้อย่างใดอย่างหนึ่งย้ายEDXเข้าEAXหรือใบEAXเพียงอย่างเดียวเพื่อที่ว่าเมื่อฟังก์ชั่นRETโกศจำนวน Fibonacci EAXที่ใกล้เคียงที่สุดถูกส่งกลับใน

ในกรณีที่มีการผูกที่มีขนาดเล็กของทั้งสองค่าผู้สมัครจะถูกส่งกลับเนื่องจากเราเคยใช้CMOVGแทนการCMOVGEที่จะทำสิ่งที่เลือก เป็นการเปลี่ยนแปลงเล็กน้อยหากคุณต้องการพฤติกรรมอื่น ๆ การคืนค่าทั้งสองค่านั้นไม่ใช่ค่าเริ่มต้น กรุณาผลจำนวนเต็มเดียว!


รายชื่อ NASM นั้นดีสำหรับคำตอบ codegolf เนื่องจากพวกเขาผสมไบต์รหัสเครื่องกับแหล่งที่มีความเห็นดั้งเดิมค่อนข้างกะทัดรัด ฉันเคยnasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-ตัดแต่งบางคอลัมน์ระหว่างรหัสเครื่องและแหล่งที่มาด้วยคำตอบล่าสุด
Peter Cordes

1
ในรหัส 32 บิตคุณจะได้รับ EAX = 0 และ EDX = 1 ในเวลาเพียง 4 ไบต์แทนจาก 5 ด้วยxor eax,eax/ /cdq inc edxดังนั้นคุณสามารถสร้างเวอร์ชันการเรียกประชุมแบบ 32 บิตที่บันทึกไบต์ได้
Peter Cordes

ฉันเคยทำเช่นนั้น @Peter แต่มีความสับสนมากมายเกี่ยวกับการส่งที่อยู่ใน "แอสเซมบลี" หรือ "รหัสเครื่อง" เห็นได้ชัดว่าผู้ใช้ที่มีประสบการณ์บางคนยืนยันว่ามีความแตกต่างและคัดค้านการนับจำนวนไบต์ของรหัสเครื่องสำหรับคำตอบที่แสดงโดยใช้ตัวช่วยจำแอสเซมบลี โดยธรรมชาติฉันคิดว่านี่โง่เพราะ "ชุดประกอบ" เป็นเพียงตัวช่วยจำหน่วยความจำของเครื่องไบต์ แต่ฉันได้รับการลงคะแนน ฉันพบว่าการนำเสนอที่แยกต่างหากสร้างแรงเสียดทานน้อยลงแม้ว่าฉันจะไม่ชอบมันเช่นกัน
Cody Gray

เคล็ดลับอื่นดี - ขอบคุณ ฉันควรจะคิดอย่างนั้นฉันใช้cdqคำตอบโค้ดกอล์ฟจำนวนมาก ไม่จำเป็นต้องใช้แผนการประชุมที่กำหนดเอง ฉันมักจะใช้__fastcallแบบแผนการโทรของ Microsoft สำหรับรหัส 32 บิต สิ่งที่ดีเกี่ยวกับเรื่องนี้คือการสนับสนุนโดย GCC พร้อมคำอธิบายประกอบดังนั้นคุณยังสามารถใช้บริการ TIO ที่ทุกคนต้องการเห็น
Cody Gray

อ่าใช่แล้วการประชุมการลงทะเบียนแบบเก่า ๆ นั้นเหมาะกับคุณ codegolf ล่าสุดของฉันต้องการตัวชี้ในedi/ esiสำหรับlodsb/ stosbและมีเพียง x86-64 SysV เท่านั้นที่ทำได้ (ความจริงสนุก: มีวัตถุประสงค์เพื่อเหตุผลนั้นเพราะฟังก์ชั่นบางอย่างส่งผ่าน args ไปยัง memset / memcpy และฉันเดา gcc ในเวลานั้น เพื่อ ops สตริงแบบอินไลน์)
ปีเตอร์กอร์เดส

4

PowerShell , 80 74 ไบต์

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

(ลองออนไลน์! ไม่ตอบสนองชั่วคราว)

โซลูชั่นซ้ำ ใช้อินพุต$nตั้งค่า$a,$bเป็น1,0แล้วลูปด้วย Fibonacci จนกว่า$aจะมีขนาดใหญ่กว่าอินพุต ณ จุดนั้นเราจัดทำดัชนี($b,$a)โดยอิงตามบูลีนว่าความแตกต่างระหว่างองค์ประกอบแรกและ$nมากกว่าหรือเท่ากับ$nและองค์ประกอบที่สอง ที่เหลืออยู่บนไปป์ไลน์เอาท์พุทเป็นนัย


4

JavaScript (ES6), 67 ไบต์

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)

กรณีทดสอบ


4

JavaScript (โหนดบาเบล) 41 ไบต์

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

ตามคำตอบ Python ที่ยอดเยี่ยมของ ovs

ลองออนไลน์!

Ungolfed

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

นี่เป็นความเห็นเกี่ยวกับคำตอบของฉัน แต่มันจะทำให้มันหยุดทำงาน0(ไม่ใช่ว่ามันจำเป็นต้อง; ฉันแค่ต้องการมัน):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Neil

4

Python ขนาด 74 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

สำหรับk ≥ 0 ทั้งหมดตั้งแต่ | φ - k / √5 | <1/2, F k = φ k / √5 + φ - k / √5 = รอบ (φ k / √5) ดังนั้นค่าที่ส่งคืนจะเปลี่ยนจากF k - 1ถึงF kโดยที่k = log φ ( n ⋅2√5) - 1 หรือn = φ k + 1 / (2√5) ซึ่งอยู่ภายใน 1/4 ของF k + 1/2 = ( F k - 1 + F k ) / 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 You're right, I made a stupid mistake... I now have a correct solution, but with a lot more bytes. As for the lambda, I believe you're wrong. I believe the answers assigning lambda only do so because they use recursion. The other Python 3 answers doesn't assign the first lambda, for example.
SteamyRoot

3

Taxi, 2321 bytes

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.

Try it online!
Try it online with comments!

Un-golfed with comments:

[ 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

dc, 52 bytes

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

Try it online!

Takes input at run using ?

Edited to assume top of stack as input value, -1 byte.

Input is stored in register i. Then we put 1 and 1 on the stack to start the Fibonacci sequence, and we generate the sequence until we hit a value greater than i. At this point we have two numbers in the Fibonacci sequence on the stack: one that is less than or equal to i, and one that is greater than i. We convert these into their respective differences with i and then compare the differences. Finally we reconstruct the Fibonacci number by either adding or subtracting the difference to i.

Oops, I was loading two registers in the wrong order and then swapping them, wasting a byte.


Functions are allowed.
CalculatorFeline

Thanks, I repeatedly missed that in the challenge's text.
brhfl



2

Hexagony, 37 bytes

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

Try it online!

ungolfed:

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

Broken down:

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

Like some other posters, I realized that when the midpoint of last and curr is greater than the target, the smaller of the two is the closest or tied for closest.

The midpoint is at (last + curr)/2. We can shorten that because next is already last + curr, and if we instead multiply our target integer by 2, we only need to check that (next - 2*target) > 0, then return last.




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);}

Why don't you use Java 8 and turn this into a lambda? You can also remove static if you want to stick with Java 7.
Okx

You have two errors in your code (r>c&&s<c should be r>=c&&s<=c, s-c should be c-s), You could remove not required whitespace, use int f(int i){return i<2?i:f(--i)+f(--i);}, use a single return statement with ternary operator in c and remove the special handling for c-s==r-c as returning either value is allowed.
Nevay

@Nevay I don't see the error, I've tested it without fails
0x45




1

Perl 6, 38 bytes

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

Test it

{   # 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
}

For a potential speed-up add .tail(2) before .sort(…).

In the case of a tie, it will always return the smaller of the two values, because sort is a stable sort. (two values which would sort the same keep their order)


1

Pyth, 19 bytes

JU2VQ=+Js>2J)hoaNQJ

Try it here

Explanation

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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.