Знайдіть найближче число Фібоначчі


30

Всі ми знайомі з відомою послідовністю Фібоначчі , яка починається з 0і 1, і кожен елемент є сумою попередніх двох. Ось кілька перших термінів (OEIS A000045 ):

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

Дано a додатне ціле число , поверніть найближче число послідовності Фібоначчі за цими правилами:

  • Ближче число Фібоначчі визначається як число Фібоначчі з найменшим абсолютної різниці з заданим числом. Наприклад, 34це найближче число до Фібоначчі 30, тому що |34 - 30| = 4, яке менше, ніж друге найближче 21, для якого |21 - 30| = 9.

  • Якщо дане ціле число належить послідовності Фібоначчі, найближче число Фібоначчі є саме собою. Наприклад, найближчий число Фібоначчі , щоб 13точно 13.

  • У разі прив'язки ви можете вивести або одне з чисел Фібоначчі, які є найближчими до входу, або просто вивести їх обидва. Наприклад, якщо на вході 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

Оцінка балів

Це , тому найкоротший код у байтах кожною мовою виграє!



FWIW, ось якийсь код Python на SO для того, щоб зробити це ефективно для великих входів, а також сценарій, який можна використовувати для встановлення часу різних алгоритмів.
PM 2Ring

Чи вважається 0 додатним цілим числом?
Алікс Ейзенхардт

@AlixEisenhardt Ні. Позитивне ціле числоn має на увазі n ≥ 1.
Містер Xcoder

Відповіді:


21

Python 2 , 43 байти

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

Спробуйте в Інтернеті!

Ітератується через пари послідовних чисел Фібоначчі, (a,b)поки не досягне одиниці, де вхід nменший від їх середини (a+b)/2, а потім повертається a.

Написано як програма (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

Нейм , 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 байт, коли там є два символи? І яка різниця між першим і другим рішенням?
caird coinheringaahing

1
Ви рахуєте байти чи символи? Здається, перший - 15 байт, а другий - 7 байт.
Nateowami

Це, мабуть, має якусь власну кодову сторінку, в якій кожен символ має власний байт, тобто перший - 5 байт, а другий - 3 байти. Різниця між ними полягає в тому, що перший вибирає перший посібник з 93 елементів, тоді як другий фрагмент в новій версії автоматично вибирає максимально можливе значення, з яким можуть працювати мовні розміри int
Roman Gräf

1
@cairdcoinheringaahing У мене часто виникали проблеми з тим, що люди не бачать мої програми. Знімок екрана
Okx

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цикл генерує чисел Фібоначчі в F(в порядку убування); у разі вирівнювання повертається більший. Це призведе до ряду попереджень, оскільки while(F<1e8)тільки оцінює оператор для першого елементаF лише попередження

Спочатку я використовував F[which.min(abs(F-n))]наївний підхід, але @djhurio запропонував, (F-n)^2оскільки замовлення буде рівнозначним, а orderне which.min. orderповертає перестановку індексів, щоб привести свій вхід у зростаючий порядок, тому нам потрібно [1]в кінці отримати лише перше значення.

більш швидка версія:

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

зберігає лише два останніх цифри


1
Хороший. -2 байтиF=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 приємно! дуже тобі дякую.
Джузеппе

1
Мені подобається це. -2 байт зновуF=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
djhurio

Використання вбудованого для створення фібнумів коротше: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 Хм, тепер ти це згадуєш, Business Cat побив мене до цього ...
Ніл

(Ну, майже ... Я змусив свою версію працювати з 0, бо чому б і ні?)
Ніл

f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)Оскільки вам не доведеться працювати з 0, ви можете трохи більше пограти в гольф.
Алікс Ейзенхардт

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]

Ви можете видалити µḢ.
Ерік Аутгольфер

@EriktheOutgolfer як у: "Є спосіб зробити це, якщо ви подумаєте про це", або як у "Якщо ви буквально просто повертаєте їх назад, він все ще працює"?
nmjcman101

Як і в "це дозволено правилами". : P
Ерік Аутгольфер

