Это гипотеза Коллатца (OEIS A006577 ):
- Начните с целого числа n > 1.
- Повторите следующие шаги:
- Если n четное, разделите его на 2.
- Если n нечетно, умножьте его на 3 и добавьте 1.
Доказано , что для всех натуральных чисел до 5 * 2 60 , или около 5764000000000000000 , п , в конечном счете станет 1 .
Ваша задача - выяснить, сколько итераций требуется (вдвое или трижды плюс один), чтобы достичь 1 .
Правила:
- Самый короткий код выигрывает.
- Если число <2 введено, или нецелое, или не число, вывод не имеет значения.
Контрольные примеры
2 -> 1
16 -> 4
5 -> 5
7 -> 16
1+
в специальном корпусе как)
.C -
5047 символовК сожалению, малоимущий C требует огромного количества кода для базового ввода-вывода, поэтому сокращение всего этого сделало интерфейс немного неинтуитивным.
Скомпилируйте это, например
gcc -o 1 collatz.c
. Ввод одинарный с разделенными пробелами цифрами, и вы найдете ответ в коде выхода. Пример с номером 17:источник
return~-a?
Сохраняет 1. Также перемещениеb++
к?
делу следует сохранитьb--
.Perl 34 (+1) символа
Злоупотребление
$\
для окончательного вывода, как обычно. Запустить с параметром-p
командной строки, ввод берется изstdin
.Сохранен один байт благодаря Элиасу Ван Оотегему . В частности, наблюдение, что следующие два эквивалентны:
Хотя он на один байт длиннее, он сокращает два байта, сокращая
$_/2
до всего.5
.Пример использования:
PHP 54 байта
Архнемезис Javascript для премии «Деревянная ложка», похоже, несколько не оправдал эту задачу. Однако с этой проблемой не так много места для творчества. Ввод принимается в качестве аргумента командной строки.
Пример использования:
источник
$_
в троичной кажется расточительным, вы можете сбрить другого персонажа, используя*=
так:$\++,$_*=$_&1?3+1/$_:.5while$_>1}{
. Умножение на1/$_
имеет тот же эффект, что+1
и так,$_*=3+1/$_
отлично работает$_*=3+1/$_
великолепен, спасибо!Mathematica (35)
Использование:
источник
Как обычно, я начну ответы со своих.
JavaScript,
4644 символов (работает на консоли)источник
Java,
165, 156, 154,134,131,129,128, 126 (многословные языки тоже нуждаются в любви)Все сделано внутри для
Это чертовски красивый мужчина. Спасибо Патеру Тейлору !!!, и идея использовать цикл for была украдена у угорена
Я заменил Integer на Short.
источник
i(,++y)
. Вы можете сохранить еще два, используя<
вместо==
.class a{public static void main(String[]a){for(int x=new Short(a[0]),y=0;x>1;System.out.println(++y))x=x%2<1?x/2:x*3+1;}}
Внесены изменения: 1) ЗаменилShort.valueOf(...)
сnew Short(...)
для -4 байт и 2) Я положилx=x%2<1?x/2:x*3+1;
в телеfor
-loop , чтобы избавиться от запятая для -1 байта .Ребму : 28
По этой краткой и математической проблеме GolfScript, вероятно, выиграет на несколько процентов против Rebmu (если не требуется говорить, читать файлы из Интернета или генерировать файлы JPG). Тем не менее, я думаю, что большинство согласится с тем, что логика Golfscript не так проста для понимания, и общий исполняемый стек, на котором она работает, больше.
Хотя сам создатель Rebol Карл Сассенрат сказал мне, что он нашел Rebmu «нечитабельным», он занят, и у него нет времени, чтобы по-настоящему практиковать преобразование в стиле свиньи-латиноамериканца посредством unmushing . Это действительно просто преобразовано в:
Обратите внимание, что место было необходимо, чтобы получить a: вместо a . Это "набор слов!" и оценщик замечает этот тип символа для запуска назначения.
Если бы он был написан без сокращений (но неуклюже написано Rebol), вы получите
Rebol, как и Ruby, оценивает блоки до их последнего значения. Цикл UNTIL является любопытной формой цикла, который не требует условий цикла, он просто прекращает цикл, когда его блок оценивает что-либо, отличное от FALSE или NONE. Таким образом, в тот момент,
1 ==
когда результат присваивания A (аргумента rebmu) результату условия Коллатца (либо IF-ELSE, который оценивает выбранную ветвь) ... цикл прерывается.J и K инициализируются целым значением ноль в Rebmu. И, как уже упоминалось, все это оценивается до последнего значения. Так что ссылка J в конце программы означает, что вы получите количество итераций.
Использование:
источник
Python Repl, 48
Я не уверен, что нет более короткого выражения, чем
n=3*n+1;n/=1+n%2*5;
. Я, наверное, нашел дюжину разных выражений одинаковой длины ...редактировать: я нашел другое решение, которое никогда не будет оспаривать, но слишком весело, чтобы не поделиться.
источник
(n//2,n*3+1)[n%2]
корочеn/2
работать так хорошо, как мы знаем, это даже?APL (31)
источник
{1=⍵:0⋄2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}
{1=⍵:0⋄1+∇⊃⍵⌽0 1+.5 3×⍵}
J, 30 знаков
Получилось немного дольше, чем хотелось
использование:
-:`(1+3&*)`]
это герунд, состоящий из трех глаголов, употребляется три раза.-:
означает «делить пополам»(1+3&*)
или(1+3*])
кодирует этап умножения и]
(идентичность) помогает завершению.2&|+1&=
образует указатель на герунду. буквально, «остаток после деления на два плюс, равняется ли он одному».#verb^:a:
выполняет итерации функции до тех пор, пока результат не станет стабильным (здесь принудительно явно), пока собирает шаги, а затем считает их. Украдена у @JB .<:
уменьшает число шагов на единицу, чтобы соответствовать требованиям вопроса.источник
<:
,#-:
,:`(
,&*)
,=)
,)^:
.<:
означает «уменьшение» или «меньше или равно»,#
означает «количество» или «n раз»,-:
означает «вдвое» или «равенство эпсилон»,:`(
означает, в свою очередь, конец указанного «пополам», связь между два глагола в герунде и левой круглой скобке (используется для группировки).&*)
означает «что связано с умножением» (3 связано с умножением создает оператор «умножить на три») и конец группировки.=
выполняет проверку на равенство или, в унарном смысле, самостоятельную классификацию.^:
является степенным соединением (итерация глагола). Поскольку многие глаголы J заканчиваются двоеточием, ... :-)<:#a:2&(<*|+|6&*%~)
19 байт (-11)Схема гамбита,
10698 символов, 40 скобок(let((f(lambda(x)(cond((= x 1) 0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))))(f(read)))
9189 символов с определением напрямую(define(f x)(cond((= x 1)0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))(f(read))
источник
PowerShell:
7774717061Гольф-код:
Примечания:
Первоначально я пытался ввести пользовательский ввод, не приводя его к целому числу, но это оказалось интересным. Любые нечетные входные данные будут обрабатываться неточно, но даже входные данные будут работать нормально. Мне потребовалась минута, чтобы понять, что происходит.
При выполнении умножения или сложения PowerShell сначала обрабатывает нетипизированный ввод как строку. Таким образом,
'5'*3+1
вместо 16 вводится значение «5551». Четные входные данные вели себя хорошо, поскольку в PowerShell нет действия по умолчанию для разделения на строки. Даже четные входные данные, которые проходили бы через нечетные числа, работали нормально, потому что к тому времени, когда PowerShell достигал нечетного числа в цикле, переменная уже в любом случае была переведена в целое число математическими операциями.Совет PowerShell игрока в гольф: Для некоторых сценариев, как этот,
switch
бьетif/else
. Здесь разница составила 2 символа.Нет проверки ошибок для нецелых значений или целых чисел меньше двух.
Если вы хотите проверить сценарий, поместите его
;$i
перед последней закрывающей скобкой в сценарии.Я не уверен, насколько точно PowerShell обрабатывает числа, которые переходят в очень большие значения, но я ожидаю, что в какой-то момент точность будет потеряна. К сожалению, я также ожидаю, что с этим ничего не поделаешь без серьезного раздувания сценария.
Код без правил, с комментариями:
Тестовые случаи:
Ниже приведены некоторые примеры с включенным аудитом. Я также отредактировал вывод некоторых для ясности, добавив метки к входному и конечному счету и вставив интервал, чтобы отделить значения Коллатца.
Интересные биты о входных числах, которые не из тестовых случаев вопроса:
14
и197
являются Кит Numbers31
является Мерсенна6174
является постоянной Kaprekar в8008135
. И Numberphile , очевидно.источник
switch
на$i=(($i/2),($i*3+1))[$i%2]
read-host
в число - просто измените$i*3
на3*$i
.$i*3
- почему я не подумал об этом уже?param($i)for(;$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x
- поменяйте хост чтения на параметр, чтобы получить 56 байт . Попробуй онлайн СсылкаСборка 80386, 16 байт
В этом примере используется синтаксис AT & T и соглашение о вызовах fastcall, аргумент входит в
ecx
:Вот результирующие 16 байтов машинного кода:
источник
Брахилог , 16 байт
Попробуйте онлайн!
объяснение
Альтернативное решение с тем же количеством байтов:
Попробуйте онлайн!
источник
GolfScript (23 символа)
Онлайн тест
источник
F # - 65 символов
источник
Python
68585452 символовf=lambda n:1+(n-2and f((n/2,3*n+1)[n%2]));f(input())
Спасибо Бакуриу и Бутби за советы :)
источник
n%2and 3*n+1or n/2
чтобы сохранить 5 символов. Также в python2 вы можете удалить вызовint
, уменьшив размер до 58 байт.[n/2,3*n+1][n%2]
.unsupported operand type(s) for -: 'str' and 'int'
Сетчатка , 43 байта
Принимает ввод и печатает вывод в одинарном формате.
Каждая строка должна идти в свой собственный файл. 1 байт на дополнительный файл добавляется в счетчик байтов.
Вы можете запустить код как один файл с
-s
флагом. Например:Алгоритм представляет собой цикл выполнения шага Коллатца с унарным числом и добавления нового маркера шага
x
в конце строки, если число не равно 1.Когда цикл заканчивается на
1
, мы конвертируем маркеры в унарное число (удаляя ведущий1
), который является желаемым выходом.источник
Желе неконкурентоспособное
12 байт. Этот ответ не является конкурирующим, поскольку задача предшествует созданию желе.
Попробуйте онлайн!
Как это устроено
источник
DC, 27 символов
Применяя черную магию Бутби :
Я не совсем уверен, понимаю ли я, как - или это - это работает.
Использование:DC, 36 символов
Мое собственное творение; несколько более традиционный подход, даже несмотря на то, что мне пришлось немного поспорить с языком, чтобы преодолеть недостаток
else
части вif
утверждениях:Внутренне он производит все числа последовательности и сохраняет их в стеке, затем
1
выводит финал и отображает высоту стека.источник
2<x
и избавиться отk
. На всякий случай, если вы хотите вернуть байт через четыре года. : Dбред ,
5956 байтПопробуйте онлайн! (Немного изменен для простоты использования)
Ввод и вывод в виде кодов символов. Это более полезно для ячеек произвольного размера, но все же может работать с небольшими значениями в ограниченных ячейках.
Как это устроено
источник
Гексагония ,
4844 байтаПопробуйте онлайн!
Expanded:
Обратите внимание , что это не будет работать на1
по гм ... причинам . Честно говоря, я не совсем уверен, как это работает больше. Все, что я знаю, это то, что код для нечетных чисел запускается в обратном направлении для четных чисел? Каким - то образом?Новая версия намного чище, чем предыдущая, но в сравнении имеет несколько направлений, а также заканчивается ошибкой деления на ноль. Единственный случай, когда он не ошибается, это когда он действительно обрабатывает
1
правильно.источник
If a number < 2 is input ... output does not matter.
: o)C
7069 символовВсе очень просто, никаких хитростей.
Читает ввод из стандартного ввода.
источник
Вопрос, 46
источник
(#)1_(1<){(1+3*x;x%2)0=x mod 2}\
Ruby 1.9, 49 символов
Ответ Rubyfied Valentin CLEMENT на Python , использующий синтаксис stabby lambda. Сложил это в одно утверждение для дополнительной нечитаемости.
Некоторые издержки, потому что Ruby, в отличие от Python, не рад смешивать числа с логическими значениями.
источник
С ++ (
5148)Это рекурсивная функция, которая делает это; входное чтение приходит отдельно.
Я уверен, что смогу сделать что-то вроде «и / или»
== 0
, но я понятия не имею, как.источник
==0
и поменять местами условнуюn==1
потому что я указал в вопросе, что число всегда больше, чем 1n==1
это базовый случай рекурсии. Размещениеn==2
там не улучшило бы счет любой.return~-n?
и поменять местами условныеn==1
==n<2
.~ - ~! (Без комментариев) -
7153Этот язык явно не лучший для игры в гольф, так как ему не хватает большого количества встроенных функций, но в этом его прелесть.
Во-первых, установите
'''
для вашего ввода. Затем функция''
может быть вызвана с помощью%
ее ввода и вернет ответ, например:'''=~~~~~:''&%:
Это вернется
~~~~~
. Это на самом деле работает дляn==1
(это циклы навсегдаn==0
).Как всегда с этим языком, не проверено.
источник
JavaScript (ES6) - 29 символов
Создает функцию,
f
которая принимает один аргумент и возвращает количество итераций.JavaScript - 31 символов
Предполагается, что входные данные находятся в переменной,
n
и создает переменную,c
которая содержит количество итераций (а также выводитc
на консоль в качестве своей последней команды).источник
Perl 6, 40 байт
Метод рекурсивной функции, согласно Valentin CLEMENT и daniero : 40 символов
Метод отложенного списка: 32 символа
источник
> <>,
27 2623 байтаКак и другие ответы> <>, это создает последовательность в стеке. Как только последовательность достигает 2, размер стека - это количество предпринятых шагов.
Благодаря @Hohmannfan удалось сэкономить 3 байта очень умным способом вычисления следующего значения напрямую. Формула, используемая для вычисления следующего значения в последовательности:
Фракция отображает четные числа в 0,5, а нечетные числа в 3. Умножение на
n
и сложениеn%2
завершает вычисление - нет необходимости выбирать следующее значение!Редактировать 2: Вот версия до @ Hohmannfan:
Хитрость в том, что оба
3n+1
иn/2
вычисляются на каждом шаге в последовательности, и тот, который должен быть удален из последовательности, выбирается впоследствии. Это означает, что коду не нужно переходить, пока не будет достигнута 1, и вычисление последовательности может выполняться в одной строке кода.Редактирование: исключение другого символа после того, как он понял, что единственное положительное целое число, которое может привести к 1, равно 2. Поскольку выходные данные программы не имеют значения для ввода <2, генерация последовательности может закончиться при достижении 2, оставляя размер стека точное количество необходимых шагов.
Предыдущая версия:
источник
\::2%:@5*1+2,*+:2=?