Tìm số Fibonacci gần nhất


30

Chúng ta đều quen thuộc với chuỗi Fibonacci nổi tiếng , bắt đầu bằng01, và mỗi phần tử là tổng của hai phần trước. Dưới đây là một vài điều khoản đầu tiên (OEIS A000045 ):

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

Cho một số nguyên dương , trả về số gần nhất của chuỗi Fibonacci, theo các quy tắc sau:

  • Số Fibonacci gần nhất được định nghĩa là số Fibonacci có chênh lệch tuyệt đối nhỏ nhất với số nguyên đã cho. Ví dụ, 34là số Fibonacci gần nhất với 30, bởi vì |34 - 30| = 4, nó nhỏ hơn số gần nhất thứ hai 21, trong đó |21 - 30| = 9.

  • Nếu số nguyên đã cho thuộc về chuỗi Fibonacci, thì số Fibonacci gần nhất chính xác là chính nó. Ví dụ, số Fibonacci gần nhất 13là chính xác 13.

  • Trong trường hợp hòa, bạn có thể chọn xuất một trong các số Fibonacci gần nhất với đầu vào hoặc chỉ xuất cả hai. Chẳng hạn, nếu đầu vào là 17, tất cả những điều sau đây là hợp lệ : 21, 13hoặc 21, 13. Trong trường hợp bạn trả lại cả hai, vui lòng đề cập đến định dạng.

Lỗ hổng mặc định áp dụng. Bạn có thể lấy đầu vào và cung cấp đầu ra thông qua bất kỳ phương pháp tiêu chuẩn nào . Chương trình / chức năng của bạn chỉ phải xử lý các giá trị tối đa 10 8 .


Các trường hợp thử nghiệm

Đầu vào -> Đầu ra

1 -> 1
3 -> 3
4 -> 3 hoặc 5 hoặc 3, 5
6 -> 5
7 -> 8
11 -> 13
17 -> 13 hoặc 21 hoặc 13, 21
63 -> 55
101 -> 89
377 -> 377
467 -> 377
500 -> 610
1399 -> 1597

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính theo byte trong mọi ngôn ngữ sẽ thắng!



FWIW, đây là một số mã Python trên SO để thực hiện điều này một cách hiệu quả cho các đầu vào lớn, cùng với một tập lệnh có thể được sử dụng để định thời gian cho các thuật toán khác nhau.
PM 2Ring

Là 0 được coi là một số nguyên dương?
Alix Eisenhardt

@AlixEisenhardt Số nguyên dươngn ngụ ý n ≥ 1.
Ông Xcoder

Câu trả lời:


21

Python 2 , 43 byte

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

Hãy thử trực tuyến!

Lặp lại thông qua các cặp số Fibonacci liên tiếp (a,b)cho đến khi nó đạt đến một điểm mà đầu vào nnhỏ hơn điểm giữa của chúng (a+b)/2, sau đó trả về a.

Được viết dưới dạng một chương trình (47 byte):

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

Cùng chiều dài :

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

15

Neim , 5 byte

f𝐖𝕖S𝕔

Giải trình:

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

Trong phiên bản mới nhất của Neim, điều này có thể được đánh thành 3 byte:

fS𝕔

Vì danh sách vô hạn đã được làm lại để chỉ đi đến giá trị tối đa của chúng.

Hãy thử trực tuyến!


Làm thế nào là 5 byte này khi có 2 ký tự ở đó? Và sự khác biệt giữa giải pháp thứ nhất và thứ hai là gì?
caird coinheringaahing

1
Bạn đang đếm byte hoặc ký tự? Nó xuất hiện đầu tiên là 15 byte và 7 byte thứ hai.
Nateowami

Điều này có thể có một số loại bảng mã riêng trong đó mỗi ký tự là byte riêng, nghĩa là ký tự đầu tiên là 5 byte và thứ hai là 3 byte. Sự khác biệt giữa hai là cái thứ nhất chọn thủ công 93 phần tử đầu tiên trong khi phần tử thứ hai trong phiên bản mới hơn sẽ tự động chọn giá trị cao nhất có thể mà các ngôn ngữ int size có thể xử lý
Roman Gräf