Ага. Дякую! (Текст наповнювача)
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, яка знаходить найближче число Фібоначчи до заданого вхідного значення, n .

Функція слідує умові виклику System V AMD64 (стандарт для систем Gnu / Unix), таким чином, що єдиний параметр ( n) передається в EDIрегістр, а результат повертається вEAX регістр.

Невикольована збірна мнемоніка:

; 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.
  • Наступна частина являє собою цикл , який итеративно обчислює число Фібоначчі по обидві сторони від вхідного значення, n. Цей код заснований на моїй попередній реалізації Фібоначчі з відніманням , але ... гм ... не з відніманням. :-) Зокрема, він використовує один і той же трюк обчислення числа Фібоначчі за допомогою двох змінних - ось, це EAXі EDXрегістри. Цей підхід тут надзвичайно зручний, оскільки дає нам суміжні числа Фібоначчі. Кандидат потенційно менше, ніж n утримується EAX, а кандидат потенційно більший за n утримуєтьсяEDX. Я дуже пишаюся тим, наскільки щільно мені вдалося зробити код всередині цього циклу (і ще більше позначив, що я його знову відкрив самостійно, і лише згодом зрозумів, наскільки це схоже на відповідь віднімання, зв'язану вище).

  • Після того, як ми отримаємо в кандидата значення Фібоначчі, EAXі EDXце концептуально просте питання з'ясувати, яке з них ближче (з точки зору абсолютного значення) n. На насправді приймати абсолютне значення буде коштувати шляхом занадто багато байт, тому ми просто робимо серію вирахувань. Коментар праворуч від передостанньої інструкції з умовного переміщення влучно пояснює логіку тут. Це або переміщається EDXв EAXабо аркушах EAXсам по собі, так що , коли функції RETурни, найближчим число Фібоначчі повертаються в EAX.

У разі зрівняння повертається менший з двох значень кандидата, оскільки ми використовували CMOVGзамість того, CMOVGEщоб робити вибір. Це банальна зміна, якщо ви віддаєте перевагу іншій поведінці. Повернення обох значень, однак, не є стартером; тільки один цілий результат, будь ласка!


Списки NASM приємні для відповідей на кодегольф, оскільки вони компактно змішують байти машинного коду з оригінальним коментованим джерелом. nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-В останній відповіді я обрізав кілька стовпців між машинним кодом та джерелом.
Пітер Кордес

1
У 32-бітному коді ви можете отримати eax = 0 і edx = 1 лише в 4 байти замість 5, з xor eax,eax/ cdq/ inc edx. Таким чином, ви можете зробити 32-бітну спеціальну версію-конвенцію для викликів, яка зберегла байт.
Пітер Кордес

Раніше я це робив, @Peter, але тут сильно плутається думка про те, що матеріали перебувають у "складанні" або "машинному коді". Мабуть, деякі досвідчені користувачі стверджують, що є різниця, і заперечують проти мого підрахунку байтів машинного коду для відповіді, що подається за допомогою мнемоніки складання. Природно, я вважаю це дурним, тому що "складання" - це просто мнемічне зображення машинних байтів, але я виграв. Я виявив, що окрема презентація створює менше тертя, навіть якщо мені це теж не подобається.
Коді Грей

Інший трюк приємний - дякую. Я мав би подумати про це, я cdqбагато використовую у кодово-гольф-відповідях. Не потрібна спеціальна конвенція про дзвінки. Я зазвичай використовую Microsoft__fastcall виклику для 32-бітного коду. Приємне в цьому, що він підтримується GCC з анотацією, тому ви все ще можете користуватися послугою TIO, яку всі хочуть бачити.
Коді Грей

Ага так, будь-який старий реєстр, що викликає конвенцію, працює для вас. Моїй останній відповіді кодегольфа потрібні вказівники в edi/esi для lodsb/ stosb, і тільки x86-64 SysV це робить (цікавий факт: спеціально з цієї причини, тому що деякі функції передають свої аргументи в 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, а потім петлю з Фібоначчі до тих пір, поки не $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 (Babel Node) , 41 байт

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

На основі дивовижної відповіді Python ovs

Спробуйте в Інтернеті!

Безумовно

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)
Ніл

4

Пітон, 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.


Чорт, я знав, що щось подібне повинно бути можливим. Молодці! (+1)
SteamyRoot




3

Python 3 , 103 байти

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

Спробуйте в Інтернеті!

На жаль, довелося використовувати деф замість лямбда ... Тут, мабуть, багато місця для вдосконалення.

Оригінальна (неправильна) відповідь:

Python 3 , 72 байти

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

Спробуйте в Інтернеті!

Моє перше подання про PPCG. Замість того, щоб або обчислювати числа Фібоначчі рекурсивно, або встановлюючи їх заздалегідь, цей код використовує, як n-е число Фібоначчі є найближчим цілим числом до n-го значення відношення золота, розділене на корінь 5.


Хороша робота! Ласкаво просимо до PPCG :)
musicman523

