Я думаю, что гипотеза Коллатца уже известна. Но что, если мы изменим правила?
Начните с целого числа n> = 1.
Повторите следующие шаги:
Если n четное , умножьте его на 3 и добавьте 1.
Если n нечетно , вычтите 1 и разделите его на 2.
Стоп, когда он достигает 0
Распечатайте повторяющиеся числа.
Тестовые случаи:
1 => 1, 0
2 => 2, 7, 3, 1, 0
3 => 3, 1, 0
10 => 10, 31, 15, 7, 3...
14 => 14, 43, 21, 10, ...
Правила:
Эта последовательность не работает для большого числа чисел, потому что она входит в бесконечный цикл. Вам не нужно обрабатывать эти случаи. Достаточно только распечатать приведенные выше контрольные примеры.
Я предложил вычесть 1 и разделить на два, чтобы получить действительное целое число для продолжения, но это не требуется для вычисления таким образом. Вы можете разделить на 2 и привести к целому числу или любым другим методам, которые дадут ожидаемый результат.
Вам также необходимо распечатать начальный ввод.
Выходные данные не должны быть отформатированы как контрольные примеры. Это было просто предложение. Тем не менее, повторный порядок должен соблюдаться.
Наименьший код выигрывает.
0
в конце?Ответы:
Perl 6 , 30 байт
Попробуйте онлайн!
Блок анонимного кода, который возвращает последовательность.
Объяснение:
источник
Haskell ,
4039 байтПопробуйте онлайн!
Теперь без финального 0.
источник
Чисто , 53 байта
Попробуйте онлайн!
источник
Желе , 9 байт
Попробуйте онлайн!
источник
Python 2,
545244 байта-2 байта благодаря мистеру Xcoder
Там, безусловно, должен быть более быстрый путь. Как ни странно, когда я попробовал лямбду, это был тот же самый счет. Я, вероятно, галлюцинации.
Попробуйте онлайн!
источник
0
теперь это не является обязательным, так что короче, чтобы избавиться от второгоprint
Haskell ,
76 69 6156 байтЯ чувствую, что это слишком долго. Вот
l
создается бесконечный список последовательности обратных коллатцов, а анонимная функция в первой строке просто обрезает ее в нужном месте.Спасибо за -5 байтов @ janrjanJohansen!
Попробуйте онлайн!
источник
(>0)
должно хватить. Также естьodd
функция.Ржавчина ,
6564 байтаПопробуйте онлайн!
источник
05AB1E ,
1514 байтов-1 байт благодаря @MagicOctopusUrn .
Попробуйте онлайн.
Объяснение:
источник
[Ð=_#Èi3*>ë<2÷
с=
вместоD,
.JAEL , 18 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 31 байт
Попробуйте онлайн!
Или 30 байтов в обратном порядке.
источник
Pyth , 12 байт
Попробуйте это здесь как набор тестов!
источник
Wolfram Language (Mathematica) , 35 байт
Попробуйте онлайн!
0<Echo@# && ...&
Оценка короткого замыкания: она печатает ввод#
, проверяет, является ли он положительным, и, если да, оценивает...
. В этом случае...
есть#0[3#+1-(5#+3)/2#~Mod~2]
; так как#0
(нулевой слот) является самой функцией, это рекурсивный вызов3#+1-(5#+3)/2#~Mod~2
, который упрощает,3#+1
когда#
четное, а(#-1)/2
когда#
нечетное.источник
Common Lisp , 79 байт
Попробуйте онлайн!
источник
PowerShell,
5352 байтаПопробуйте онлайн!
Редактировать:
-1 байт благодаря @mazzy
источник
for(;$i)
вместо этогоwhile($i)
Эмоджикод 0,5 , 141 байт
Попробуйте онлайн!
источник
Stax , 11 байт
Запустите и отладьте его
источник
MathGolf , 12 байт
Попробуйте онлайн!
объяснение
источник
машинный код x86, 39 байт
Сборка (синтаксис NASM):
Попробуйте онлайн!
источник
Р ,
6661 байт-5 байтов благодаря Роберту С. в консолидации ifelse
if
и удалении скобок, и от x! = 0 до x> 0вместо того
Попробуйте онлайн!
источник
perl -Minteger -nlE, 39 байт
источник
Добавить ++ ,
383533 байтаПопробуйте онлайн!
Как это устроено
Во-первых, мы начинаем с определения функциие( х ) , который принимает один аргумент, выполняет перевернутую операцию Коллатца на Икс затем выводит результат. То есть,
В режиме функции Add ++ использует модель стековой памяти, в противном случае используются переменные. При расчетее( х ) стек изначально выглядит так S= [ x ] ,
Затем мы дублируем это значение (S= [ х , х ] , Затем мы получаем первый возможный вариант,3 х + 1 ( ⌊ х2⌋ , оставляя S= [ 3 x + 1 , ⌊ x2⌋ ] ,
d
), чтобы получить3*1+
), поменяйте местами два верхних значения, затем рассчитайтеДалее мы нажимаемИкс в S и вычислить бит Икс т.е. Икс%2 , где a%б обозначает остаток при деленииa по б , Это оставляет нас сS= [ 3 x + 1 , ⌊ x2⌋ , ( х%2 ) ] , Наконец, мы используем, ( х%2 ) , Если это0 мы возвращаем первый элемент т.е. 3 х + 1 в противном случае мы возвращаем второй элемент, ⌊ х2⌋ ,
D
чтобы выбрать элемент по индексу, указанномуЭто завершает определениее( х ) Однако мы еще не реализовали это на практике. Следующие три строки перешли из функционального режима в режим ванили, где мы оперируем переменными. Чтобы быть более точным, в этой программе мы оперируем только одной переменной, активной переменной , представленной буквой
x
. Тем не мение,x
может быть опущен в командах, где это явно другой аргумент.Например,х ≠ 0 , Цикл очень простой, состоящий из одного оператора: е( х ) , затем назначьте это
+?
идентичноx+?
и присваивает входные данныеx
, но, какx
и активная переменная , оно может быть опущено. Затем мы выводимx
, затем весь цикл while, который выполняется до тех пор, пока$f>x
. Все это работаетx
, обновляяx
на каждой итерации цикла.источник
Сетчатка 0.8.2 , 46 байт
Попробуйте онлайн! Объяснение:
Преобразовать в одинарный.
Повторяйте, пока значение не перестанет меняться.
Выведите значение в десятичном виде.
Если оно четное, умножьте на 6 и добавьте 3.
Вычтите 1 и разделите на 2.
Конечный символ новой строки можно подавить, добавив
;
перед символом{
.источник
Красный , 70 байт
Попробуйте онлайн!
источник
Ракетка , 75 байт
Попробуйте онлайн!
Эквивалент решения Common Lisp от JRowan.
источник
C # (.NET Core) , 62 байта
Попробуйте онлайн!
Ungolfed:
источник
Дротик , 49 байт
Попробуйте онлайн!
источник
Схема гамбита (гси) , 74 байта
Попробуйте онлайн!
источник