Вдохновленный цифровыми корнями, основной факторный корень числа - это число, которое появляется, когда вы берете основные множители числа, складываете их вместе и повторяете процесс для полученного числа, продолжая, пока не получите простое число ( который имеет себя в качестве своего единственного первичного фактора и, таким образом, является его собственным первичным факторным корнем). Первичный факторный корень из 4 равен 4, так как 2 * 2 = 2 + 2, и это единственный непростой простой факторный корень из целого числа, большего 1 (что является еще одним частным случаем, поскольку у него нет простых факторов). Последовательность OEIS, образованная простыми факторными корнями, является A029908 .
Например, основной факторный корень 24:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Твое задание:
Напишите программу или функцию, которая находит основной факторный корень входного целого числа.
Входные данные:
Целое число, введенное любым разумным способом, между 2 и наибольшим целым числом, которое поддерживает ваш язык (включительно). В частности, выбор языка с необоснованно низким максимальным целочисленным размером недопустим (а также нарушает эту стандартную лазейку )
Выход:
Целое число, основной факторный корень входных данных.
Тестовые случаи:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Подсчет очков:
Это код-гольф , выигрывает самая низкая оценка в байтах!
4
в тестовых случаях, так как это исключение и легко забыть об этом при тестировании ответа?Ответы:
05AB1E , 3 байта
Попробуйте онлайн!
Пояснения:
источник
4
.Haskell , 61 байт
Попробуйте онлайн!
объяснение
until=<<((==)=<<)
берет функциюf
и применяет ее для ввода,x
пока не будет достигнута фиксированная точка, то естьf x
равнаx
.primeFactors
возвращает список простых факторов числа, возвращаетsum
сумму списка чисел.Но подожди, почему
until=<<((==)=<<)
работа и выглядит так странно?Если мы предположим
f=sum.primeFactors
, более естественное определение будетuntil(\x->f x==x)f
, потому чтоuntil
принимает предикат (функция, которая возвращает логическое значение), функцию, которая имеет тот же тип ввода и возврата (напримерInt -> Int
) и значение этого типа, а затем применяет функцию к значение до тех пор, пока предикат не будет выполнен.until(\x->f x==x)f
такая же , какuntil(\x->(==)(f x)x)f
и как она считает , чтоg (h x) x
это так же , как(g=<<h)x
мы получаемuntil(\x->((==)=<<f)x)f
. После Eta преобразования это становитсяuntil((==)=<<f)f
. Но если мы теперь будем рассматривать(==)=<<
как функцию, к которой применяетсяf
, мы можем увидеть, чтоuntil(((==)=<<)f)f
она снова имеет формуg (h x) x
, сg=until
,h=((==)=<<)
иx=f
, таким образом, она может быть переписана(until=<<((==)=<<))f
. Использование$
оператора , чтобы избавиться от внешних скобок и подставляяf
сsum.primeFactors
выходами решения сверху.источник
=<<((==)=<<)$
Whaaaaaat.Шелуха , 4 байта
Попробуйте онлайн!
Объяснение:
источник
Pyth , 3 байта
Попробуй это здесь.
Объяснение:
источник
The trailing GQ is implicit
Python 2 , 84 байта
Попробуйте онлайн!
источник
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
работает? Я никогда не программировал на Python (в основном Java и C #), поэтому я не уверен, каков результат этой функции. Эта функция изменяет вводn
и возвращает его позже, или она похожа на логическое значение, гдеn>1and(n%d and f(n,d+1)or d+f(n/d))
0 или 1, или 0n
, или что-то еще? Я пытаюсь визуализировать, как будет выглядеть этот порт в Java / C #, но я не могу этого сделать, потому что я не совсем понимаю такие Python-лямбды в общем.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. В общих чертахx and y
эквивалентноx ? y : x
.x and y or z
эквивалентноx ? y : z
в большинстве случаев.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
что былx ? y : x
из JavaScript. Благодарность!Java 8,
175144142141 байт-1 байт благодаря @Nevay .
В отличие от однобайтовых в некоторых языках игры в гольф, Java довольно многословен для простых проверок, простых факторов, цифр и т. Д., Поэтому я думаю, что меньше 200 не слишком потертый.
Скорее всего, можно по-прежнему играть в гольф, комбинируя петли
и не используя отдельный рекурсивный метод для суммы суммы.Объяснение:
Попробуй это здесь.
источник
i,t=n,x
похоже, он принадлежит Python, ха-хаint
(в отличие от Python). ;)i++<n
вместо++i<=n
.Желе , 5 байт
Пояснения:
Попробуйте онлайн!
источник
Сетчатка , 30 байт
Ввод и вывод в одинарный .
Попробуйте онлайн! (Выполняет десятичное / унарное преобразование для удобства.)
объяснение
В
{
инструктирует Retina запустить всю программу в цикле , пока полный проход не удается изменить строку, то есть до тех пор , неподвижная точка не будет достигнута. Следовательно, сама программа вычисляет один шаг суммирования основных факторов текущей стоимости.Этот этап сам вычисляет основную факторизацию входных данных. Это
+
похоже на,{
но зацикливает только этот этап, пока не прекратит изменять строку. Регулярное выражение пытается сопоставить последний прогон1
s, многократно сопоставляя одну и ту же подстроку (т. Е. Фактор). То, как это сделано, немного запутано из-за прямой ссылки\1
. На первой итерации группа1
еще ничего не захватила, поэтому\1
безоговорочно завершается. Вместо этого мы должны сопоставить,\b11+?\B
какая наименьшая возможная подстрока начинается в начале цикла, содержит не менее двух1
секунд и не охватывает весь цикл. Последующие итерации не смогут снова использовать эту альтернативу из-за\b
. Таким образом, на всех дальнейших итерациях мы сопоставляем\1
то есть одна и та же подстрока снова и снова. Этот процесс должен точно достигнуть конца строки ($
), чтобы убедиться, что мы зафиксировали фактический делитель. Преимущество использования этого несколько хитрого подхода состоит в том, что группа1
будет использоваться ровно n / d раз, то есть то, что остается после деления делителя d .Мы заменяем это совпадение на d (
$1
), разделение;
и n / d ($#1$*
который вставляет$#1
копии1
, где$#1
число захватов, сделанных группой1
).Этот процесс останавливается, когда последний запуск строки сам по себе является простым, потому что тогда регулярное выражение больше не совпадает.
Все, что нам нужно сделать, чтобы сложить простые числа, это удалить все разделители.
источник
Ом v2 , 4 байта
Попробуйте онлайн!
Объяснение:
источник
На самом деле 7 байтов
Попробуйте онлайн!
Объяснение:
источник
R + Pracma , 53 байта
Попробуйте онлайн! (Г-скрипка)
R не имеет простые множители встроенные, но многочисленные пакеты (
pracma
,numbers
и т.д.) делать, поэтому я выбрал удобно короткий.источник
Желе , 6 байт
В этом ответе используется один из многих основных факторов факторизации Jelly, и быстрый для
repeat until the results are no longer unique
.Попробуйте онлайн!
источник
1
это единственный случай, когда количество необходимых шагов равноn
(что нормально;1
нам нужно выполнить его только один раз), и, похоже, не было случаев, когда количество шагов большеn
(т.е. кажется, нет никаких контрпримеров). Ах, хорошо, я был вне игры: DMATL , 6 байтов
Использует идею Скоттинет зацикливания больше раз, чем необходимо. Спасибо также Шегги за указание на ошибку, которая теперь исправлена.
Попробуйте онлайн!
объяснение
источник
4
.PowerShell , 124 байта
Попробуйте онлайн!
PowerShell не имеет встроенных основных факторов факторизации, поэтому для выполнения расчетов факторизации используется код из моего ответа на Prime Factors Buddies (верхняя строка).
Вторая строка - это мясо этой программы. Мы принимаем входные данные
$args
в$x
, затемfor
зацикливаемся до тех пор, пока$l
не-n
получимe
квалификацию$x
. (Первая итерация,$l
является$null
и$x
является целым числом, так что мы будем цикл по крайней мере , один раз).Внутри цикла мы устанавливаем нашу команду,
$l = $x
чтобы определить, достигли мы конца цикла или нет. Затем мы получаем факторы$x
сf($x)
,-join
те вместе с ними+
и|iex
их (сокращениеInvoke-Expression
и аналогeval
). Это хранится обратно в$x
. Таким образом, мы достигли «конца», когда сложенная вместе основная факторизация возвращается к себе. Затем мы просто помещаем$x
в конвейер и вывод неявный.источник
Mathematica, 35 байт
Попробуйте онлайн!
(Mathics не поддерживает
Tr
. Я должен реализовать это вручную)источник
1##&
является короткимTimes
иFixedPoint
почти всегда может быть сокращен с//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, но я не знал обFixedPoint
уловке.Tr
в Mathics некоторое время назад .Рубин , 63 байта
Попробуйте онлайн!
Использует
-rprime
флаг для +6 байтов, чтобы использовать Prime # prime_division .prime_division
возвращает пары[prime, exponent]
(например, для 24 у нас есть факторы, которые[2, 2, 2, 3]
он дает[[2, 3], [3, 1]]
), поэтому на каждом шаге мы просто умножаем члены этих пар вместе и суммируем результаты.источник
Javascript (ES6), 63 байта
Ungolfed:
источник
Java 8, 101 байт
Порт @ovs удивительный ответ Python 2 .
Объяснение:
Попробуй это здесь.
источник