Мы все знакомы со знаменитой последовательностью Фибоначчи , которая начинается с 0
и 1
, и каждый элемент является суммой двух предыдущих. Вот первые несколько терминов (OEIS A000045 ):
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Если задано положительное целое число , верните ближайшее число последовательности Фибоначчи по следующим правилам:
Ближе число Фибоначчи определяется как число Фибоначчи с наименьшим абсолютной разности с заданным числом. Например,
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
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах на каждом языке !
n
означаетn ≥ 1
.Ответы:
Python 2 , 43 байта
Попробуйте онлайн!
Перебирает пары последовательных чисел Фибоначчи,
(a,b)
пока не достигнет единицы, где входное значениеn
меньше их средней точки(a+b)/2
, затем вернетсяa
.Написано как программа (47 байт):
Одинаковая длина :
источник
Нейм , 5 байт
Объяснение:
В новейшей версии Neim это может быть занято до 3 байтов:
Поскольку бесконечные списки были переработаны, чтобы подняться только до их максимального значения.
Попробуйте онлайн!
источник
Python ,
5552 байтаПопробуйте онлайн!
источник
R ,
7067646260 байт-2 байта благодаря джурио!
Еще 2 байта благодаря Джурио (мальчик может он в гольф!)
Поскольку нам нужно обрабатывать только значения
10^8
, это работает.Попробуйте онлайн!
Читает
n
со стандартного ввода.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(F[1]+F[2],F);F[order((F-n)^2)][1]
F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
F=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
numbers::fibonacci(x<-scan(),T)
JavaScript (ES6), 41 байт
Округляется по предпочтению.
источник
f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)
Поскольку вам не нужно работать с 0, вы можете играть в гольф немного больше.Желе ,
97 байт-2 байта благодаря @EriktheOutgolfer
Попробуйте онлайн!
Гольф советы приветствуются :). Принимает int для ввода и возвращает int-список.
источник
µḢ
.Mathematica, 30 байт
Попробуйте онлайн!
источник
Машинный код x86-64, 24 байта
Вышеуказанные байты кода определяют функцию в 64-битном машинном коде x86, которая находит ближайшее число Фибоначчи к указанному входному значению,
n
.Функция соответствует соглашению о вызовах AMD64 System V (стандартно для систем Gnu / Unix), так что единственный параметр (
n
) передается вEDI
регистр, а результат возвращается вEAX
регистр.Неуправляемая сборка мнемоники:
Попробуйте онлайн!
Код в основном делится на три части:
EAX
установлен в 0, иEDX
установлен на 1.Следующая часть представляет собой цикл , который итеративно вычисляет число Фибоначчи по обе стороны от входного значения,
n
. Этот код основан на моей предыдущей реализации Фибоначчи с вычитанием , но ... гм ... не с вычитанием. :-) В частности, он использует тот же трюк вычисления чисел Фибоначчи с использованием двух переменных, здесь, они являютсяEAX
иEDX
регистры. Этот подход чрезвычайно удобен здесь, потому что он дает нам смежные числа Фибоначчи. Кандидат потенциально меньше, чемn
удерживается, вEAX
то время как кандидат потенциально больше, чемn
удерживается вEDX
, Я весьма горжусь тем, насколько плотно я смог создать код внутри этого цикла (и еще более удивительно, что я открыл его самостоятельно, и только позже понял, насколько он похож на ответ вычитания, связанный выше).Как только у нас есть доступные значения Фибоначчи в
EAX
иEDX
, это концептуально простой вопрос выяснения, к какому из них ближе (в терминах абсолютного значения)n
. На самом деле принимать абсолютное значение будет стоить путем слишком много байт, поэтому мы просто делаем серию вычитаний. Комментарий справа от предпоследней инструкции условного перемещения удачно объясняет здесь логику. Это либо перемещаетсяEDX
вEAX
или листахEAX
сам по себе, так что , когда функцииRET
урны, ближайшее число Фибоначчей возвращаются вEAX
.В случае связи возвращается меньшее из двух значений-кандидатов, так как мы использовали
CMOVG
вместоCMOVGE
выбора. Это тривиальное изменение, если вы предпочитаете другое поведение. Возврат обоих значений не является началом; только одно целое число, пожалуйста!источник
nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-
недавнем ответе я использовал обрезку некоторых столбцов между машинным кодом и исходным кодом.xor eax,eax
/cdq
/inc edx
. Таким образом, вы можете создать 32-битную версию соглашения о вызовах, которая сохранит байт.cdq
часто использую ответы на вопросы по коду. Пользовательское соглашение о вызовах не требуется. Я обычно использую__fastcall
соглашение о вызовах Microsoft для 32-битного кода. Приятно то, что он поддерживается GCC с аннотацией, поэтому вы все еще можете использовать службу TIO, которую все хотят видеть.edi
/esi
дляlodsb
/stosb
, и только SysV делает это (забавный факт: специально по этой причине, потому что некоторые функции передают свои аргументы в memset / memcpy, и я думаю, что gcc в то время нравился встроить строку ops).PowerShell ,
8074 байта(Попробуйте онлайн! Временно не отвечает)
Итеративное решение. Принимает ввод
$n
, устанавливает$a,$b
значение be1,0
, а затем$a
выполняет цикл с Фибоначчи, пока не станет больше, чем ввод. В этот момент мы индексируем на($b,$a)
основе логического значения, является ли разница между первым элементом и$n
больше, чем между$n
вторым элементом. Это осталось на конвейере, вывод неявный.источник
JavaScript (ES6), 67 байт
Контрольные примеры
Показать фрагмент кода
источник
JavaScript (Babel Node) , 41 байт
Основанный на удивительном Python-ответе ovs
Попробуйте онлайн!
Ungolfed
источник
0
(не то, что это нужно; я просто хочу, чтобы это):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Python, 74 байта
Попробуйте онлайн!
Как это работает
Для всех k ≥ 0, так как | φ - k / √5 | <1/2, F k = φ k / √5 + φ - k / √5 = round (φ 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.
источник
05AB1E , 6 байтов
Попробуйте онлайн!
источник
C (gcc) ,
86858376 байтовПопробуйте онлайн!
источник
Java (OpenJDK 8) ,
605756 байтПопробуйте онлайн!
-1 байт благодаря @Neil
источник
Python 3 , 103 байта
Попробуйте онлайн!
К сожалению, пришлось использовать def вместо лямбды ... Вероятно, здесь есть много возможностей для улучшения.
Оригинальный (неверный) ответ:
Python 3 , 72 байтаПопробуйте онлайн!
Моя первая подача PPCG. Вместо рекурсивного вычисления чисел Фибоначчи или их предопределения в этом коде используется то, как n-е число Фибоначчи является ближайшим целым числом к n-й степени золотого сечения, деленного на корень из 5.
источник
nearest_fib_PM2R
функцию, на которую я ссылался в своем комментарии к вопросу.Такси, 2321 байт
Попробуйте онлайн!
Попробуйте онлайн с комментариями!
Без гольфа с комментариями:
источник
Python 3 , 84 байта
Попробуйте онлайн!
Это может работать, но это, конечно, не быстро ...
Выходы
True
вместо1
, но в Python они эквивалентны.источник
постоянный ток, 52 байта
Попробуйте онлайн!
Принимает ввод при запуске, используя?
Отредактировано, чтобы принять верхнюю часть стека в качестве входного значения, -1 байт.
Ввод сохраняется в реестре
i
. Затем мы помещаем 1 и 1 в стек, чтобы запустить последовательность Фибоначчи, и мы генерируем последовательность, пока не достигнем значения больше, чемi
. На данный момент у нас есть два числа в последовательности Фибоначчи в стеке: одно меньше или равноi
, а другое больше чемi
. Мы преобразуем их в соответствующие различия,i
а затем сравниваем различия. Наконец, мы восстанавливаем число Фибоначчи, добавляя или вычитая разницу вi
.К сожалению, я загружал два регистра в неправильном порядке, а затем менял их, тратя впустую байт.
источник
C # (.NET Core) ,
6356 байт-1 байт благодаря @Neil
-6 байт благодаря @Nevay
Попробуйте онлайн!
источник
for(;b<n;a=b,b+=c)c=a;
байт?c
с помощьюb+=a,a=b-a
(следует сохранить 6 байтов).Q / KDB +, 51 байт
источник
Гексагония , 37 байт
Попробуйте онлайн!
ungolfed:
Сломано:
Как и некоторые другие плакаты, я понял, что когда средняя точка last и curr больше цели, меньшая из двух является ближайшей или привязанной к ближайшей.
Средняя точка находится в (last + curr) / 2. Мы можем сократить это, поскольку next - это уже last + curr, и если вместо этого мы умножим целевое целое число на 2, нам нужно только проверить, что (next - 2 * target)> 0, а затем вернуть last.
источник
Брахилог , 22 байта
Попробуйте онлайн!
На самом деле все, что я здесь сделал, это приклеил вместе классическое решение Fatalize. Вернуть ближайшее решение простых чисел и мое собственное. Являюсь ли я числом Фибоначчи? решение. К счастью, последний уже работает с выходной переменной; к сожалению, он также включает в себя необходимый отрезок, который должен быть изолирован для +2 байта, поэтому единственная точка выбора, которую он отбрасывает, - это
ⁱ
оставить≜
без изменений.источник
Japt
-g
, 8 байтПопытайся
источник
Java 7,
244234 байтаисточник
static
если хотите придерживаться Java 7.r>c&&s<c
должно бытьr>=c&&s<=c
,s-c
должно бытьc-s
). Вы можете удалить ненужные пробелы, использоватьint f(int i){return i<2?i:f(--i)+f(--i);}
, использовать один оператор return с троичным оператором в c и удалить специальную обработку дляc-s==r-c
возврата любого значения.Пайк , 6 байт
Попробуйте онлайн!
источник
Common Lisp, 69 байт
Попробуйте онлайн!
источник
Perl 6 , 38 байт
Попробуй это
Для потенциального ускорения добавьте
.tail(2)
раньше.sort(…)
.В случае связи, он всегда будет возвращать меньшее из двух значений, потому что
sort
это стабильная сортировка. (два значения, которые будут сортироваться одинаково, сохраняют свой порядок)источник
Pyth, 19 байт
Попробуй здесь
объяснение
источник
Haskell, 48 байтов
Попробуйте онлайн!
источник