1
@cairdcoinheringaahing Tôi thường gặp vấn đề với những người không thể xem các chương trình của tôi. Ảnh chụp màn hình
Okx 20/07/2017

1
@Okx Oh OK, thú vị, tôi sẽ không đoán được.
Nateowami


8

R , 70 67 64 62 60 byte

-2 byte nhờ djhurio!

Thêm 2 byte nhờ djhurio (cậu bé có thể chơi gôn!)

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

Vì chúng ta chỉ phải xử lý các giá trị lên đến 10^8, điều này hoạt động.

Hãy thử trực tuyến!

Đọc ntừ stdin. các whilevòng lặp tạo ra những con số fibonacci trong F(theo thứ tự giảm dần); trong trường hợp hòa, trả lại lớn hơn. Điều này sẽ kích hoạt một số cảnh báo vì while(F<1e8)chỉ đánh giá tuyên bố cho phần tử đầu tiên củaF bằng cảnh báo

Ban đầu tôi đã sử dụng F[which.min(abs(F-n))], cách tiếp cận ngây thơ, nhưng @djhurio đề xuất (F-n)^2vì việc đặt hàng sẽ tương đương, và orderthay vì which.min. orderTuy nhiên, trả về một hoán vị của các chỉ số để đưa đầu vào của nó vào thứ tự tăng dần, vì vậy chúng ta cần [1]ở cuối để chỉ nhận giá trị đầu tiên.

phiên bản nhanh hơn:

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

chỉ lưu trữ hai số cuối cùng của Wikipedia


1
Đẹp một. -2 byteF=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
djhurio

1
Và phiên bản nhanh có cùng số byteF=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
djhurio

1
@djhurio đẹp! Cảm ơn nhiều.
Giuseppe

1
Tôi thích điều này. -2 byte một lần nữaF=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
djhurio

Sử dụng một nội trang để tạo ra các sợi nhỏ hơn: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

Làm tròn theo sở thích.


Gần như giống hệt với phiên bản tôi đang làm việc. Ít nhất bạn đã không sử dụng cùng một tên biến hoặc tôi sẽ bị bối rối.
Grax32

@Grax Huh, bây giờ bạn đề cập đến nó, Business Cat đã đánh bại tôi ...
Neil

(Chà, gần như ... Tôi đã làm cho phiên bản của mình hoạt động với 0, vì tại sao không?)
Neil

f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)Vì bạn không phải làm việc với 0, bạn có thể chơi gôn nhiều hơn một chút.
Alix Eisenhardt

6

Thạch , 9 7 byte

-2 byte nhờ @EriktheOutgolfer

‘RÆḞạÐṂ

Hãy thử trực tuyến!

Lời khuyên chơi golf chào mừng :). Lấy một int cho đầu vào và trả về một danh sách int.

            ' 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]

Bạn có thể loại bỏ µḢ.
Erik the Outgolfer 19/07/17

@EriktheOutgolfer như trong: "Có một cách để làm điều đó nếu bạn nghĩ về nó", hoặc như trong "Nếu bạn thực sự chỉ cần sao lưu chúng thì nó vẫn hoạt động"?
nmjcman101

Như trong "nó được cho phép bởi các quy tắc". : P
Erik the Outgolfer 19/07/17

À. Cảm ơn bạn! (Văn bản phụ)
nmjcman101


5

Mã máy x86-64, 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

Các byte mã trên xác định một hàm trong mã máy 64 bit x86 tìm thấy số Fibonacci gần nhất với giá trị đầu vào được chỉ định , n.

Hàm tuân theo quy ước gọi AMD V của Hệ thống V (tiêu chuẩn trên các hệ thống Gnu / Unix), sao cho tham số duy nhất ( n) được truyền vào thanh EDIghi và kết quả được trả về trong thanh EAXghi.

Ma thuật lắp ráp bất khả xâm phạm:

; 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

Hãy thử trực tuyến!

