Вы, наверное, слышали о числах Фибоначчи. Вы знаете, что целочисленная последовательность начинается с 1, 1
, а затем каждое новое число является суммой двух последних?
1 1 2 3 5 8 13...
И так далее. Проблемы с числами Фибоначчи довольно популярны здесь . Но кто сказал, что числа Фибоначчи должны начинаться с 1, 1
? Почему они не могли начать с 0, 1
? Хорошо, давайте переопределим их, чтобы начать с 0:
0 1 1 2 3 5 8 13...
Но ... Мы не должны останавливаться на достигнутом! Если мы можем добавить последние два числа, чтобы получить следующее, мы могли бы также вычесть первое число из второго числа, чтобы добавить новый номер. Так что это может начаться с 1, 0
:
1 0 1 1 2 3 5 8 13...
Мы можем даже получить негативы:
-1 1 0 1 1 2 3 5 8 13...
И эта серия также продолжается вечно. Я думаю, что интересно, как это в конечном итоге отражает обычные числа Фибоначчи, просто с каждым другим числом, сделанным отрицательным:
13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Давайте назовем эту серию «Расширенное число Фибоначчи», или EFN . Поскольку на самом деле не существует очевидного отрицательного числа, с которого начинается этот ряд, мы скажем, что 0 отображается в 0 , регулярные числа Фибоначчи распространяются на положительные индексы, а отрицательные (полуотрицательные?) Числа Фибоначчи расширяются по отрицательным показателям, вот так:
Indices: ...-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
Values: ...13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Это приводит к сегодняшнему вызову:
Учитывая целое число N , вернуть каждый индекс, по которому N появляется в ряду EFN .
Несколько случайных наблюдений по этой задаче:
1 появляется несколько раз в EFN , чем любое другое число:
[-1, 1, 2]
. Ни один номер не появится более чем в 3 местах.Каждое число Фибоначчи> 1 будет отображаться либо один раз (3, 8, 21 и т. Д.), Либо дважды (2, 5, 13 и т. Д.)
Пояснения к правилу:
- Если
abs(N)
это не число Фибоначчи, оно никогда не появится в серии EFN , поэтому вы должны вывести ничего / пустую коллекцию, если это возможно, или, если это невозможно на вашем языке, вы можете вывести некоторое постоянное нечисловое значение. - Если N появляется в нескольких местах в EFN , ваш вывод не нужно сортировать. Хотя каждый индекс должен появляться ровно один раз.
- Хотя большинство задач последовательности позволяют вам выбрать, хотите ли вы использовать индексацию на основе 1 или 0, для этой задачи необходимо использовать описанную индексацию (где 0 отображается в 0).
- Вы можете осуществлять ввод-вывод в любом стандартном формате.
Тестовые случаи
-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]
И несколько больших тестовых случаев:
89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]
Как обычно, кратчайший ответ в байтах побеждает!
Ответы:
Haskell , 78 байт
4 байта сохранены благодаря nimi
Попробуйте онлайн!
Сначала мы настраиваем
(#)
,(#)
принимаем два параметра,a
иb
, и возвращаем список, начинающийся сa
и послеb#(a-b)
. Это создает бесконечный список, но поскольку Haskell ленив, нам не нужно беспокоиться о его зацикливании навсегда. По сути, это работает в обратном направлении, создавая последовательность Фибоначчи перед определенной парой. Например,(0#1)
будет список всех чисел Фибоначчи с отрицательным индексом.Отсюда мы делаем
f
.f
принимает аргумент,a
который является числом, которое мы пытаемся найти в последовательности. Здесь мы используемdo
нотацию для понимания списка. Начнем с того, что возьмем первыеa*a+1
элементы списка0#1
1 . Поскольку функцияa*a+1
растет быстрее, чем обратная последовательность Фибоначчи, мы можем быть уверены, что, если мы проверим в этой границе, мы найдем все результаты. Это мешает нам искать бесконечный список. Затем для каждого значенияx
и индексаi
, еслиx==a
мы нашлиa
отрицательную половину последовательности, мы возвращаемся-i
, и еслиabs x==a
мы также вернемся,i
потому что абсолютное значение отрицательной половины - это положительная половина, поэтому мы нашли ее там.Так как это делает список
[0,0]
для0
нас жёстко правильный выход для того.1: Этот трюк взят из «чистого» чистого ответа . Та же SpeedUp aplies здесь , как там, замените
a*a+1
с ,abs a+1
чтобы сэкономить много времени.источник
u
наa#b=a:b#(a-b)
плюс0#1
экономит байт: попробуйте онлайн!Чисто ,
132120109 байтПопробуйте онлайн!
g :: Int -> Int
является функцией Фибоначчи.? :: Int -> [Int]
только индексы в элементах EFN в пределахk^2+1
от0
.Для версии, которая выполняется в нормальное время, измените
k*k+1
наabs k+1
.источник
Желе , 11 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
9493 байтаПопробуйте онлайн!
источник
APL (Dyalog Classic) ,
5250 байттребует
⎕IO←0
Попробуйте онлайн!
источник
Сетчатка 0.8.2 ,
104102 байтаПопробуйте онлайн! Объяснение:
Преобразовать в унарный, если вход не равен нулю.
Вычислите индекс Фибоначчи по абсолютному значению, но если число не является числом Фибоначчи, то удалите его, если оно не равно нулю. Для этого используется регулярное выражение Фибоначчи @ MartinEnder.
Удалите отрицательные числа, абсолютные значения которых являются нечетными числами Фибоначчи.
Добавьте отрицательные индексы для нечетных положительных чисел Фибоначчи.
Преобразовать в десятичную.
Добавьте дополнительные индексы для
1
.источник
На самом деле , 34 байта
Грубая сила спасает день
Объяснение:
Попробуйте онлайн!
источник
Python 3 , 92 байта
Попробуйте онлайн!
Возвращает набор индексов.
источник
Python 2 ,
8785 байтПопробуйте онлайн!
источник
05AB1E , 36 байт
Должен быть лучший подход ..>.> Есть шесть (или семь, если мы включим
0
) различных сценариев для этой задачи, и это убивает меня ..Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Несколько пошаговых примеров:
источник
Python 2 ,
959294 байтаПопробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 144 байта
Попробуйте онлайн!
источник