(Acompanhe a minha pergunta sobre a troca de bits com os vizinhos .)
Tarefa
Dado um número inteiro positivo x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , imprima o número inteiro obtido trocando os expoentes nessa fatoração por cada par sucessivo de números primos, y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 no OEIS. Isso é código-golfe , então o programa mais curto (em bytes) vence!
Casos de teste
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Respostas:
Gelatina , 10 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Geléia,
171611 bytes5 bytes graças a Dennis.
Experimente online!
Explicação
Versão anterior de 16 bytes
Experimente online!
Explicação
Versão anterior de 17 bytes:
Experimente online!
Explicação
fonte
Mathematica,
7069 bytesUma 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.Começamos fatorando a entrada. Isso fornece uma lista de pares,
{prime, exponent}
por exemplo, a entrada12
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.)
Calculamos o número de primos até e incluindo a entrada (prime) usando o built-in
PrimePi
. Isso nos dá o índice do primo.O resultado é incrementado, XOR'ed com
1
e decrementado novamente. Isso troca1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, ou seja, todos os índices baseados em 1. Observe que a entrada1
produzirá0
para aPrimePi
qual é mapeada-1
nesse processo. Nós vamos lidar com isso mais tarde.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]}
entrada1
e uma lista de potências primárias corretas para todas as outras entradas.Em seguida, apenas multiplicamos todos os poderes principais.
1##&
é um truque de golfe padrão para aTimes
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 resultaramPrime[-1]
. Podemos consertar isso facilmente com uma regra de substituição simples. Lembre-se de quef@x
é uma abreviação def[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 por1
:Aqui,
/.
abreviação deReplaceAll
,_@_
é um padrão para qualquer coisa da formaf[x]
(ou seja, qualquer expressão composta com um único filho) e->1
diz "substituir por1
".fonte
Python 2,
149139 bytes10 bytes graças a Dennis.
fonte
input()
trabalha em Python 2?eval(input())
no Python 3.MATL , 17 bytes
Experimente online!
Explicação
Isso não usa os expoentes diretamente. Em vez disso, alterna cada fator primo (possivelmente repetido) pelo primo seguinte ou pelo primo anterior.
fonte
Julia, 64 bytes
Experimente online! O último caso de teste requer muita memória para o TIO, mas eu o verifiquei localmente.
Como funciona
Para evitar a entrada de caixa especial 1 - o produto de um dicionário vazio não está definido - multiplicamos a entrada n por 2 e dividimos o resultado final por seu par 3 .
factor(2n)
fornece todos os expoentes positivos dos fatores primos de 2n como um dicionário. Ao iterar sobre o dicionário, obteremos pares de valor-chave / expoente principal. A funçãoprod
pegará esses pares, aplicará a função anônimat->...
a eles e retornará o produto dos resultados.Para cada par t = (p, e) ,
endof(~t[1])
ouendof(primes(t[1]))
retorno k , o número de números primos que são menores ou iguais a p , significando que p é o k- ésimo primo.+1$1-1
aumentará k , XOR k + 1 com 1 e diminuirá o resultado. Se k é ímpar, k + 1 é par, então o XOR é incrementado e o resultado final é k + 1 . Se k é par, k + 1 é ímpar, então o XOR diminui e o resultado final é k - 1 .Por fim, computamos todos os números primos menores ou iguais a 3n com
(~3n)
ouprimes(3n)
(o fator primo mais alto de 2n é menor ou igual a n se n> 2 , e sempre há um primo entre n e 2n ), selecione aquele no índice k + 1 ou k - 1 , e elevá-lo ao e th poder com^t[2]
.fonte
Python 2,
1121091089594 bytesTeste em Ideone .
Como funciona
Quando f é chamado, ele primeiro calcula 1 / n . Se o resultado for diferente de zero, n é 1 e f retornos 1 .
Se n> 1 , acontece o seguinte.
Se n não for divisível por p [1] (inicialmente 2 ),
n%p[1]
gera um valor de verdade eé chamado.
Este ramo gera número primo até que o penúltimo divida uniformemente n . Para isso, utiliza o seguinte corolário do teorema de Wilson .
Em todo momento, m é igual ao fatorial de k - 1 (inicialmente 6 = 3! E 4. Em cada iteração, o resultado de
m*m%k*[k]
é anexado à lista de primos p . Pelo corolário,m*m%k
é 1 se k é primo e 0 se não, então isso precede k a p se e somente se k for um número primo.Se n é divisível por p [1] ,
n%p[1]
produz 0 eé executado.
Se p contiver uma quantidade par de números primos,
len(p)*2%4
produzirá 0 e o primeiro multiplicando assumirá o valor de p [0] . Se p contiver uma quantidade ímpar de números primos,len(p)*2%4
produzirá 2 e o primeiro multiplicando assume o valor de p [2] .Em qualquer um dos casos, este é o primo cujos expoentes precisam ser trocados com o de p [1] , então dividimos n por p [1] (diminuindo o expoente em 1 ) e multiplicamos o resultado
f(n/p[1])
pelo primo correspondente (crescente o expoente por 1 ).Observe que
f(n/p[1])
redefine k , m e p para seus valores padrão.f(n/p[1],k,m,p)
melhoraria a eficiência, ao custo de seis bytes extras.fonte
Pitão, 25 bytes
Suíte de teste.
Explicação
fonte
Julia,
155131127 bytesEsta é uma função anônima que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável. Requer uma versão Julia <0,5 porque a funcionalidade principal foi removida da Base no 0,5.
Ungolfed:
Experimente online! (Inclui todos os casos de teste)
fonte
Na verdade, 15 bytes
Experimente online!
Explicação:
fonte
05AB1E, 22 bytes
Explicado
Experimente online
fonte
J, 21 bytes
Obtém os principais expoentes de n como potências primárias com zeros. Em seguida, particione-as em sublistas não sobrepostas de tamanho 2 enquanto preenche um zero extra. Em seguida, inverta cada sub-lista e alise-as em uma lista. Por fim, converta novamente de expoentes primos para um número.
Uso
Explicação
fonte