Mã về cơ bản chia thành ba phần:

  • Phần đầu tiên rất đơn giản: nó chỉ khởi tạo các thanh ghi làm việc của chúng tôi. EAXđược đặt thành 0 và EDXđược đặt thành 1.
  • Phần tiếp theo là một vòng lặp tính toán các số Fibonacci ở hai bên của giá trị đầu vào , n. Mã này dựa trên việc triển khai Fibonacci trước đây của tôi với phép trừ , nhưng xóa um không phải là phép trừ. :-) Đặc biệt, nó sử dụng cùng một thủ thuật tính toán số Fibonacci bằng cách sử dụng hai biến số ở đây, đây là các EAXvà các EDXthanh ghi. Cách tiếp cận này cực kỳ thuận tiện ở đây, bởi vì nó mang lại cho chúng ta các số Fibonacci liền kề. Ứng cử viên có khả năng ít hơn n được tổ chức EAX, trong khi ứng cử viên có khả năng lớn hơn n được tổ chứcEDX. Tôi khá tự hào về mức độ chặt chẽ của tôi khi tôi có thể tạo mã bên trong vòng lặp này (và thậm chí còn bị nhột hơn khi tôi phát hiện lại nó một cách độc lập, và chỉ sau đó nhận ra nó giống với câu trả lời được liên kết ở trên như thế nào).

  • Một khi chúng ta có sẵn các giá trị Fibonacci ứng cử viên EAXEDX, đó là một vấn đề đơn giản về mặt khái niệm để tìm ra cái nào gần hơn (về giá trị tuyệt đối) n. Trên thực tế dùng một giá trị tuyệt đối sẽ có chi phí cách quá nhiều byte, vì vậy chúng tôi chỉ làm một loạt các bớt. Nhận xét bên phải của hướng dẫn di chuyển có điều kiện áp chót giải thích hợp lý logic ở đây. Điều này hoặc di chuyển EDXvào EAXhoặc để lại EAXmột mình, để khi hàm khởi động RET, số Fibonacci gần nhất được trả về EAX.

Trong trường hợp hòa, giá trị nhỏ hơn trong hai giá trị ứng cử viên được trả về, vì chúng ta đã sử dụng CMOVGthay vì CMOVGEthực hiện lựa chọn. Đó là một thay đổi nhỏ, nếu bạn thích hành vi khác. Trả lại cả hai giá trị là một khởi đầu, mặc dù; chỉ một kết quả số nguyên, xin vui lòng!


Danh sách NASM là tốt cho câu trả lời của codegolf, vì chúng trộn các byte mã máy với nguồn nhận xét ban đầu hơi gọn. Tôi đã sử dụng nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-để cắt một số cột giữa mã máy và nguồn trong một câu trả lời gần đây.
Peter Cordes

1
Trong mã 32 bit, bạn có thể nhận được eax = 0 và edx = 1 chỉ trong 4 byte thay vì 5, với xor eax,eax/ cdq/ inc edx. Vì vậy, bạn có thể tạo phiên bản quy ước gọi tùy chỉnh 32 bit đã lưu một byte.
Peter Cordes

Tôi đã từng làm điều đó, @Peter, nhưng có rất nhiều nhầm lẫn ở đây về việc đệ trình trong "lắp ráp" hoặc "mã máy". Rõ ràng một số người dùng có kinh nghiệm cho rằng có một sự khác biệt và phản đối việc tôi đếm các byte mã máy cho một câu trả lời được trình bày bằng cách sử dụng thuật ngữ lắp ráp. Đương nhiên, tôi nghĩ điều này thật ngu ngốc, bởi vì "lắp ráp" chỉ là một biểu diễn ghi nhớ của các byte máy, nhưng tôi đã bị bỏ xa. Tôi đã thấy rằng bản trình bày riêng biệt tạo ra ít ma sát hơn, mặc dù cá nhân tôi cũng không thích nó.
Cody Grey

Các mẹo khác là tốt đẹp cảm ơn. Tôi nên nghĩ về điều đó, tôi sử dụng cdqrất nhiều trong các câu trả lời golf-code. Một quy ước gọi tùy chỉnh không bắt buộc. Tôi thường sử dụng __fastcallquy ước gọi của Microsoft cho mã 32 bit. Điều thú vị về điều này là nó được GCC hỗ trợ kèm theo chú thích, vì vậy bạn vẫn có thể sử dụng dịch vụ TIO mà mọi người muốn xem.
Cody Grey

