Dado un número entero N > 1
, genera todos los demás números cuyas descomposiciones primarias tienen los mismos dígitos que la descomposición primaria de N
.
Por ejemplo, si N = 117
, entonces la salida debe ser [279, 939, 993, 3313, 3331]
, porque
117 = 3 × 3 × 13
Por lo tanto, las cifras disponibles son 1
, 3
, 3
y 3
y tenemos
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Esos son los únicos otros números posibles, porque otra combinación de estos dígitos produce enteros no primos, que no pueden ser el resultado de la factorización prima.
Si N
es cualquiera de 117
, 279
, 939
, 993
, 3313
o 3331
, a continuación, la salida contendrá los otros cinco números: son factores primos amigos.
No puede usar ceros a la izquierda para obtener primos, por ejemplo N = 107
, porque su único amigo es 701
( 017
no se considera).
Entradas y salidas
Los compañeros de entrada y salida deben tomarse y devolverse en la base decimal.
N
siempre será estrictamente mayor que1
.La salida puede formatearse con bastante libertad, siempre y cuando solo contenga los elementos sintácticos de lista y separadores / lista.
El orden de la salida no es importante.
Puede tomar la entrada
STDIN
, como un argumento de función o algo similar.Puede imprimir el resultado
STDOUT
, devolverlo desde una función o algo similar.
Casos de prueba
Su programa debe resolver cualquiera de los casos de prueba a continuación en menos de un minuto .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Ç€=$
sería un poco más rápido queÇ€=Ç
, dada la limitación de tiempo.PowerShell v3 +, 450 bytes
¡Finalmente!
PowerShell no tiene funciones integradas para la comprobación de primalidades, la factorización o las permutaciones, por lo que esto se realiza completamente a mano. Trabajé en un montón de trucos de optimización para intentar reducir la complejidad del tiempo a algo que se ajuste a las restricciones del desafío, y estoy feliz de decir que finalmente lo logré:
Explicación
Están sucediendo muchas cosas aquí, así que intentaré analizarlo.
La primera línea toma la entrada
$n
y define unafunction
,f
. Esta función utiliza la división de prueba acumulativa para obtener una lista de los factores primos. Es bastante rápido para entradas pequeñas, pero obviamente se atasca si la entrada es grande. Afortunadamente, todos los casos de prueba son pequeños, por lo que es suficiente.La siguiente línea obtiene los
f
actores de$n
,-split
son ellos en todos los dígitos ignorando ningún resultado vacíos (esto es necesario debido a la forma en PowerShell hace comparaciones de expresiones regulares y cómo se mueve el puntero a través de la entrada y es un poco molesto para jugar al golf propósitos), entoncessort
s los resultados en orden ascendente. Almacenamos esa matriz de dígitos$x
y la usamos como entrada para un|?{...}
filtro para extraer solo aquellos que son primos. Esos dígitos primos se almacenan$y
para su uso posterior.Luego nos dividimos
$x
en dos componentes. El primer dígito (es decir, el más pequeño) se almacena en$a
, mientras que el resto se pasa a$b
. Si$x
solo tiene un dígito,$b
estará vacío / nulo. Luego tenemos que volver a emitir$a
como una matriz, por lo que utilizamos el operador de coma rápido para hacerlo.Luego, necesitamos construir todas las permutaciones posibles de los dígitos. Esto es necesario para que nuestras pruebas de división luego se salten un montón de números y agilicen las cosas en general.
Mientras quede un elemento
$b
, quitamos el primer dígito$z
y dejamos el resto$b
. Luego, necesitamos acumular$a
el resultado de un corte y corte de cadenas. Tomamos$a+$y
como concatenación de matriz, y para cada elemento construimos una nueva cadena$c
, luego hacemos un bucle a través de$c
's'.length
y la insertamos$z
en cada posición, incluso antes$z$c
y$c$z
después, agregandoselect
solo los-u
elementos nique. Eso nuevamente se concatena con el conjunto$a
y se vuelve a almacenar$a
. Sí, esto termina teniendo cosas tontas, como si pudieras obtener3333
información117
, que en realidad no es una permutación, pero esto es mucho más corto que intentar filtrarlos explícitamente, asegura que obtengamos cada permutación y es solo un poco más lento.Entonces, ahora
$a
tiene una matriz de todas las permutaciones posibles (y luego algunas) de los dígitos del factor. Necesitamos reestablecer$x
para ser nuestro límite superior de resultados posibles colocando|sort
los dígitos en-des
orden descendente y-join
volviéndolos a juntar. Obviamente, ningún valor de salida puede ser mayor que este número.Configuramos nuestra matriz auxiliar
$l
para que sea una matriz de valores que hemos visto anteriormente. A continuación, extraemos todos los valores de$a
(es decir, esas permutaciones) que son primos, y entramos en un ciclo que es el mayor sumidero de tiempo de todo el programa ...Cada iteración, estamos pasando
0
a nuestro límite superior$x
, incrementándonos por el elemento actual$j
. Mientras el$i
valor que estamos considerando no sea un múltiplo de un valor anterior (esa es la0-notin($l|%{$i%$_})
sección), es un candidato potencial para la producción. Si tomamos losf
actores de$i
,sort
ellos, y-eq
UAL$x
, a continuación, añadir el valor a la tubería. Al final del ciclo, agregamos nuestro elemento actual$j
en nuestra$l
matriz para usar la próxima vez, ya que ya hemos considerado todos esos valores.Finalmente, añadimos
|?{$_-ne$n}
aquellos que no son el elemento de entrada. Todos se quedan en la tubería y la salida es implícita.Ejemplos
fuente
CJam ,
2623 bytesPruébalo en línea
Explicación
Concatenar dos números siempre da un resultado mayor que multiplicarlos. Entonces, el número más grande que posiblemente debamos considerar es el número más grande que podemos formar a partir de los dígitos de la factorización prima de la entrada, que es solo todos los dígitos ordenados en orden descendente. Para los números dados, este límite superior es fácilmente lo suficientemente pequeño como para que podamos verificar exhaustivamente cada número en el rango para saber si es un amigo de factor primo:
fuente
05AB1E , 17 bytes
Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
Pyth, 17
Banco de pruebas .
Utiliza la misma observación de la publicación de Martin .
Expansión:
fuente
JavaScript (ES6),
163158bytesEditar : Se ha aclarado que una prima como 23 debería devolver [6] en lugar de un conjunto de resultados vacío. Ahorró 5 bytes al eliminar una regla ahora inútil que, a propósito, evitaba que eso sucediera.
Se comenta el último caso de prueba para que este fragmento se ejecute lo suficientemente rápido, aunque también debería completarse en menos de un minuto.
fuente
PHP 486 bytes
probablemente podría ser más corto con un algoritmo que no es así según el libro.
(pero me gusta el conteo de bytes actual)
Descompostura
fuente
En realidad, 27 bytes
Esto usa el mismo algoritmo que Martin , Adnan , FryAmTheEggman y Dennis han estado usando. Sugerencias de golf bienvenidas. Pruébalo en línea!
Ungolfing
fuente
Powershell, 147 bytes (versión CodeGolf)
Nota: El script resuelve los últimos casos de prueba en menos de 3 minutos en mi cuaderno local. Consulte la solución de "rendimiento" a continuación.
Menos guión de prueba de golf:
Salida:
Powershell, 215 bytes (versión "Rendimiento")
Nota: Creo que los requisitos de rendimiento están en conflicto con el principio de GodeGolf. Pero como había una regla
Your program should solve any of the test cases below in less than a minute
, hice dos cambios para satisfacer la regla:-split'(.)'-ne''
en cambio el código corto|% t*y
;Cada cambio reduce el tiempo de evaluación a la mitad. No piense que he usado todas las funciones para mejorar el rendimiento. Solo esos fueron suficientes para satisfacer la regla.
Menos guión de prueba de golf:
Salida:
fuente
Japt, 18 bytes
Intentalo
fuente