Mathematica, 70 69 bytes
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Uma função sem nome que pega e retorna um número inteiro. Ele gera um erro na entrada, 1
mas ainda calcula o resultado correto.
Explicação
Como de costume, devido a todo o açúcar sintático, a ordem de leitura é um pouco engraçada. Um &
nos define certas uma função sem nome e os seus argumentos são referidas por #
, #2
, #3
, etc.
...FactorInteger@#...
Começamos fatorando a entrada. Isso fornece uma lista de pares, {prime, exponent}
por exemplo, a entrada 12
fornece {{2, 2}, {3, 1}}
. Um pouco inconveniente, 1
dá {{1, 1}}
.
(...&)@@@...
Isso aplica a função à esquerda à lista de números inteiros no nível 1, ou seja, a função é chamada para cada par, passando o primo e o expoente como argumentos separados e, em seguida, retorna uma lista dos resultados. (Isso é semelhante ao mapeamento da função na lista, mas receber dois argumentos separados é mais conveniente do que receber um par.)
...PrimePi@#...
Calculamos o número de primos até e incluindo a entrada (prime) usando o built-in PrimePi
. Isso nos dá o índice do primo.
...BitXor[...+1,1]-1...
O resultado é incrementado, XOR'ed com 1
e decrementado novamente. Isso troca 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, ou seja, todos os índices baseados em 1. Observe que a entrada 1
produzirá 0
para a PrimePi
qual é mapeada -1
nesse processo. Nós vamos lidar com isso mais tarde.
...Prime[...]^#2...
Agora, obtemos o n- ésimo primo (onde n é o resultado da computação anterior), que é o primo corretamente trocado e o elevamos à potência do primo original na fatoração da entrada. Nesse ponto Prime[-1]
, lançará um erro, mas retornará sem ser avaliado. O poder nesse caso é 1
que todo o processo até agora rende {Prime[-1]}
entrada 1
e uma lista de potências primárias corretas para todas as outras entradas.
1##&@@...
Em seguida, apenas multiplicamos todos os poderes principais. 1##&
é um truque de golfe padrão para a Times
função. Veja esta dica (seção "Sequências de argumentos") para saber como funciona.
Finalmente, precisamos cuidar das informações 1
para as quais todas as opções acima resultaram Prime[-1]
. Podemos consertar isso facilmente com uma regra de substituição simples. Lembre-se de que f@x
é uma abreviação de f[x]
. Apenas queremos corresponder a qualquer expressão dessa forma (já que todos os outros resultados serão inteiros, ou seja, expressões atômicas) e substituí-la por 1
:
.../._@_->1
Aqui, /.
abreviação de ReplaceAll
, _@_
é um padrão para qualquer coisa da forma f[x]
(ou seja, qualquer expressão composta com um único filho) e ->1
diz "substituir por 1
".