À vâng, bất kỳ quy ước gọi đăng ký cũ làm việc cho bạn. Câu trả lời mã hóa gần đây nhất của tôi cần có con trỏ trong edi/ esifor lodsb/ stosb, và chỉ x86-64 SysV làm điều đó (sự thật thú vị: vì mục đích đó, vì một số chức năng chuyển đối số của họ sang memset / memcpy và tôi đoán gcc tại thời điểm đó thích để ops chuỗi nội tuyến).
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)]

(Dùng thử trực tuyến! Tạm thời không phản hồi)

Giải pháp lặp lại. Đưa đầu vào $n, đặt $a,$bthành 1,0, và sau đó lặp lại với Fibonacci cho đến khi $alớn hơn đầu vào. Tại thời điểm đó, chúng tôi lập chỉ mục ($b,$a)dựa trên Boolean về việc liệu sự khác biệt giữa phần tử thứ nhất và $nlớn hơn giữa $nphần tử thứ hai hay không. Đó là còn lại trên đường ống, đầu ra là ẩn.


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)

Các trường hợp thử nghiệm


4

JavaScript (Nút Babel) , 41 byte

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

Dựa trên câu trả lời Python tuyệt vời của ovs

Hãy thử trực tuyến!

Bị đánh cắp

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

Điều này đã được nhận xét về câu trả lời của tôi nhưng nó sẽ khiến nó ngừng hoạt động 0(không phải nó cần; tôi chỉ muốn nó):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Neil

4

Python, 74 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Với mọi k ≥ 0, vì | - k / 5 | <1/2, F k = φ k / 5 + - k / √5 = vòng ( k / √5). Vì vậy, giá trị trả về chuyển từ F k - 1 đến F k chính xác nơi k = log φ ( n ⋅2√5) - 1 hoặc n = φ k + 1 / (2√5), nằm trong 1/4 của F k + 1/2 = ( F k - 1 + F k ) / 2.


Chết tiệt, tôi biết một cái gì đó như thế này phải có thể. Làm tốt! (+1)
SteamyRoot




3

Python 3 , 103 byte

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)])

Hãy thử trực tuyến!

Đáng buồn thay, đã phải sử dụng một def thay vì lambda ... Có lẽ có nhiều chỗ để cải thiện ở đây.

Câu trả lời gốc (không chính xác):

Python 3 , 72 byte

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

Hãy thử trực tuyến!

Trình PPCG đầu tiên của tôi. Thay vì tính toán các số Fibonacci theo cách đệ quy hoặc được xác định trước, mã này sử dụng cách số Fibonacci thứ n là số nguyên gần nhất với công suất thứ n của tỷ lệ vàng chia cho gốc 5.


Công việc tốt! Chào mừng bạn đến PPCG :)
musicman523

Để tính một cách công bằng số byte của mã của bạn, tôi nghĩ rằng bạn cần gán lambda, như trong các câu trả lời khác của Python. Tuy nhiên, thuật toán này không phải lúc nào cũng hoạt động chính xác cho n trong phạm vi (1, 1 + 10 ** 8). Ví dụ: n = 70 trả về 89, nhưng nó sẽ trả về 55. Dưới đây là các giá trị n <120 mà nó đưa ra câu trả lời sai cho: (27, 44, 70, 71, 114, 115, 116). Đối với mục đích thử nghiệm, bạn có thể muốn sử dụng nearest_fib_PM2Rchức năng tôi liên kết trong nhận xét của mình về câu hỏi.
PM 2Ring

@ PM2Ring Bạn nói đúng, tôi đã phạm một sai lầm ngu ngốc ... Bây giờ tôi có một giải pháp chính xác, nhưng với nhiều byte hơn. Đối với lambda, tôi tin rằng bạn đã sai. Tôi tin rằng các câu trả lời gán lambda chỉ làm như vậy vì chúng sử dụng đệ quy. Các câu trả lời Python 3 khác không gán lambda đầu tiên, ví dụ.
SteamyRoot

3

Taxi, 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.

Hãy thử trực tuyến!
Hãy thử trực tuyến với ý kiến!

Un-golfed với ý kiến:

[ 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)

Hãy thử trực tuyến!

