Вы, вероятно, знакомы с последовательностью Фибоначчи, где первые два слагаемых являются 0, 1
(или иногда 1, 1
), а каждый последующий слагаемый является суммой двух предыдущих. Это начинается так:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Иногда последовательность содержит числа, которые имеют определенный шаблон, который я нахожу интересным: разница между любой парой соседних цифр такая же, как и у любой другой пары. Например, в последовательности, начинающейся с 0, 1
18-го члена, это 987
. 9-8=1
и 8-7=1
. Я слегка доволен.
Вызов
Имея два начальных значения F(0)
и F(1)
, выведите каждое число в сгенерированной последовательности, F(n) = F(n-1) + F(n-2)
которое соответствует следующим критериям:
- Разница между любой парой соседних цифр такая же, как и у любой другой пары
- Он состоит как минимум из трех цифр (1 и 2 цифры не интересны для этого шаблона)
вход
- Два неотрицательных целых числа меньше 10 ** 10 (10 миллиардов)
Выход
- Все целые числа, которые меньше 10 ** 10 и соответствуют критериям в разделе «Вызов»
- Допускается вывод цифр больше 10 ** 10, но это не является обязательным требованием
- Учитывая, что повторяющиеся цифры соответствуют шаблону (например
777
), возможно, что существуют бесконечные числа, которые соответствуют критериям, но ваша программа не обязана выводить навсегда - Если таких целых чисел не существует, выведите все, что вы хотите, если это не число (ничего, ноль, пустой массив, сообщение об ошибке, печальное лицо и т. Д.)
- Если число, совпадающее с шаблоном, появляется в последовательности более одного раза, вы можете вывести его один или столько раз, сколько оно встречается
- Если какой-либо вход соответствует критериям, он должен быть включен в выход
правила
- Ввод и вывод может быть в любом стандартном формате
- Стандартные лазейки запрещены
- Это код-гольф, поэтому выигрывает самый короткий код в байтах
Примеры / Тестовые случаи
Input , Output
[1,10] , []
[0,1] , [987]
[2,1] , [123]
[2,3] , [987]
[61,86] , [147]
[75,90] , [420]
[34,74] , [1234]
[59,81] , [2468]
[84,85] , [7531]
[19,46] , [111]
[60,81] , [222]
[41,42] , [333]
[13,81] , [444]
[31,50] , [555]
[15,42] , [666]
[94,99] , [777]
[72,66] , [888]
[3189,826] , [888888888]
[15,3] , [159,258]
[22,51] , [321,1357]
[74,85] , [159,4444]
[27,31] , [147,11111]
[123,0] , [123,123,123,246,369]
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]
[33345,692] , [987654321]
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]
[1976,123] , [123, 2222, 4321, 6543, 45678]
[1976, 123] -> [123, 2222, 4321, 6543, 45678]
,[3189, 826] -> [888888888]
,[33345, 692] -> [987654321]
Ответы:
MATL , 14 байтов
Спасибо Emigna за указание на ошибку, теперь исправлена
Бесконечный цикл, который выводит числа по мере их нахождения.
Попробуйте онлайн! Обратите внимание, что в онлайн-переводчике результаты отображаются по истечении 1 минуты.
объяснение
Позвольте
F(n)
иF(n+1)
обозначить два общих последовательных члена последовательности Фибоначчи. Каждая итерация цикла начинается со стека, содержащегоF(n)
,F(n+1)
для некоторыхn
.источник
05AB1E ,
171615 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6),
858481 байтПопробуйте онлайн!
Тестирование соседних цифр
И x, и d инициализируются анонимной функцией, которая форсирует
NaN
все арифметические операции, в которых они участвуют. Первая итерацияsome()
всегда дает(d = [function] - n) === NaN
и(r = [function] - d) === NaN
(ложь). На второй итерации мы имеемd = x - n
(целое число) и(r = NaN - d) === NaN
(снова ложно). Начиная с третьей итерации, r устанавливается в целое число, которое не равно нулю, если разница между цифрой № 3 и цифрой № 2 не равна разнице между цифрой № 2 и цифрой № 1.Число p соответствует требуемым критериям тогда и только тогда, когда
some()
оно ложно (все смежные цифры имеют одинаковую разницу), а конечное значение r равно 0 (было не менее 3 итераций). Это дает!false / 0 === true / 0 === Infinity
(правда).В противном случае мы можем иметь:
!true / r
с r> 0 или r <0 , что даетfalse / r === 0
(ложь)!false / NaN
, который даетtrue / NaN === NaN
(ложь)Состояние остановки
Рекурсия останавливается, когда
p | q
оценивается в 0 . Это гарантированно произойдет, когда p и q достигнут значений около 10 25, которые имеют длину 84 бита. Поскольку JS имеет 52 бита мантиссы, последние 32 бита обнуляются. Итак, 32-битное побитовое ИЛИ равно 0 .Из-за быстрого роста последовательности, это происходит довольно быстро.
источник
Java 8,
151144140136130 байтБесконечный цикл, выводящий числа, когда он их находит.
Попробуйте онлайн (время ожидания через 60 секунд).
136-байтовая версия с добавленным пределом 10 10 (
a<1e10
):Попробуйте онлайн.
Объяснение:
источник
Желе ,
20 1918 байтПопробуйте онлайн!
+ƝḢ;Ɗȷ¡
производит первую тысячу (ȷ
) слагаемых в серии, которых всегда будет достаточно. Я думаю, что есть более короткий способ сделать это.+ȷ¡
приближается, но работает, только если первый член равен нулю.Я предполагаю, что мы можем взять два числа в обратном порядке, что позволяет одному байту
DIE
.Если нам не нужно выводить какие-либо из входных данных:
Желе , 15 байт
Попробуйте онлайн!
источник
DIEƊ
во время процесса игры в гольф.Октава ,
919083 байтаСэкономили 7 байт благодаря Луису Мендо!
Попробуйте онлайн!
Ну, это работает!
eval
с циклом for внутри, чтобы сохранить несколько байтов. Пропуск двоеточий и точек с запятой, чтобы сохранить несколько. Использует тот факт, что вектор считается правдивым, если все элементы ненулевые для сохраненияany
илиall
.Помимо этого, это в значительной степени прямая реализация Фибоначчи.
источник
Python 2 ,
10298 байтПопробуйте онлайн!
Спасибо за 4 байта из ов
источник
Haskell , 105 байт
Определяет оператор,
(%)
который возвращает бесконечный список со всеми решениями. Чтобы увидеть результат на stdout, нам нужно отключить буферизацию (или запустить ееghci
или сrunhaskell
), попробуйте его онлайн!Объяснение / Ungolfed
Функция
f
является просто вспомогательной функцией, которая ожидает двоичную функцию и список, она применяет функциюg
ко всем соседним парам. По сути это то же самое, что и:Оператор
(%)
- это просто понимание списка, которое выполняет некоторую фильтрацию (следя за тем, чтобы было как минимум 3 цифры и чтобы соседние цифры имели одинаковое расстояние):источник
CJam , 55 байтов
Попробуйте онлайн!
Моя первая подача CJam, не очень короткая, но очень веселая. Любые предложения приветствуются!
источник
Stax ,
2624 байтаЗапустите и отладьте его
объяснение
Не так коротко, как хотелось бы, и, вероятно, можно играть в гольф немного больше, но это работает.
источник
Рубин , 79 байтов
Попробуйте онлайн!
источник
Юлия 0,6 ,
8681 байтПопробуйте онлайн!
Довольно просто - проверьте, имеет ли вход хотя бы 3 цифры (
n>99
), затем возьмите разницу между каждой парой цифр в числе (diff(digits(n))
), убедитесь, что длина (endof
) уникального набора (∪
) этих разностей равна 1 (т.е. все различия одинаковы), и если это так, выведите номер. Сделайте это для обоих заданных чисел, затем рекурсивно вызовите функцию со следующими двумя числами.(К сожалению, похоже, что онТеперь перегружает±
имеет более высокий приоритет, чем+
, иначе, возможно, последний вызов сохранилa+b±a+2b
3 байта.)<
оператор, таким образом сохраняя как байты оператора, так и скобки приоритета. (Невозможно использовать<
в нашем коде , хотя, так что просто переставитьendof(...)<2
в2>endof(...)
).Если разрешен какой-то посторонний вывод, мы можем сохранить 2 байта, используя
@show
вместоprintln
печати,n = 987
а не просто987
. Мы могли бы даже использовать егоdump
на 1 байт меньше, ноdump
печатать информацию о типе вместе со значением, поэтому вывод будетInt64 987
вместо просто987
.источник