Щоб справедливо обчислити кількість байтів вашого коду, я думаю, вам потрібно призначити лямбда, як показано в інших відповідях Python. Однак цей алгоритм не завжди працює правильно для n у діапазоні (1, 1 + 10 ** 8). Наприклад, n = 70 повертає 89, але має повернути 55. Ось n значень <120, на які він дає неправильні відповіді: (27, 44, 70, 71, 114, 115, 116). Для тестування ви можете скористатися nearest_fib_PM2Rфункцією, яку я пов’язав у своєму коментарі до питання.
20:00 17

@ PM2Ring Ти маєш рацію, я зробив дурну помилку ... Зараз у мене правильне рішення, але з набагато більшою кількістю байтів. Щодо лямбда, я вважаю, що ви помиляєтесь. Я вважаю, що відповіді, які призначають лямбда, роблять це лише тому, що вони використовують рекурсію. Інші відповіді Python 3, наприклад, не присвоюють перші лямбда.
SteamyRoot

3

Таксі, 2321 байт

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.

Спробуйте в Інтернеті!
Спробуйте в Інтернеті з коментарями!

Без гольфу з коментарями:

[ 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

постійного струму, 52 байти

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

Спробуйте в Інтернеті!

Здійснює введення при використанні ?

Відредаговано, щоб прийняти верхню частину стека як вхідне значення, -1 байт.

Вхід зберігається в регістрі i. Потім ми ставимо 1 і 1 на стек, щоб запустити послідовність Фібоначчі, і генеруємо послідовність, поки не досягнемо значення, що перевищує значення i. На даний момент у стеку є два числа в послідовності Фібоначчі: одне, яке менше або рівне i, і одне, що більше, ніж i. Ми перетворюємо їх у відповідні відмінності з, iа потім порівнюємо відмінності. Нарешті, ми реконструюємо число Фібоначчі шляхом додавання чи віднімання різниці до i.

На жаль, я завантажував два регістри в неправильному порядку, а потім міняв їх, марнуючи байт.


Функції дозволені.
CalculatorFeline

Дякую, я не раз пропускав це в тексті виклику.
brhfl



2

Шестикутник , 37 байт

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

Спробуйте в Інтернеті!

неозорений:

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

Зломаний:

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

Як і деякі інші афіші, я зрозумів, що коли середина останнього та кур'єр більша за мету, менший з двох є найближчим чи прив’язаним до найближчих.

Середня точка знаходиться на (останній + курсор) / 2. Ми можемо скоротити це, оскільки наступним є вже останнє + curr, і якщо ми замість цього помножимо цільове ціле число на 2, нам потрібно лише перевірити, що (next - 2 * target)> 0, і повернути останнє.


2

Брахілог , 22 байти

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

Спробуйте в Інтернеті!

Really all I've done here is paste together Fatalize's classic Return the closest prime number solution and my own Am I a Fibonacci Number? solution. Fortunately, the latter already operates on the output variable; unfortunately, it also includes a necessary cut which has to be isolated for +2 bytes, so the only choice point it discards is , leaving intact.



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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.