Последовательность Коллатца (также называемая проблемой 3x + 1) - это то место, где вы начинаете с любого положительного целого числа, в этом примере мы будем использовать 10 и применим к нему следующий набор шагов:
if n is even:
Divide it by 2
if n is odd:
Multiply it by 3 and add 1
repeat until n = 1
10 - четное, поэтому мы делим на 2, чтобы получить 5. 5 - нечетное, поэтому мы умножаем на 3 и добавляем 1, чтобы получить 16. 16 - четное, поэтому разрежем его пополам, чтобы получить 8. Половина из 8 - это 4, половина из 4 - это 2, а половина из 2 - 1. Поскольку нам потребовалось 6 шагов, мы говорим, что 10 имеет тормозной путь 6.
Число Super Collatz - это число, у которого тормозной путь больше, чем тормозной путь каждого числа, меньшего его. Например, 6 - это число Super Collatz, поскольку 6 имеет тормозной путь 8, 5 имеет тормозной путь 5, 4 имеет 2, 3 имеет 7, 2 имеет 1 и 1 имеет 0. ( A006877 в OEIS) Вы должны возьмите число n в качестве входных данных и выведите все числа Super Collatz до n .
правила
Полная программа или функция приемлемы.
Вы не можете предварительно вычислить или жестко закодировать последовательность Super Collatz.
Вы можете принять участие в любом разумном формате.
Вывод может быть возвращен в виде списка из функции, или распечатан в STDOUT или файл. Какой бы самый удобный.
Неправильные входные данные (не числа, десятичные числа, отрицательные числа и т. Д.) Приводят к неопределенному поведению.
Образец негольфированного питона
def collatzDist(n):
if n == 1:
return 0
if n % 2 == 0:
return 1 + collatzDist(n / 2)
return 1 + collatzDist((n * 3) + 1)
n = input()
max = -1
superCollatz = []
for i in range(1, n + 1):
dist = collatzDist(i)
if dist > max:
superCollatz.append(i)
max = dist
print superCollatz
Образец ввода-вывода:
#in #out
4 --> 1, 2, 3
50 --> 1, 2, 3, 6, 7, 9, 18, 25, 27
0 --> invalid
10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171
Также вот первые 44 номера Super Collatz:
1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799
Ответы:
Pyth, 23 байта
демонстрация
Это работает, беря максимум диапазона до каждого числа их тормозным путем Коллатца, и проверяя, является ли тот максимум рассматриваемым числом.
источник
Python 2, 104 байта
c
является вспомогательной функцией, которая вычисляет расстояние Коллатца для данного целого числа. Безымянная лямбда - это основная функция, которая вычисляет суперколлатцовые числа до (но не включая) входных данных.источник
Dyalog APL , 41 байт
Безымянная функция. Имя или скобки для применения.
Тестовые случаи:
0 приводит к неопределенному поведению.
источник
ES6,
8683 байтаИзменить: 3 байта сохранены путем переключения
filter
на понимание массива.источник
Haskell, 84 байта
Конечно, это очень медленно, но работает!
источник
Oracle SQL 11.2, 329 байт
Версия без гольфа
Представление q является истинно рекурсивным представлением (не иерархическим запросом с CONNECT BY), которое вычисляет все шаги в направлении 1 для каждого целого числа от 1 до: 1.
Вид v вычисляет тормозной путь.
В представлении m используется аналитическая версия MAX, чтобы применить ее ко всем предшествующим строкам, кроме текущей. Таким образом, для каждого целого числа мы знаем, что это расстояние остановки и текущее наибольшее расстояние остановки.
Последний запрос проверяет, превышает ли тормозной путь наибольшее тормозное расстояние. И добавляет несколько трюков для обработки 1 и особый случай: 1 со значением 0.
источник
MATL , 37 байт
Попробуйте онлайн!
источник
𝔼𝕊𝕄𝕚𝕟, 30 символов / 38 байт
Try it here (Firefox only).
Единственная причина, по которой я не опубликовал это раньше, была в том, что я не был ясно о спецификациях. Использует пользовательскую кодировку, которая кодирует 10-битные символы.
объяснение
⩥ïⓜ
создает диапазон[0,input)
для отображения.МȬ⧺$,a=[])
генерирует числа Коллатца в пустом массиве и⋎⟮aꝈ-1⟯>ɐ
использует массив чисел Коллатца, чтобы получить тормозной путь и проверить, превышает ли он предыдущий максимальный тормозной путь. Если это так,⅋(ɐ=Ⅰ,ᵖ$
делает текущее расстояние остановки максимальным расстоянием остановки и помещает текущий элемент в диапазоне в стек. После этого элементы стека печатаются неявно.источник
Желе , 17 байт
Попробуйте онлайн!
Может удивительно, это всего 3 ссылки! Они
×3‘µHḂ?µÐĿL$€
,<Ṫ$
иẠ
.источник