Твое задание:
Напишите программу или функцию, чтобы проверить, является ли введенное число числом Фибоначчи . Число Фибоначчи - это число, содержащееся в последовательности Фибоначчи.
Последовательность Фибоначчи определяется как:
F(n) = F(n - 1) + F(n - 2)
С семенами F(0) = 0
и F(1) = 1
.
Входные данные:
Неотрицательное целое число от 0 до 1 000 000 000, которое может быть или не быть числом Фибоначчи.
Выход:
Истинное / ложное значение, указывающее, является ли входное значение числом Фибоначчи.
Примеры:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Подсчет очков:
Это код-гольф , выигрывает меньшее количество байт.
code-golf
sequence
decision-problem
fibonacci
Грифон - Восстановить Монику
источник
источник
Ответы:
Нейм , 2 байта
Объяснение:
Работает так же, как мой ответ « Это бедро, чтобы быть квадратным» , но использует другой бесконечный список:
f
для Фибоначчи.Попробуй!
источник
66 D5
JavaScript (ES6), 34 байта
Рекурсивно генерирует последовательность Фибоначчи, пока не найдет элемент, больший или равный входному значению, затем возвращает элемент == входное значение.
источник
Сетчатка , 23 байта
Попробуйте онлайн!
Вход в унарный, выходы
0
или1
.объяснение
Последовательность Фибоначчи является хорошим кандидатом для решения с прямыми ссылками, то есть «обратной ссылкой», которая ссылается либо на окружающую группу, либо на группу, которая появляется позже в регулярном выражении (в данном случае мы фактически используем оба из них). При сопоставлении таких чисел нам нужно вычислить рекурсивное выражение для разницы между элементами последовательности. Например, чтобы соответствовать треугольным числам, мы обычно совпадаем с предыдущим сегментом плюс один. Чтобы сопоставить квадратные числа (отличия которых являются нечетными числами), мы сопоставляем предыдущий сегмент плюс два.
Так как мы получаем числа Фибоначчи, добавляя второй к последнему элементу к последнему, различия между ними также являются только числами Фибоначчи. Таким образом, мы должны сопоставить каждый сегмент как сумму двух предыдущих. Суть регулярного выражения заключается в следующем:
Теперь это выливается сложения чисел Фибоначчи , начиная с 1 , то есть 1, 1, 2, 3, 5, ... . Те дополнения до 1, 2, 4, 7, 12, ... . Т.е. они на единицу меньше, чем числа Фибоначчи, поэтому мы добавляем
1
в конце. Единственный случай, который не покрывает это ноль, поэтому у нас есть^$
альтернатива, чтобы покрыть это.источник
^$|^(^1|\2?+(\1))*1$
^
.Regex (на ECMAScript),
392358328224206165 байтовМетоды, которые необходимо использовать для сопоставления чисел Фибоначчи с регулярным выражением ECMAScript (в унарном формате), далеки от того, как это лучше всего сделать в большинстве других разновидностей регулярных выражений. Отсутствие прямых / вложенных обратных ссылок или рекурсии означает, что невозможно напрямую подсчитать или сохранить промежуточный итог чего-либо. Отсутствие осмотрительности часто затрудняет работу даже при наличии достаточного пространства для работы.
К многим проблемам нужно подходить с совершенно иной точки зрения, и они кажутся неразрешимыми до появления какой-то ключевой идеи. Это заставляет вас создавать более широкую сеть, чтобы определить, какие математические свойства чисел, с которыми вы работаете, могут быть использованы для решения конкретной задачи.
В марте 2014 года это произошло с числами Фибоначчи. Глядя на страницу Википедии, я изначально не мог найти выход, хотя одно конкретное свойство казалось мучительно близким. Затем математик Теукон описал метод, который дал понять, что это возможно сделать, используя это свойство вместе с другим. Он не хотел на самом деле построить регулярное выражение. Его реакция, когда я пошел вперед и сделал это:
Как и в других моих постах по унарным математическим регулярным выражениям в ECMAScript, я дам предупреждение: я настоятельно рекомендую узнать, как решать унарные математические задачи в регулярных выражениях в ECMAScript. Для меня это было увлекательное путешествие, и я не хочу испортить его тем, кто потенциально может попробовать его сами, особенно тем, кто интересуется теорией чисел. См. Этот пост для списка последовательно рекомендованных спойлером проблем, решаемых один за другим.
Так что не читайте дальше, если вы не хотите, чтобы какая-то магия унарного выражения была испорчена для вас . Если вы действительно хотите сами разобраться в этой магии, я настоятельно рекомендую начать с решения некоторых проблем в регулярном выражении ECMAScript, как описано в этом посте, связанном выше.
Задача, с которой я изначально столкнулся: положительное целое число x - это число Фибоначчи тогда и только тогда, когда 5x 2 + 4 и / или 5x 2 - 4 - идеальный квадрат. Но нет места, чтобы вычислить это в регулярном выражении. Единственное пространство, в котором мы должны работать, это само число. У нас даже недостаточно места, чтобы умножить на 5 или взять квадрат, не говоря уже о обоих.
Идея teukon о том, как ее решить ( изначально размещена здесь ):
А вот макет алгоритма на C, который я написал в качестве теста перед его реализацией в регулярном выражении.
Так что без дальнейших церемоний, вот регулярное выражение:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Попробуйте онлайн!
И довольно напечатанная, закомментированная версия:
Алгоритм умножения не объясняется в этих комментариях, но вкратце объясняется в абзаце моего регулярного выражения с многочисленными числами .
Я поддерживал шесть различных версий регулярного выражения Фибоначчи: четыре, которые ускоряют от самой короткой длины до самой быстрой скорости и используют алгоритм, описанный выше, и две другие, которые используют другой, намного более быстрый, но гораздо более длинный алгоритм, который, как я обнаружил, может на самом деле вернуть индекс Фибоначчи как совпадение (объяснение того, что алгоритм здесь выходит за рамки этого поста, но объясняется в оригинальном обсуждении Gist ). Я не думаю, что снова поддержу столько очень похожих версий регулярного выражения, потому что в то время я проводил все свои тесты в PCRE и Perl, но мой движок регулярных выражений достаточно быстрый, так что проблемы со скоростью уже не так важны (и если конкретная конструкция вызывает узкое место, я могу добавить оптимизацию для нее) - хотя я, вероятно, снова поддержу одну самую быструю версию и одну самую короткую версию, если разница в скорости были достаточно большими.
Версия «верните индекс Фибоначчи минус 1 как матч» (не в гольфе):
Попробуйте онлайн!
Все версии находятся на github с полной историей коммитов оптимизации гольфа:
регулярное выражение для сопоставления чисел Фибоначчи - короткий, скорость 0.txt (самый короткий, но самый медленный, как в этом посте)
регулярное выражение для сопоставления чисел Фибоначчи - короткий, скорость 1.txt
регулярное выражение для сопоставления чисел Фибоначчи - короткий, скорость 2.txt
регулярное выражение для сопоставление чисел Фибоначчи - короткие, скоростные регулярные
выражения 3.txt для сопоставления чисел Фибоначчи - регулярное выражение fastest.txt
для сопоставления чисел Фибоначчи - возвращение index.txt
источник
Python 3 , 48 байт
Попробуйте онлайн!
источник
int
установит планку выше (все еще не произвольно большой), но мы также не заставляем ответы C использовать 64-битные целые числа (или 128-битные с gcc). В любом случае, разрешено использовать один и тот же алгоритм на одном языке, но не на другом, кажется бессмысленным.Python 2,
4844 байтаПопробуйте онлайн
Спасибо Джонатану Аллану за сохранение 4 байта
источник
False
и ложными значениямиTrue
: TIO !n-a
вместоn==a
и иметь -1 и 0 в качестве возвращаемых значений.-101
или какой-то другой результат вместо-1
.05AB1E ,
87 байтОбъяснение:
Попробуйте онлайн!
-1 спасибо Джонатану Аллану за обходной путь числа 0-не-Фибоначчи.
источник
n
(сохранения байта), какÅF
это включено и¹å
приведет в0
любом случае дляn=0
?Perl 6 , 23 байта
источник
{(0,1,*+*...^*>$_).tail==$_}
было то, что я собирался изначально опубликовать. Возможно, я наконец-то нашел операторы Set .Серьезно , 3 байта
Попробуйте онлайн!
Возвращает индекс +1 в списке чисел Фибоначчи, если верно, в противном случае возвращает ложь.
Объяснение:
источник
Желе ,
8 76 байтПопробуйте онлайн!
Как?
Примечания:
‘
требуется увеличение, так , чтобы это работало для 2 и 3 , поскольку они являются 3- м и 4- м числами Фибоначчи - за пределами 3 все числа Фибоначчи больше, чем их индекс.-
нужен (а не только‘R
) , так что это работает для 0 , начиная с 0 является 0 - го числа Фибоначчи;источник
3
:)ZX81 BASIC
180151100~ 94 токенов BASICБлагодаря Moggy на форумах SinclairZXWorld, есть гораздо более аккуратное решение, которое экономит больше байтов.
Это выведет 1, если введено число Фибоначчи, или ноль, если нет. Хотя это экономит байты, это намного медленнее, чем в старых решениях ниже. Для скорости (но больше ОСНОВНЫХ байтов) удалите
VAL
обертки вокруг строковых литералов. Вот старые (er) решения с некоторыми пояснениями:Вышеуказанные поправки экономят дополнительные байты BASIC для сведения
IF
операторов в одинPRINT
в строке 12; другие байты были сохранены с использованиемVAL
ключевого слова и, и с использованиемGOTO CODE "£"
, которое в наборе символов ZX81 равно 12. Строки сохраняют больше байтов по числам, так как все числовые значения хранятся как числа с плавающей запятой, поэтому занимают больше места в стеке VAR.источник
5 IF R<F THEN NEXT I
- мой плохой!C #, 109 байт
Определенно можно улучшить, но у меня не было времени.
источник
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(всего 80 байт). Попробуйте онлайн!a+=b
вместоa=a+b
иb+=a
вместоb=a+b
.> <> ,
2119 + 3 =2422 байтаОжидается, что ввод будет в стеке при запуске программы, поэтому +3 байта для
-v
флага.Попробуйте онлайн!
Это работает путем генерации чисел Фибоначчи до тех пор, пока они не будут больше или равны входному номеру, а затем проверка последнего сгенерированного числа на равенство с входным. Выходы
1
если это было число Фибоначчи, в0
противном случае.Для того , чтобы
0
правильно обрабатывались, семя-1 1
- первое число , генерируемое будет ,0
а не1
.Спасибо @cole за указание на то, что
i
можно использовать для-1
в стек, когда STDIN пуст. Очень умно!Предыдущая версия:
источник
i
вместо01-
.i
как ,-1
когда нет входа STDIN, я бы не считал , что. Красиво сделано!Mathematica, 37 байт
-4 байта от @ngenisis
источник
Fibonacci[0]
дает0
, так что вы можете сохранить4
байты, включив0
вTable
диапазон. Вы можете сохранить еще один байт, используя инфиксную запись дляTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 байт)
Попробуйте онлайн!
Не самое удачное решение, но хотелось использовать прямой метод проверки, является ли "5 * x ^ 2 +/- 4" идеальным квадратом .
Объяснение:
Примечание:
В случае «0» он возвращает «2», потому что и 4, и -4 являются идеальными квадратами, то же самое с 1, который выдает «1 1». Считайте любой ненулевой вывод «правдивым», а 0 - «ложным».
источник
Пари / ГП , 32 байта
Попробуйте онлайн!
источник
PHP , 44 байта
Попробуйте онлайн!
PHP , 58 байт
Попробуйте онлайн!
источник
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 байтПопробуйте сами!
Альтернатива (еще 49 байтов)
Не очень оригинально: это простая и базовая итерационная версия.
Это работает для чисел до 1,836,311,903 (47 число Фибоначчи) включены. Кроме того, результат не определен (включая потенциальный бесконечный цикл).
Спасибо Кевину Круйссену и Дэвиду Конраду за помощь в игре в гольф :)
источник
n==0
наn<1
. В вопросе говорится: « Неотрицательное целое число от 0 до 1 000 000 000 ».b+=a;a=b-a;
C # (.NET Core) , 51 байт
Попробуйте онлайн!
-6 байт благодаря @Oliver!
Это решение использует довольно простую рекурсивную функцию.
n
- это число для проверки.a
иb
2 самые последние числа в последовательности.Ссылка TIO демонстрирует эту работу для 1134903170, которая превышает максимальное значение, требуемое для задачи.
источник
a<n
для 51 байтовАлхимик ,
205134 байтаБольшое спасибо только ASCII за довольно умное объединение состояний, экономя 71 байт !!
Попробуйте онлайн или подтвердите пакетно!
Ungolfed
источник
0
проверки на меньшее количество байтов за счет недетерминизмаb
-atom при инициализации исправляет его (и сохраняет 2 байта): D СпасибоЖеле , 5 байт
Попробуйте онлайн!
Возвращает 0 для не-числа Фибоначчи и 1-индексированное положение числа в последовательности Фибоначчи для чисел Фибоначчи.
Объяснение:
источник
Дьялог АПЛ, 17 байт
Попробуйте онлайн!
источник
R,
4340 байтpryr::f
создает функцию:Используется
DescTools::Fibonacci
для создания первыхx+1
чисел Фибоначчи и проверок на включение.x+1
потому что третий фибнум 2, и этого было бы недостаточно, чтобы проверить наличие 3.К счастью
Desctools::Fibonacci(0)=0
, это хорошая халява.-3 байта благодаря MickyT
источник
-1:x+1
сэкономит вам байт, но0:45
сэкономит вам три и покроет необходимый диапазонpryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 байт
Попробуйте онлайн! Это использует тот факт, что входные данные будут находиться в диапазоне от 0 до 1 000 000 000, поэтому нам нужно проверить только первые 45 чисел Фибоначчи.
f=0:scanl(+)1f
генерирует бесконечный список чисел Фибоначчи,take 45f
список первых 45 чисел Фибоначчи иelem
проверяет, есть ли входные данные в этом списке.Неограниченная версия: 36 байт
Попробуйте онлайн! Для любого
n
, взяв первыеn+3
числа Фибоначчи, мы гарантируем, чтоn
они будут в этом списке, если это число Фибоначчи.Обратите внимание, что этот подход невероятно неэффективен для больших чисел, которые не являются числами Фибоначчи, потому что все
n+3
числа Фибоначчи должны быть вычислены.источник
Javascript (ES6 без оператора **), 44 байта
Полагается на соотношение между последовательными числами Фибоначчи, приближающимися к золотому сечению. Значение c - это дробная часть входных данных, деленная на золотое сечение - если входное значение равно Фибоначчи, то оно будет очень близко к 1, а значение c-c² будет очень маленьким.
Не так коротко, как некоторые другие ответы JS, но выполняется за O (1) раз.
источник
Юлия 0,4 , 29 байт
Попробуйте онлайн!
Если это не то, как вы ответите Джулии, дайте мне знать. Я не уверен, как работает ввод на TIO.
источник
!m=
) или лямбда (считаяm->
). Что еще более важно, это терпит неудачу для 0 как есть.R,
3231 байтПринимает ввод из стандартного ввода, возвращает
TRUE
или,FALSE
в зависимости от ситуации.источник
Common Lisp,
6154 байтаПопробуйте онлайн!
Уменьшение размера относительно предыдущей версии:
была вызвана идеей, что для генерации последовательности чисел Фибоначчи необходимы только две переменные, а не три.
источник
Mathematica, 33 байта
источник
@*
(и затем отбросить финал@#&
)JS (ES6), 57 байт
Использует метод carusocomputing . Много гольф, чем мой другой ответ .
Ungolfed
источник