Вдохновленный этим вопросом закончил в математике .
Проблема
Позвольте
n
быть натуральным числом≥ 2
. Возьмите самый большой делительn
- который отличается отn
самого себя - и вычтите егоn
. Повторяйте, пока не получите1
.
Вопрос
Сколько шагов нужно, чтобы достичь 1
определенного числа n ≥ 2
.
Подробный пример
Пусть
n = 30
.
Величайший делитель:
1. 30 is 15 --> 30 - 15 = 15
2. 15 is 5 --> 15 - 5 = 10
3. 10 is 5 --> 10 - 5 = 5
4. 5 is 1 --> 5 - 1 = 4
5. 4 is 2 --> 4 - 2 = 2
6. 2 is 1 --> 2 - 1 = 1
Требуется 6 шагов, чтобы добраться 1
.
вход
- Ввод является целым числом
n
, гдеn ≥ 2
. - Ваша программа должна поддерживать ввод до максимального целочисленного значения языка.
Выход
- Просто выведите количество шагов, например
6
. - Лидирующие / завершающие пробелы или переводы строк в порядке.
Примеры
f(5) --> 3
f(30) --> 6
f(31) --> 7
f(32) --> 5
f(100) --> 8
f(200) --> 9
f(2016^155) --> 2015
Требования
- Вы можете получить входные данные из
STDIN
аргументов командной строки как параметры функции или из ближайшего аналога. - Вы можете написать программу или функцию. Если это анонимная функция, пожалуйста, включите пример того, как ее вызвать.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
- Стандартные лазейки запрещены.
Эту серию можно также найти на OEIS: A064097
Квазилогарифм, индуктивно определяемый как
a(1) = 0
иa(p) = 1 + a(p-1)
еслиp
простое иa(n*m) = a(n) + a(m)
еслиm,n > 1
.
code-golf
math
arithmetic
insertusernamehere
источник
источник
2^32 - 1
. Остальное зависит от вас и вашей системы. Надеюсь, это то, что вы имели в виду под своим вопросом.Ответы:
Желе , 9 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Фон
Определение последовательности A064097 подразумевает, что
По формуле Эйлера
где φ обозначает функцию Эйлера, а p изменяется только по простым числам.
Объединяя оба, мы выводим свойство
где ω обозначает число различных простых множителей n .
Применяя полученную формулу k + 1 раз, где k достаточно велико, так что φ k + 1 (n) = 1 , получаем
Из этого свойства получаем формулу
где выполняется последнее равенство, потому что ω (1) = 0 .
Как это устроено
источник
05AB1E ,
1311 байтКод:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
[¼Ñü-¤ÄD#]¾
- Я был близок к тому, чтобы сбрить байт попарно, ну ладно ...[Ð#Ò¦P-¼]¾
.Ð
лучше чемDD
.Pyth, 11 байт
Тестирование
Простая петля повторения до истины.
Объяснение:
источник
f
Илтером.f
?f
без второго аргумента перебирает все положительные целые числа, начиная с,1
и возвращает первое значение, которое дает true для внутреннего оператора. Это значение оказывается неиспользованным в этой программе, поэтому оно возвращает количество раз, которое оно запустило. Не документировано, просто неортодоксально :) Если это поможет, вы можете думать об этом как оfor
цикле вроде:for(int i=1; some_condition_unrelated_to_i; i++) { change_stuff_that_affects_condition_but_not_i;}
f <l:T> <none>
),f
это Первый вход, гдеA(_)
истина окончена[1, 2, 3, 4...]
.Python 2,
5049 байтовЭтот последний тест не закончится в ближайшее время ...
В качестве альтернативы вот 48 байтов, которые возвращаются
True
вместо1
forn=2
:источник
Желе , 10 байт
Попробуйте онлайн! или проверьте большинство тестовых случаев . Последние контрольные примеры быстро заканчиваются локально.
Как это устроено
источник
Сетчатка , 12
Это предполагает ввод данных в унарном формате и вывод данных в десятичном формате. Если это неприемлемо, мы можем сделать это еще на 6 байтов:
Сетчатка , 18
Попробуйте онлайн - добавлена 1-я строка для запуска всех тестов за один раз.
К сожалению, это использует унарный для расчетов, поэтому ввод 2016 года 155 не практично.
1
sисточник
\b
.Pyth -
151413 байтСпециальный корпус
1
действительно убивает меня.Попробуйте это онлайн здесь .
источник
1
?1
is[]
, которая вызывает ошибку, когда я беру первый элемент. Мне нужно в особом случае, чтобы он1
снова вернулся, чтобы.u
фиксированная точка закончилась. Я нашел лучший способ, чем.x
попытаться, за исключением того, что спасло мне эти 2 байта..u
фиксированная точка в конечном итоге достигнет1
всех входных данных, после чего она должна быть в специальном регистре.JavaScript (ES6),
* 4438Редактировать 6 байтов сохранено благодаря @ l4m2
(* 4 пораженных - все еще 4)
Рекурсивная функция
Меньше гольфа
Контрольная работа
источник
f=(n,d=n)=>n>1?n%--d?f(n,d):f(n-d)+1:0
?Mathematica, 36 байт
Безымянная функция занимает те же байты:
Это очень простая реализация определения как рекурсивной функции.
источник
Октава,
595855 байтОбразцы прогонов:
источник
end
необходимо в октаве?Haskell, 59 байт
Использование:
Это может быть немного неэффективно для больших чисел из-за генерации списка.
источник
<1
вместо того, чтобы==0
сохранить несколько байтов:f 1=0;f n=1+f(n-last[a|a<-[1..n
div2],mod n a<1])
Юлия,
56504539 байтЭто рекурсивная функция, которая принимает целое число и возвращает целое число.
Ungolfed:
Попробуйте онлайн! (включает все тестовые случаи)
Сэкономили 6 байтов благодаря Мартину Бюттнеру и 11 благодаря Деннису!
источник
PowerShell v2 +, 81 байт
Самый грубый из грубой силы.
Принимает ввод
$a
, входит вfor
цикл до тех пор, пока не$a
станет меньше или равен1
. Каждый цикл мы проходим через другойfor
цикл, который отсчитывается от,$a
пока мы не найдем делитель (!($a%$i
). В худшем случае мы найдем$i=1
в качестве делителя. Когда мы это сделаем, увеличьте наш счетчик$j
, вычтите наш делитель$a-=$i
и установите$i=0
выход из внутреннего цикла. В конце концов, мы достигнем условия, когда внешний цикл ложен (то$a
есть достиг1
), поэтому выводим$j
и выходим.Внимание : это займет много времени на больших числах, особенно простых. Ввод 100 000 000 занимает ~ 35 секунд на моем ноутбуке Core i5. Редактировать - только что протестировано с
[int]::MaxValue
(2 ^ 32-1), и это заняло ~ 27 минут. Полагаю, не так уж и плохо.источник
Matlab, 58 байт
источник
Japt , 12 байт (не конкурирует)
Проверьте это онлайн! Не конкурирует, потому что использует множество функций, которые были добавлены после публикации заявки.
Как это устроено
Эта техника была вдохновлена ответом 05AB1E . Использовалась предыдущая версия
²¤
(нажмите 2, отрежьте первые два элемента) вместо,Å
потому что она на один байт корочеs1
(обратите внимание на конечный пробел); Я понял только после того факта, что, поскольку это добавляет 2 к концу массива и срезы с самого начала , он фактически завершается ошибкой на любом нечетном составном числе, хотя он работает на всех заданных тестовых примерах.источник
Python 3,
75, 70, 67 байт.Это довольно прямое рекурсивное решение. Это займет ОЧЕНЬ много времени для тестовых случаев с большим количеством.
источник
> <>, 32 байта
Ожидается ввод числа
n
в стеке.Эта программа строит полную последовательность в стеке. В качестве единственного числа , которое может привести к
1
ИБ2
, построение последовательности останавливается , когда2
достигается. Это также приводит к тому, что размер стека равен количеству шагов, а не количеству шагов +1.источник
Рубин, 43 байта
Найдите наименьшее число,
i
такое, котороеx
делитx-i
и повторяйте, пока мы не достигнем1
.источник
Haskell, 67 байт
Вот код:
И вот одна из причин, почему Haskell потрясающий:
Да, в Haskell вы можете определить,
-->
чтобы быть эквивалентным==
.источник
Matlab, 107 байт
источник
MATL,
1716 байтПопробуйте онлайн
объяснение
источник
C99,
6261 байт@Alchymist удаляет 1 байт
Вызовите как f (x, & y), где x - это вход, а y - это выход.
источник
Юлия,
3936 байтПопробуйте онлайн!
источник
Clojure,
116104 байта-12 байт, фильтруя диапазон, чтобы найти кратные, затем используя
last
один, чтобы получить самый большойНаивное решение, которое в основном просто решает проблему, как описано в ОП. К сожалению, только нахождение наибольшего делителя занимает половину используемых байтов. По крайней мере, у меня должно быть много места для игры в гольф отсюда.
Прегольфед и тест:
источник
Perl 6 , 35 байт
Попробуйте онлайн!
Как это устроено
источник
Pyth,
1716 байтПопробуйте онлайн! (В
y.v
конце для вызова функции)Оригинал 17 байтов:
Попробуйте онлайн! (В
y.v
конце для вызова функции)(Я действительно ответил на этот вопрос с помощью этой программы Pyth.)
источник
u
вероятно, оно короче реальной рекурсии.Пайк, 11 байт (неконкурентный)
При этом используется новое поведение, при котором, если после goto возникает исключение, оно восстанавливает состояние до перехода к goto (кроме определений переменных) и продолжает работу. В этом случае это эквивалентно следующему коду Python:
Это все возможно, используя Pyke без создания цикла while - ура!
Попробуй это здесь!
источник
JavaScript (ES6),
7054 байтаРеализация предоставленной рекурсивной формулы, но теперь она обновлена для использования рекурсии, чтобы также найти делитель.
источник
Perl, 57 + 1 (
-p
флаг) = 58 байтИспользование:
Ungolfed:
источник
Clojure,
9896 байтиспользуется
for
:when
для поиска наибольшего делителя, циклически повторяется до тех пор, пока не будет найдено значение, большее, чем единица.источник