Гипотеза Коллатца постулирует, что если вы возьмете любое натуральное число, то повторите этот алгоритм достаточно много раз:
if number is odd, then multiply by three and add one
if number is even, then divide by two
в конечном итоге вы получите 1. Это, кажется, всегда работает, но никогда не было доказано, что это всегда работает.
Вы уже играли в гольф, рассчитывая, сколько времени потребуется, чтобы добраться до 1 , поэтому я решил немного изменить ситуацию.
Начиная с заданного положительного целого числа, рассчитайте, сколько времени потребуется, чтобы добраться до 1 (его «время остановки»). Затем найдите время остановки этого номера.
Повторяйте, пока не дойдете до 1, или пока не дойдете до совершенно произвольного предела в 100 итераций. В первом случае выведите, сколько итераций потребовалось. В последнем случае выведите «Fail» или другой согласованный вывод по вашему выбору, если он не является целым числом 1≤n≤100
. Вы не можете вывести пустую строку для этой опции. Вывод целого числа вне диапазона [1, 100], однако, разрешен.
Примеры:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Как я рассчитал 10^100
и 12345678901234567890
использовал язык, который поддерживает только реалы для этого размера, если ваш язык более точный, вы можете получить разные результаты для них.
счет
Поскольку это код-гольф , выигрывает ответ с кратчайшим количеством байтов.
источник
Ответы:
Желе , 24 байта
Попробуйте онлайн!
источник
³
вместоȷ2
это разрешено ).Python 2 , 70 байт
Возвращает 199 для ста или более итераций.
Попробуйте онлайн!
источник
Атташе , 40 байт
Попробуйте онлайн!
Это новый язык, который я сделал. Я хотел найти подходящий инфиксный язык, и вот результат: подделка Mathematica. Ура?
объяснение
Это композиция из нескольких функций. Эти функции:
PeriodicSteps[CollatzSize@Max&1]
Это приводит к функции, которая применяет свой аргумент до тех пор, пока результаты не будут содержать повторяющийся элемент. Эта функцияCollatzSize@Max&1
применяетсяCollatzSize
к большей части ввода и1
, чтобы избежать неправильного ввода0
в CollatSize.`#
является оператором в кавычках; когда применяется монадически в этом смысле, он получает размер своего аргумента`-&3
является связанной функцией, которая связывает аргумент3
с функцией`-
, которая читается как «минус 3». Это потому, что приложение PeriodicSteps выдает0
s, которые необходимо учитывать. (Он также аккуратно обрабатывает такие номера, как5
, которые сопоставляются-1
.)источник
J ,
4945 байт-4 байта благодаря более короткому коду последовательности Коллатца, взятому из комментария @ randomra здесь .
Выходы
101
для неверных результатов.Попробуйте онлайн!
объяснение
Неудивительно, что это объяснение быстро устарело. Я собираюсь оставить его в терминах старого 49-байтового ответа, который у меня был, который я включил ниже. Если вы хотите обновить, просто дайте мне знать. Способ, которым он находит длину рекурсивной последовательности, остается тем же самым, я только что использовал более короткий метод последовательности Коллатца.
Нахождение длины последовательности Коллатца
Этот раздел кода является следующим
Вот объяснение:
К сожалению, команда apply verb (
^:
), когда сказано хранить результаты, также сохраняет начальное значение, так что это означает, что мы (как всегда) отключены на единицу. Следовательно, почему мы вычитаем 1.Нахождение длины рекурсивной последовательности
источник
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
должны быть эквивалентныC (gcc) , 75 байтов
Возвращает
-1
дляn>=100
итераций.Попробуйте онлайн!
C (gcc) , 73 байта
Возвращает
0
дляn>=100
итераций.Попробуйте онлайн!
источник
JavaScript (ES6), 57 байт
Возвращает
true
при неудаче. Возвращает0
за1
.Контрольные примеры
Показать фрагмент кода
источник
APL (Dyalog Unicode) ,
3960535249 байтов-3 байта благодаря @ngn
Попробуйте онлайн!
Использует код @ngn для Collatz, но ранее использовал код @ Uriel.
Вот старая версия, которая не соответствует спецификации:
источник
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 байт
Попробуйте онлайн!
Возвращает
101
для бесконечной последовательности.источник
Шелуха , 21 байт
Попробуйте онлайн! Возвращает
-1
при неудаче,0
при вводе1
.объяснение
источник
C (gcc) ,
7073 байтаПопробуйте онлайн!
Возвращает,
101
когда количество итераций превышает 100.источник
m=0
вf
(возможно, даже используя в настоящее время пустойfor
Intiailiser, чтобы сохранить один a;
).Чисто ,
146... 86 байт-11 байт благодаря Орджану Йохансену
Как частичная функция литерал.
Попробуйте онлайн!
Прерывает с
hd of []
если число итераций превышает 100.Выход с с
Heap Full
для входов выше ~,2^23
если вы не укажете больший размер кучи.источник
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
часть, это карри. (Или эта сокращается.)Python 2 ,
999897 байтc and t or f
вместоt if c else f
.-1
вместоf
или'f'
для не останавливающих вводов.Попробуйте онлайн!
источник
BiwaScheme , 151 символ
Вы можете попробовать это здесь .
источник
R ,
119107 байтЧастично использует Коллатец код Jarko Dubbeldam от сюда . Возвращает
0
для> 100 итераций (сбой).Попробуйте онлайн!
источник
APL NARS, 115 байтов, 63 символа
Вероятно, с использованием циклов было бы более понятно ... Есть 4 функции, 2 вложенные и риксивные, и первая только для определения и инициализации = 0, переменная d, видимая из 2-й функции как счетчик глобальной переменной.
Эта 3-я функция будет функцией, возвращающей количество вызовов для разрешения гипотезы Коллатца для ее аргумента.
Это 2-я функция, если ее arg = 1, остановить ее рекурсию и вернуть d число раз, когда она называется самой-1; иначе, если сам вызывается более 99 раз, остановите свою рекурсию и верните -1 (сбой), иначе вычислите гипотезу Коллатца для ее аргумента и вызовите себя для значения длины последовательности Коллатца. Для меня, даже если все это кажется выполненным, запуск может быть большой проблемой, если определена глобальная переменная и одна переменная в функции с тем же именем, когда программист видит ее как локальную переменную.
источник
(Emacs, Common, ...) Lisp, 105 байт
Возвращает t для итераций> 100
Expanded:
источник