(Seguimiento de mi pregunta sobre el intercambio de bits con sus vecinos ).
Tarea
Dado un entero positivo x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , imprima el entero obtenido intercambiando los exponentes en esta factorización para cada par sucesivo de primos, y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 en el OEIS. Este es el código de golf , por lo que gana el programa más corto (en bytes).
Casos de prueba
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Respuestas:
Jalea , 10 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Jalea,
171611 bytes5 bytes gracias a Dennis.
Pruébalo en línea!
Explicación
Versión anterior de 16 bytes
Pruébalo en línea!
Explicación
Versión anterior de 17 bytes:
Pruébalo en línea!
Explicación
fuente
Mathematica,
7069 bytesUna función sin nombre que toma y devuelve un entero. Lanza un error en la entrada
1
pero aún calcula el resultado correcto.Explicación
Como de costumbre, debido a todo el azúcar sintáctico, el orden de lectura es un poco divertido. A
&
sobre los define el bien una función sin nombre y sus argumentos son referidos por#
,#2
,#3
, etc.Comenzamos factorizando la entrada. Esto da una lista de pares,
{prime, exponent}
por ejemplo,12
da entradas{{2, 2}, {3, 1}}
. Algo inconveniente,1
da{{1, 1}}
.Esto aplica la función de la izquierda a la lista de enteros en el nivel 1, es decir, se llama a la función para cada par, pasando el primo y el exponente como argumentos separados, y luego devuelve una lista de los resultados. (Esto es similar a mapear la función sobre la lista, pero recibir dos argumentos separados es más conveniente que recibir un par).
Calculamos el número de primos hasta e incluyendo la entrada (primo) utilizando el incorporado
PrimePi
. Esto nos da el índice de la prima.El resultado se incrementa, se XOR con
1
y se vuelve a disminuir. Esto cambia1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, es decir, todos los índices basados en 1. Tenga en cuenta que la entrada1
producirá0
paraPrimePi
que luego se asigna a-1
en este proceso. Nos ocuparemos de eso más tarde.Ahora obtenemos el n º primer (donde n es el resultado del cálculo anterior), que es el primer intercambiado correctamente, y elevarlo a la potencia del primer original en la factorización de la entrada. En este punto
Prime[-1]
arrojará un error pero se devolverá sin evaluar. La potencia en este caso es1
para que todo el proceso hasta ahora produzca{Prime[-1]}
entrada1
y una lista de potencias primarias correctas para todas las demás entradas.Luego, simplemente multiplicamos todos los poderes primarios.
1##&
Es un truco de golf estándar para laTimes
función. Consulte este consejo (sección "Secuencias de argumentos") para ver cómo funciona.Finalmente, debemos ocuparnos de los aportes
1
para los que todo lo anterior resultóPrime[-1]
. Podemos arreglarlo fácilmente con una simple regla de reemplazo. Recuerda quef@x
es la abreviatura def[x]
. Solo queremos hacer coincidir cualquier expresión de esa forma (ya que todos los demás resultados serán enteros, es decir, expresiones atómicas), y reemplazarlo con un1
:Aquí,
/.
es la abreviatura deReplaceAll
,_@_
es un patrón para cualquier cosa de la formaf[x]
(es decir, cualquier expresión compuesta con un solo hijo) y->1
dice "reemplazar con1
".fuente
Python 2,
149139 bytes10 bytes gracias a Dennis.
fuente
input()
funciona en Python 2?eval(input())
Python 3.MATL , 17 bytes
Pruébalo en línea!
Explicación
Esto no usa los exponentes directamente. En cambio, intercambia cada factor primo (posiblemente repetido) por el primo siguiente o el anterior.
fuente
Julia, 64 bytes
Pruébalo en línea! El último caso de prueba requiere demasiada memoria para TIO, pero lo he verificado localmente.
Cómo funciona
Para evitar la entrada de carcasa especial 1 , el producto de un diccionario vacío no está definido, multiplicamos la entrada n por 2 y dividimos el resultado final por su par 3 .
factor(2n)
da todos los exponentes positivos de factores primos de 2n como diccionario. Al iterar sobre el diccionario, obtendremos pares clave-valor / primo-exponente. La funciónprod
tomará estos pares, les aplicará la función anónimat->...
y devolverá el producto de los resultados.Para cada par t = (p, e) ,
endof(~t[1])
oendof(primes(t[1]))
devuelve k , el número de primos que son menores o iguales a p , lo que significa que p es el k número primo.+1$1-1
incrementará k , XOR k + 1 con 1 y disminuirá el resultado. Si k es impar, k + 1 es par, por lo que el XOR aumenta y el resultado final es k + 1 . Si k es par, k + 1 es impar, entonces el XOR disminuye y el resultado final es k - 1 .Por último, se calcula todos los números primos menores o iguales a 3n con
(~3n)
oprimes(3n)
(el principal factor más alto de 2n es menor o igual a n si n> 2 , y siempre hay un primo entre n y 2n ), seleccionamos el que está en el índice k + 1 o k - 1 , y elevarlo a la e ª poder con^t[2]
.fuente
Python 2,
1121091089594 bytesPruébelo en Ideone .
Cómo funciona
Cuando se llama f , primero calcula 1 / n . Si el resultado no es cero, n es 1 y f retornos 1 .
Si n> 1 , sucede lo siguiente.
Si n no es divisible por p [1] (inicialmente 2 ),
n%p[1]
produce un valor verdadero yse llama.
Esta rama genera un número primo hasta que el penúltimo divida uniformemente n . Para hacerlo, utiliza el siguiente corolario del teorema de Wilson .
En todo momento, m es igual al factorial de k - 1 (inicialmente 6 = 3! Y 4. En cada iteración, el resultado de
m*m%k*[k]
se antepone a la lista de primos p . Por el corolario,m*m%k
es 1 si k es primo y 0 si no, así que esto precede k a p si y solo si k es un número primo.Si n es divisible por p [1] ,
n%p[1]
produce 0 yse ejecuta
Si p contiene una cantidad par de números primos,
len(p)*2%4
dará 0 y el primer multiplicando toma el valor de p [0] . Si p contiene una cantidad impar de números primos,len(p)*2%4
dará 2 y el primer multiplicando toma el valor de p [2] .En cualquier caso, este es el primo cuyos exponentes deben intercambiarse con el de p [1] , por lo que dividimos n entre p [1] (disminuyendo el exponente por 1 ) y multiplicamos el resultado de
f(n/p[1])
por el primo correspondiente (aumentando el exponente por 1 ).Tenga en cuenta que
f(n/p[1])
restablece k , m y p a sus valores por defecto.f(n/p[1],k,m,p)
mejoraría la eficiencia, a costa de seis bytes adicionales.fuente
Pyth, 25 bytes
Banco de pruebas.
Explicación
fuente
Julia,
155131127 bytesEsta es una función anónima que acepta un entero y devuelve un entero. Para llamarlo, asígnelo a una variable. Requiere una versión de Julia <0.5 porque la funcionalidad principal se ha eliminado de Base en 0.5.
Sin golf:
Pruébalo en línea! (Incluye todos los casos de prueba)
fuente
En realidad, 15 bytes
Pruébalo en línea!
Explicación:
fuente
05AB1E, 22 bytes
Explicado
Pruébalo en línea
fuente
J, 21 bytes
Obtiene los exponentes primos de n como potencias primarias con ceros. Luego, divídalos en sublistas no superpuestas de tamaño 2 mientras se llena con un cero adicional. Luego invierta cada sublista y aplánelas en una lista. Finalmente, vuelva a convertir de exponentes primos a un número.
Uso
Explicación
fuente