Введение
Мы все знаем и любим нашу последовательность Фибоначчи и уже видели множество испытаний здесь. Тем не менее, нам все еще не хватает очень простого случая, который даст этот ответ: обратные фибоначчи! Так что учитывая F_n
вашу работу, чтобы найти n
.
Спецификация
вход
Ваш ввод будет неотрицательным целым числом, которое гарантированно будет частью последовательности Фибоначчи.
Выход
Вывод также должен быть неотрицательным целым числом.
Что делать?
Во введении уже сказано: учитывая число Фибоначчи, выведите его индекс. Число Fiboancci при этом определяется как F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
и вы даны F(n)
и должны вернуться n
.
Потенциальные Угловые Случаи
0 является действительным входом и выходом.
Если в качестве входных данных указано «1», вы можете вывести «1» или «2», как вам больше нравится.
Вы всегда можете предположить, что ваши данные на самом деле являются числом Фибоначчи.
Вы можете предположить, что входные данные представлены в виде 32-разрядного целого числа со знаком.
Кто выигрывает?
Это код-гольф, поэтому выигрывает самый короткий ответ в байтах!
Стандартные правила применяются конечно.
Тест-кейсы
0 -> 0
2 -> 3
3 -> 4
5 -> 5
8 -> 6
13 -> 7
1836311903 -> 46
Ответы:
На самом деле, 1 байт
Да, для этого есть встроенная функция с 16 ноября 2015 года .
Попробуйте онлайн
Для забавы, без встроенного, это 9 байтов:
Попробуйте онлайн!
Объяснение:
источник
Mathematica, 25 байтов
Функция. Довольно очевидно, если вы спросите меня.
источник
Python,
363432 байтаПредыдущие версии:
объяснение
Основная идея состоит в том, чтобы инвертировать формулу
что говорит нам о том, что
получить
Оптимизация игры в гольф:
len(str(n))
для вычисления базы 10 журналов без импортаlog
(старая версия использовалась.bit_length()
для расчета базы 2 журналов)n
в степень, чтобы в приближении логарифма можно было различать последовательные числа ФибоначчиЗатем делитель был усечен до минимальной точности, и я смог выбрать множитель, чтобы получить правильные результаты для всех 32-битных чисел Фибоначчи.
источник
f=
не считается.lambda n:~-len(`66*n**6`)//1.24
должно работать.05AB1E , 3 байта
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Желе,
1411 байтПопробуйте онлайн!
Это мой первый желейный ответ! Это использует алгоритм из ответа MATL . Спасибо Деннису за то, что он сбрил 3 байта!
Объяснение:
Это дает правильный ответ, теперь нам просто нужно обработать специальный случай «0». С '0' в качестве аргумента мы получаем
-infinity
, поэтому мы возвращаемисточник
Юлия,
272618 байтПри этом используется обратная формула Бине , с достаточной точностью для 32-битных целых чисел; фактически он работает до F (153) = 42 230 309 526 998 466 217 810 220 532 898> 2 105 .
Попробуйте онлайн!
Как это работает
Формула Бине гласит следующее.
Ограничение F на множестве Фибоначчи, отображение N → F п имеет право обратного F → N F .
У нас есть это
и все, что осталось сделать, это иметь дело с краевым случаем 0 .
Поскольку ввод ограничен 32-разрядными целыми числами, мы можем использовать короткие десятичные литералы вместо констант в формуле.
log φ = 0,481211825059603447… ≈ 0,48
К сожалению, 0.5 недостаточно точен.
√5 = 2,2360679774997896964… ≈ 3
На первый взгляд это может показаться ужасным приближением, но мы берем логарифмы и, поскольку log 3 - log √5 = 0,29389333245105… , результат до округления будет отключен с помощью небольшого постоянного коэффициента.
0,5 ≈ 0,7
Из-за превышения предыдущего приближения мы могли бы вообще опустить этот термин и все же получить правильные результаты для F> 0 . Однако, если F = 0 , логарифм будет неопределенным. 0,7 оказалось самым коротким значением, которое расширяет нашу формулу до F = 0 .
источник
JavaScript,
5450695042 байтаКонечно, это не победит, просто для удовольствия :)
Хорошо, проверка на ноль потребляет 19 байтов. WTF?Глупый я.Демо! Чтобы увидеть последний контрольный пример, нужно немного прокрутить консоль.
Спасибо @edc за сокращение на 8 байтов.
источник
b=>{for(j=1,i=c=0;b-i;c++)i=j+(j=i);return c}
45, в гольфеb=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c
42.Perl 6
33 3027 байтПопытайся
Объяснение:
Тест:
источник
first *==$_
на простоfirst $_
, потому что число является действительным смарт-соответствия....
оператора вместоfirst
Желе , 8 байт
Попробуйте онлайн! Обратите внимание, что этот подход слишком неэффективен для последнего контрольного примера.
Как это работает
источник
Пайк, 5 байт
Попробуй это здесь!
источник
Python, 29 байт
Рекурсивно делит входные данные на приближение золотого сечения 1,61, пока оно не станет ниже 0,7, и выводит число делений.
Для 0 выводится код
False
, который равен 0 в Python . Этого можно избежать на 2 байтаисточник
JavaScript (ES6),
3933 байтаДаже с ES7 обратная формула Бине занимает 47 байтов:
источник
log
и предварительно вычислите все константы ...f(n,k,j+k)
вы должны включить присвоениеf=
и считать его как +2 байта . Правило для неименованных лямбд не должно применяться здесь.Sage, 49 байтов
Благодаря TuukkaX за предложение о сохранении в
sqrt(5)
качествеs
сбрить несколько байт.Попробуйте онлайн .
Этот подход, использующий обратную формулу Бине, предлагает несколько улучшений по сравнению с предыдущим подходом: он быстрее (постоянное время по сравнению с квадратичным), он действительно работает для больших входов и короче!
Пользователи Python могут задаться вопросом, почему я использую
sqrt(5)
вместо более коротких5**.5
- это потому, что5**.5
вычисляется с помощьюpow
функции C и теряет точность из-за проблем с плавающей запятой. Многие математические функции (включаяsqrt
иlog
) перегружены в Sage, чтобы вернуть точное символическое значение, которое не теряет точности.источник
sqrt(5)
переменную in и использовать ее дважды вместо вводаsqrt(5)
дважды?MATL , 14 байтов
Попробуйте онлайн!
Это использует обратную формулу Бине , и поэтому это очень быстро.
Пусть F обозначает n-е число Фибоначчи, а φ - золотое сечение . затем
Код использует эту формулу с двумя модификациями:
Как это сделано
источник
O1G:"yy+]vGmfq
t?17L&YlXkQ
5X^*
. ( Я делал это раньше .) И я не знаю достаточно MATL, чтобы продолжать улучшать его.Python, 38 байт
Проверьте это на Ideone .
источник
JavaScript, 22 байта
источник
-Infinity|0
,0
в JavaScript. Пойди разберись.-Infinity = FFF00000 00000000
. Я был рад узнать, что он экономит 3 байта для того, чтобы не добавлять явный нулевой тест, какn&&
. Кроме того, основной целью|0
является заменаMath.trunc()
(как÷
в Юлии).C
6258 байтДетальнее
источник
Java 7, 70 байт
https://ideone.com/I4rUC5
источник
int c(int n){int a=0,b=1,c=0,t;for(;a<n;t=b,b+=a,a=t)c++;return c;}
(не проверено)int c(int n){int a=0,b=1,c=0;while(a<n){c++;b+=a;a=b-a;}return c;}
(не проверено)int c(int n){int a=0,b=1,c=0;for(;a<n;b+=a,a=b-a)c++;return c;}
(не проверено)TSQL, 143 байта
Ввод идет
@n
как вDECLARE @n INT = 1836311903;
источник
Haskell, 45 байт
источник
Sesos , 28 байт
HexDump:
Попробуйте онлайн!
(Экспоненциальное время, потому что при копировании числа в Sesos требуется экспоненциальное время.)
Сборка используется для генерации двоичного файла:
источник
Java 8 61 байт
То же, что и @dainichi, ответ сокращается только при использовании лямбд Java 8. Ответ является допустимым выражением.
Ungolfed:
источник
Pyth, 13 байт
Тестирование.
Приближение в Python 2:
альтернативный подход, 18 байт
Тестирование.
Это использует
.I
для обратного.источник
Java 7, 89 байт
Вдохновлен объяснением ответа @Adnan 's 05AB1E .
Ungolfed и тестовые случаи:
Попробуй это здесь. (Превышено ограничение по времени для последнего контрольного примера, но на моем компьютере оно работает примерно через 30-45 секунд.)
Выход:
источник
Perl 5,10, 48 байт
В основном искал именно
n
такF(n) = input
.-a
Переключатель добавляет один байт.Попробуй это здесь!
источник
J,
322717 байтВычисляет первые n чисел Фибоначчи, а затем находит индекс n в этом списке.
использование
Дополнительные команды используются для форматирования нескольких входов / выходов. Последний тестовый пример опущен, так как он потребует гораздо больше времени для вычислений.
объяснение
источник
Mathematica, 30 байт
Чистая функция; возвращает 2, если вход 1.
Не превосходит другую запись Mathematica, но демонстрирует необычный метод: это (очень крутой) факт, что N-е число Фибоначчи является ближайшим целым числом к [1 / sqrt (5) раз N-й степени золотого сечения] (" Формула Бине ").
Следовательно, обратная функция будет логарифмом по основанию [золотое сечение] [sqrt (5) раз умноженного на число Фибоначчи].
.8+
Хак , чтобы убедиться , что мы не берем логарифм 0, не щуря другие значения.источник
Japt , 10 байт
Попробуйте онлайн!
объяснение
источник
Брахилог , 14 байт
Попробуйте онлайн!
Принимает ввод через выходную переменную и выводит через входную переменную.
Я не совсем уверен, зачем
≜
это нужно.источник
Javascript (с использованием внешней библиотеки) (84 байта)
Ссылка на lib: https://github.com/mvegh1/Enumerable
Объяснение кода: в библиотеке есть статический метод, который создает последовательность, пока предикат не получит неопределенное возвращаемое значение. Предикат имеет сигнатуру ("i" ndex, текущий внутренний сгенерированный "a"). На каждой итерации мы проверяем, равен ли последний элемент внутреннего массива входу n. Если нет, верните следующее значение в последовательности fib. В противном случае предикат имеет неопределенный результат, который завершает генерацию последовательности. Затем мы возвращаем длину последовательности (и вычитаем 1, чтобы соответствовать нулю на основе 0, как видно из OP
источник
n=>{a=c=t=0,b=1;while(a<n){c++;t=b;b+=a;a=t}return c}
Попробуйте онлайн!