Recientemente ha habido muchos desafíos relacionados con la factorización prima / prima, por lo que pensé que podría ser interesante ir para otro lado.
Dado:
- un entero positivo
n
, y - una lista no vacía de enteros positivos
f
escribir un programa completo o una función para encontrar el menor entero i
tal que i >= n
y i
es un producto de no negativos, potencias enteras de elementos f
.
Ejemplos:
Supongamos
n = 11, f = [2, 3, 5]
.Los primeros productos son:
1 = 2^0 * 3^0 * 5^0 2 = 2^1 * 3^0 * 5^0 3 = 2^0 * 3^1 * 5^0 5 = 2^0 * 3^0 * 5^1 4 = 2^2 * 3^0 * 5^0 6 = 2^1 * 3^1 * 5^0 10 = 2^1 * 3^0 * 5^1 9 = 2^0 * 3^2 * 5^0 15 = 2^0 * 3^1 * 5^1 25 = 2^0 * 3^0 * 5^2 8 = 2^3 * 3^0 * 5^0 12 = 2^2 * 3^1 * 5^0 => smallest greater than (or equal to) 11, so we output it. 20 = 2^2 * 3^0 * 5^1 18 = 2^1 * 3^2 * 5^0 30 = 2^1 * 3^1 * 5^1 50 = 2^1 * 3^0 * 5^2 27 = 2^0 * 3^3 * 5^0 45 = 2^0 * 3^2 * 5^1 75 = 2^0 * 3^1 * 5^2 125 = 2^0 * 3^0 * 5^3
Supongamos
n=14, f=[9, 10, 7]
.De nuevo, los primeros productos:
1 = 7^0 * 9^0 * 10^0 7 = 7^1 * 9^0 * 10^0 9 = 7^0 * 9^1 * 10^0 10 = 7^0 * 9^0 * 10^1 49 = 7^2 * 9^0 * 10^0 => smallest greater than (or equal to) 14, so we output it. 63 = 7^1 * 9^1 * 10^0 70 = 7^1 * 9^0 * 10^1 81 = 7^0 * 9^2 * 10^0 90 = 7^0 * 9^1 * 10^1 100 = 7^0 * 9^0 * 10^2
Casos de prueba:
n, f -> output
10, [2, 3, 5] -> 10
17, [3, 7] -> 21
61, [3,5,2,7] -> 63
23, [2] -> 32
23, [3] -> 27
23, [2, 3] -> 24
31, [3] -> 81
93, [2,2,3] -> 96
91, [2,4,6] -> 96
1, [2,3,5,7,11,13,17,19] -> 1
151, [20,9,11] -> 180
11616, [23,32] -> 12167
11616, [23,32,2,3] -> 11664 = 2^4 * 3^6
5050, [3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210] -> 5103 = 3^6 * 7
12532159, [57, 34, 12, 21] -> 14183424 = 12^5 * 57
Reglas
- Puede suponer que
f
contendrá al menos un elemento, y que todos los elementosf
serán mayores que 1. - Si lo desea, puede suponer que
f
está ordenado en orden decreciente / creciente (pero especifique). - Opcionalmente, puede tomar el número de elementos de
f
si lo desea. - Se permite la salida como una cadena.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes en cada idioma.
- Se aplican las reglas de E / S predeterminadas y las lagunas estándar están prohibidas.
- Se alientan las explicaciones.
fuente
∞
guarda3
bytes sobre-Log@0 (doesn't work on TIO, but works fine on desktop Mathematica). Also,
Tr [1 ^ {##}] `es un byte más corto queLength@{##}
.#2
es incluso más corto queTr[1^{##}]
. :)Quiet
en su código principal. Esta respuesta genera demasiados mensajes incorrectos. Al menos pregúntele a OP si está de acuerdo con esto∞
problema parece ser un error. Trataré de arreglar eso.Python 2 ,
918884 bytesPruébalo en línea!
La función
f
verifica recursivamente sin
es un producto de potencias de elementosl
,g
es solo un contenedor para controlar la iteraciónfuente
Python, 55 bytes
Pruébalo en línea!
Copió descaradamente el guión de pie de página de Rod para probar
fuente
Jalea , 13 bytes
Un enlace diádico que toma la lista,
f
a la izquierda y el númeron
, a la derecha que produce un número.Pruébalo en línea! Golfily ineficiente: se agotará el tiempo de espera para entradas con mayor
n
o mayorduraciónf
.¿Cómo?
Sabemos que los poderes de los factores individuales (estrictamente positivos) nunca tendrán que excederse
n-1
... ¡así que inspeccionemos todas las formas posibles!
fuente
Retina , 76 bytes
Pruébalo en línea! Link excluye los casos de prueba más lentos, pero aún es un poco lento, así que trate de no martillar el servidor de @ Dennis.
fuente
Pyth - 10 bytes
Se queda sin memoria muy rápidamente.
Pruébelo en línea aquí .
Respuesta razonable para 16 bytes:
fsm.A}RQ*Md./PTE
fuente
Mathematica, 85 bytes
Entrada
fuente
{d,s}Min@Select[Flatten[1##&@@(s^#)&/@0~Range~9~Tuples~Tr[1^s]],#>=d&]
U+F4A1
, nombre largo\[Function]
.0~Range~9
parece muy conservador. ¿g[{2,3,5},1001]
Realmente debería saltar1024
y regresar1080
? Esta no es una entrada particularmente grande.Japt , 10 bytes
¡Pruébelo en línea!
No funciona en el último caso de prueba debido a un límite de iteración diseñado para evitar que el intérprete se ejecute para siempre (no ayudó mucho aquí, ya que congeló mi navegador durante una hora ...)
Explicación
fuente
Jalea , 9 bytes
El tiempo de ejecución de O (2 n • length (f) ) y el uso de memoria hacen de esta una solución teórica.
Pruébalo en línea!
fuente
Haskell , 46 bytes
Este es un puerto de la excelente respuesta de Python de KSab . Gracias a Laikoni por su ayuda en la depuración y el golf de esta respuesta en la sala de chat PPCG Haskell, Of Monads and Men . Sugerencias de golf bienvenidas! Pruébalo en línea!
fuente
Mathematica, 73 bytes
Esencialmente un puerto de la respuesta Python de Rod . Define dos operadores binarios y . devuelve si es un producto de elementos de y de otra manera. da el entero más pequeño . Si alguien puede encontrar una manera de eliminar la prueba de divisibilidad, podría ahorrar 10 bytes utilizando la codificación ISO 8859-1.
±
·
n±f
True
n
f
False
n·f
i
Explicación
fuente
R , 52 bytes
Pruébalo en línea!
Han pasado 3 semanas, así que pensé que finalmente publicaría mi propia solución. Este es un enfoque de fuerza bruta.
Hay, sin embargo, un incorporado:
R , 5 bytes
Pruébalo en línea!
De los documentos R:
Sin embargo, algunas pruebas revelaron un error en la implementación, como se muestra en el enlace TIO anterior.
nextn(91,c(2,6))
debería devolver 96, pero devuelve 128 en su lugar. Obviamente, esto solo ocurre cuandofactors
no todos son relativamente primos entre sí. De hecho, el código C subyacente revela que connextn
avidez trata de dividir cada unofactor
a su vez hasta que1
se alcanza:Esto se puede resolver tomando la entrada en orden decreciente.
fuente
JavaScript (ES6),
5350 bytesGuardado 3 bytes gracias a @DanielIndie
Toma entrada en la sintaxis de curry
(n)(a)
.Casos de prueba
Mostrar fragmento de código
¿Cómo?
fuente