Nó có thể hoạt động, nhưng nó chắc chắn không nhanh ...

Đầu ra Truethay vì 1, nhưng trong Python thì tương đương.


2

dc, 52 byte

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

Hãy thử trực tuyến!

Đưa đầu vào lúc chạy bằng cách sử dụng ?

Được chỉnh sửa để giả sử đầu ngăn xếp là giá trị đầu vào, -1 byte.

Đầu vào được lưu trữ trong đăng ký i. Sau đó, chúng tôi đặt 1 và 1 trên ngăn xếp để bắt đầu chuỗi Fibonacci và chúng tôi tạo chuỗi cho đến khi chúng tôi đạt giá trị lớn hơn i. Tại thời điểm này, chúng ta có hai số trong chuỗi Fibonacci trên ngăn xếp: một số nhỏ hơn hoặc bằng ivà một số lớn hơni . Chúng tôi chuyển đổi những điều này thành sự khác biệt tương ứng của họ với ivà sau đó so sánh sự khác biệt. Cuối cùng, chúng tôi xây dựng lại số Fibonacci bằng cách thêm hoặc bớt sự khác biệt i.

Rất tiếc, tôi đã tải hai thanh ghi theo thứ tự sai và sau đó hoán đổi chúng, lãng phí một byte.


Chức năng được cho phép.
Máy

Cảm ơn, tôi liên tục bỏ lỡ điều đó trong văn bản của thử thách.
brhfl



2

Lục giác , 37 byte

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

Hãy thử trực tuyến!

vô dụng:

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

Hỏng:

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

Giống như một số áp phích khác, tôi nhận ra rằng khi điểm giữa của dòng cuối và dòng lớn hơn mục tiêu, thì cái nhỏ hơn của hai cái là gần nhất hoặc được buộc cho gần nhất.

Điểm giữa là (dòng + cuối) / 2. Chúng ta có thể rút ngắn điều đó bởi vì tiếp theo đã là dòng + cuối cùng và nếu thay vào đó chúng ta nhân số nguyên mục tiêu của mình với 2, chúng ta chỉ cần kiểm tra xem (mục tiêu tiếp theo - 2 *)> 0, sau đó quay lại lần cuối.


2

Brachylog , 22 byte

;I≜-.∧{0;1⟨t≡+⟩ⁱhℕ↙.!}

Hãy thử trực tuyến!

Thực sự tất cả những gì tôi đã làm ở đây là dán cùng nhau cổ điển của Fatalize Trả về giải pháp số nguyên tố gần nhấtTôi có phải là Số Fibonacci không? dung dịch. May mắn thay, cái sau đã hoạt động trên biến đầu ra; thật không may, nó cũng bao gồm một phần cắt cần thiết phải được cách ly cho +2 byte, vì vậy điểm lựa chọn duy nhất mà nó loại bỏ là , giữ nguyên.



1

Java 7, 244 234 byte

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

Tại sao bạn không sử dụng Java 8 và biến nó thành lambda? Bạn cũng có thể xóa staticnếu bạn muốn gắn bó với Java 7.
Okx

Bạn có hai lỗi trong mã của mình ( r>c&&s<cnên là r>=c&&s<=c, s-cnên làc-s ), Bạn có thể loại bỏ khoảng trắng không bắt buộc, sử dụng int f(int i){return i<2?i:f(--i)+f(--i);}, sử dụng một câu lệnh trả về duy nhất với toán tử ternary trong c và loại bỏ xử lý đặc biệt để c-s==r-ctrả về giá trị được cho phép.
Nevay

@Nevay Tôi không thấy lỗi, tôi đã kiểm tra nó mà không thất bại
0x45




1

Perl 6 , 38 byte

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

Kiểm tra nó

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

Để tăng tốc độ tiềm năng .tail(2) trước.sort(…) .

Trong trường hợp hòa, nó sẽ luôn trả về giá trị nhỏ hơn trong hai giá trị, vì sortlà một loại ổn định. (hai giá trị sẽ sắp xếp giống nhau giữ thứ tự của chúng)


1

Bình thường, 19 byte

JU2VQ=+Js>2J)hoaNQJ

Hãy thử nó ở đây

Giải trình

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.