Задний план
Большинство из вас знает, что такое число Фибоначчи . Некоторые из вас могут знать, что все положительные целые числа могут быть представлены в виде суммы одного или нескольких различных чисел Фибоначчи, согласно теореме Цекендорфа . Если число членов в оптимальном представлении Цекендорфа целого числа n
само является числом Фибоначчи, мы будем называть n
«тайно» Фибоначчи.
Например:
139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci
140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci
Заметки
- Оптимальное представление Цекендорфа можно найти с помощью жадного алгоритма. Просто возьмите наибольшее число Фибоначчи <= n и вычтите его из n, пока не достигнете 0
- Все числа Фибоначчи могут быть представлены как сумма 1 числа Фибоначчи (самого себя). Поскольку 1 - это число Фибоначчи, все числа Фибоначчи также являются тайными числами Фибоначчи.
Вызов
Ваша задача - написать программу или функцию, которая принимает целое число и возвращает тайное число Фибоначчи.
вход
Вы можете принять участие в любом разумном формате. Вы можете предположить, что ввод будет одним положительным целым числом.
Выход
Выведите один из двух разных результатов для того, является ли ввод тайно Фибоначчи. Примеры включают в себя True
/ False
, 1
/ 0
и т. Д.
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах! Стандартные лазейки запрещены.
Тестовые случаи
Truthy (secretly Fibonacci)
1
2
4
50
140
300099
Falsey (NOT secretly Fibonacci)
33
53
54
139
118808
источник
Ответы:
JavaScript (Node.js) , 54 байта
Попробуйте онлайн!
источник
Python 2 , 77 байт
Попробуйте онлайн!
Это использует теорему о том, что два описания OEIS A003714 эквивалентны:
z
Тогда остается проверить , если
z[n]
это число Фибоначчи, то естьz[z[n]] == 1
.источник
bin(x)
. Вы также можете удалить один, изменивrange(n*n+1)
наrange(n<<n)
. (Предполагая, что 0 является недействительным)bin(x)
, ха-ха. И, хм,1<<n
это уже путь, более чем достаточно, но я бы хотел, чтобы время выполнения было неастрономическимЖеле , 15 байт
Монадическая ссылка, принимающая неотрицательное целое число, которое возвращает
1
«Тайно по Фибоначчи» и в0
противном случае.Попробуйте онлайн! (слишком неэффективно для больших тестовых случаев)
Как?
источник
R , 83 байта
Попробуйте онлайн!
источник
C # (.NET Core) ,
12411598 байтПопробуйте онлайн!
-3 байта: изменено в цикле цикла на (благодаря Оливье Грегуару )
-6 байтов: переключено на использование переменных, инициализированных b и c вне циклов (благодаря Кевину Круйссену )
-17 байтов: изменено условие во втором цикле для перемещения, если вне цикла и объединить с возвращаемыми, повторно использованными переменными b и c в последнем цикле (спасибо разнагул )
Ungolfed:
источник
for(;c<=a;b=c-b)c+=b;
сэкономит вам 3 байта.{}
скобки из ваших циклов и поместил все вfor
-loops. Кроме того, я добавил переменную,r
которую мы установили1
в вашемif(e==n)
и возвращаем в конце, так что у вас есть только однаreturn
.e<n
вы можете переместить символif
to после цикла и последовательно объединить его с байтамиreturn
for 101 .b
иc
в последнем цикле и удаляяd
иe
.Perl 6 , 58 байт
Попробуйте онлайн!
1, &[+] ... * > $_
это просто последовательность Фибоначчи, остановленная в удобном бесконечном месте (входное число).$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0
представляет собой последовательность чисел, начиная с входного номера, и каждый последующий элемент получается путем вычитания наибольшего числа Фибоначчи, меньшего или равного предыдущему элементу из предыдущего элемента. Последовательность заканчивается, когда0
достигается. Например, если$_
есть140
, то эта последовательность есть140, 51, 17, 4, 1, 0
.Вычитание одного из этой последовательности рассматривает его как число, его длину, а разность - это число чисел Фибоначчи, которые, сложенные вместе, дают входное число. Затем этот номер проверяется на членство в первой последовательности Фибоначчи.
источник
&[+]
ранее! Приятно сэкономить на том, что нет необходимости определять два начальных условияPerl 6 , 48 байт
Попробуйте онлайн!
Преобразует входные данные в список представления Zeckendorf несколько раз, пока он не достигнет одного числа, а затем проверяет, была ли длина последовательности меньше 4.
Функция Ценкендорфа в середине в основном основана на ответе Шона с парой улучшений.
Объяснение:
Например, последовательность для
2
is2 1
с2
уже является числом Фибоначчи. Последовательность для140
is140 5 1
, и так как 5 является числом Фибоначчи, это возвращает true. Последовательность для33
is33 4 2 1
, и поскольку4
она не является числом Фибоначчи, последовательность имеет длину 4.источник
05AB1E , 14 байтов
Попробуйте онлайн . Нет набора тестов для всех тестовых случаев, потому что
counter_variable
невозможно сбросить до 0 .. Я проверил все вручную, и они верны.Объяснение:
ПРИМЕЧАНИЕ. Это
counter_variable
будет5
для ввода139
и6
для ввода140
, потому что для того, чтобыΔ
-loop проверить стек остался прежним, он, конечно, делает дополнительную итерацию.источник
Haskell , 64 байта
Попробуйте онлайн!
источник
Сетчатка 0.8.2 , 61 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в одинарный.
Подсчитайте количество необходимых чисел Фибоначчи.
Первое чередование касается чисел Фибоначчи, которые не меньше 2. На первом проходе
\2
еще не существует, но, к счастью, это необязательно, поэтому нам не нужно сопоставлять его.\1
тоже не существует, но, к счастью, у нас есть альтернатива,\G.
которая соответствует одному символу в начале матча. Оба\2
и\1
поэтому принимают значение 1.На последующих проходах,
\2
существует, поэтому мы пытаемся сопоставить его. На этот раз, если произойдет\1
сбой, произойдет сбой (так как он больше, чем\2
), но, если это удастся,(?>)
предотвращает возврат, поэтому, если\2
совпадения\1
не совпадают , мы не пытаемся просто\1
. (\G1
всегда терпит неудачу, так как мы продвинулись после начала патча.) Наконец,\2
принимает предыдущее значение,\1
а while\1
принимает сумму двух значений.Поэтому мы сопоставляем столько чисел Фибоначчи, сколько можем, добавляя их по ходу. Так как частичные суммы последовательности
1, 2, 3, 5...
,0, 1, 3, 6, 11...
т.е. на 2 меньше, чем числа Фибоначчи, мы заканчиваем сопоставлением 2 в конце.Это, очевидно, не соответствует самому 1, так что чередование обрабатывает этот случай.
Преобразовать в одинарный.
Проверьте, является ли это число Фибоначчи. В нем используется та же идея, что и в первом тесте, но он использует
^
вместо,\G
и мы также должны точно соответствовать, поэтому он использует необязательный захват вместо чередования, так как это лучше для гольфа (но это увеличивает числа захватов на 1).Сетчатка , 35 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в одинарный.
Подсчитайте количество необходимых чисел Фибоначчи. (Зацикливание как преобразования, так и счета экономит целый байт, прежде всего, получая счет в унарном порядке.)
Выполните предыдущие шаги в общей сложности дважды. Это берет количество чисел Фибоначчи, необходимое для суммирования к числу чисел Фибоначчи.
Если число было тайно Фибоначчи, то результат равен 1.
источник
Python 2 ,
146137 байтПопробуйте онлайн!
f () - рекурсивная функция, которая возвращает значение n-го числа Фибоначчи. Взято из этого ответа .
g () - рекурсивная функция, которая возвращает представление Цекендорфа данного числа в виде списка целых чисел.
Поскольку все числа Фибоначчи будут иметь возвращаемую длину одного элемента из g (), h () проверяет, является ли длина g () из g (n) == 1.
РЕДАКТИРОВАТЬ: Сохранено 9 байтов благодаря Nedla2004 . Я постоянно забываю, что лямбды не всегда являются лучшим решением ...
источник
g
функцию, чтобы я мог определитьf(n-1)
переменную. Пара другие изменения от==
до ,<
где они одинаковы.