Mathematica, 70 69 байт
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Безымянная функция, которая принимает и возвращает целое число. Выдает ошибку при вводе, 1
но все равно вычисляет правильный результат.
объяснение
Как обычно, из-за всего синтаксического сахара, порядок чтения немного забавен. &
На право определяет неназванные функции и ее аргументы ссылаются #
, #2
, #3
и т.д.
...FactorInteger@#...
Мы начнем с факторинга ввода. Это дает список пар, {prime, exponent}
например, ввод 12
дает {{2, 2}, {3, 1}}
. Несколько неудобно, 1
дает {{1, 1}}
.
(...&)@@@...
Это применяет функцию слева к списку целых чисел на уровне 1, то есть функция вызывается для каждой пары, передавая простое и экспоненту в качестве отдельных аргументов, а затем возвращает список результатов. (Это похоже на отображение функции по списку, но получение двух отдельных аргументов удобнее, чем получение пары.)
...PrimePi@#...
Мы вычисляем количество простых чисел вплоть до (простого) ввода с использованием встроенного PrimePi
. Это дает нам индекс простого числа.
...BitXor[...+1,1]-1...
Результат увеличивается, XOR 1
и снова уменьшается. Это перестановки 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, т.е. все индексы, основанные на 1. Обратите внимание, что входные данные 1
дадут, 0
для PrimePi
которых затем отображается -1
в этом процессе. Мы разберемся с этим позже.
...Prime[...]^#2...
Теперь мы получим n- е простое число (где n - результат предыдущего вычисления), которое является правильно переставленным простым, и возведем его в степень исходного простого числа при факторизации входных данных. В этот момент Prime[-1]
выдаст ошибку, но вернет себя без оценки. Мощность в этом случае такова, 1
что весь процесс до сих пор дает данные {Prime[-1]}
для ввода 1
и список правильных простых степеней для всех других входов.
1##&@@...
Далее мы просто умножаем все основные силы. 1##&
стандартная игра в гольф для этой Times
функции. Смотрите этот совет (раздел «Последовательности аргументов»), чтобы узнать, как это работает.
Наконец, нам нужно позаботиться о том, 1
что привело ко всему вышеперечисленному Prime[-1]
. Мы можем легко исправить это с помощью простого правила замены. Помните, что f@x
это сокращение от f[x]
. Мы просто хотим сопоставить любое выражение этой формы (поскольку все остальные результаты будут целыми числами, то есть атомарными выражениями) и заменить его на 1
:
.../._@_->1
Здесь, /.
сокращенно ReplaceAll
, _@_
это шаблон для чего-либо в форме f[x]
(то есть для любого составного выражения с одним дочерним элементом ), и он ->1
говорит «заменить на 1
».