Declaración del problema
Dado un conjunto de primos consecutivos únicos (que no incluyen necesariamente 2), genera los productos de todas las combinaciones de primeras potencias de estos primos, por ejemplo, sin repeticiones, y también 1. Por ejemplo, dado el conjunto {2, 3, 5, 7}, produce {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210} porque:
1 = 1
2 = 2
3 = 3
5 = 5
6 = 2 x 3
7 = 7
10 = 2 x 5
14 = 2 x 7
15 = 3 x 5
21 = 3 x 7
30 = 2 x 3 x 5
35 = 5 x 7
42 = 2 x 3 x 7
70 = 2 x 5 x 7
105 = 3 x 5 x 7
210 = 2 x 3 x 5 x 7
Tenga en cuenta que si la cardinalidad de su conjunto de entrada es k, esto le dará 2 ^ k miembros en su conjunto de salida.
Reglas / condiciones
- Puedes usar cualquier idioma. Apunte al recuento de caracteres más pequeño del código fuente.
- Su solución debe ser un programa completo o una función completa. La función puede ser anónima (si su idioma admite funciones anónimas).
- Su solución debe poder admitir productos de al menos 2 ^ 31. No se preocupe por detectar o manejar el desbordamiento de enteros si se le pasan números cuyo producto es demasiado grande para representarlo. Sin embargo, indique los límites de sus cálculos.
- Puede aceptar una lista o un conjunto y producir una lista o un conjunto. Puede suponer que la entrada está ordenada, pero no es necesario que produzca una salida ordenada.
Fondo
¿Cuándo o por qué es útil? Un lugar en el que es muy útil es generar una tabla de multiplicadores para competir en paralelo en un algoritmo de factorización de enteros conocido como Factorización de formas cuadradas. Allí, cada multiplicador impar que intente disminuye la probabilidad de que el algoritmo falle (para encontrar un factor) en aproximadamente un 50% en semiprimes duros. Entonces, con el conjunto de primos generadores {3, 5, 7, 11}, que produce un conjunto de 16 multiplicadores de prueba para correr en paralelo, el algoritmo falla aproximadamente 2 ^ –16 del tiempo en semiprimes duros. Agregar 13 a la lista de números primos produce un conjunto de 32 multiplicadores de prueba, lo que reduce la posibilidad de falla a aproximadamente 2 ^ –32, brindando una mejora drástica en el resultado sin gastos computacionales adicionales (porque incluso con el doble de multiplicadores compitiendo en paralelo, en promedio todavía encuentra la respuesta en el mismo número total de pasos).
fuente
1 0
bash --version
CJam, 13 bytes
Lee una matriz (por ejemplo,
[2 3 5 7]
) de STDIN. Pruébalo en línea.Una función anónima tendría el mismo número de bytes:
Ejecución de ejemplo
Cómo funciona
fuente
Haskell, 22
La solución es una función anónima:
ejemplo de uso:
explicación:
(:[1])
es una función que da un númerox
devuelve la lista[x,1]
.mapM(:[1])
es una función que, dada una lista de números, asigna la función(:[1])
sobre ellos y devuelve todas las formas posibles de elegir un elemento de cada lista. por ejemplo,mapM(:[1]) $ [3,4]
primero asigna la función para obtener[[3,1] , [4,1]]
. entonces las opciones posibles son[3,4]
(elegir el primer número de ambos)[3,1]
[1,4]
y[1,1]
así regresa[[3,4],[3,1],[1,4],[1,1]]
.luego
map product
asigna todas las opciones y devuelve sus productos, que son el resultado deseado.Esta función es polimórfica en su tipo, lo que significa que puede operar en todo tipo de números. podría ingresar una lista de
Int
y el resultado sería una lista de,Int
pero también podría aplicarse en una lista de tipoInteger
y devolver una lista deInteger
. esto significa que el comportamiento de desbordamiento no está especificado por esta función sino por el tipo de entrada (yay Haskell's typeive type system :))fuente
Integer
, que es un tipo entero ilimitado. También hayInt
un número entero de 32 bits, pero eso es principalmente un legado.Mathematica,
1817 bytesEsa es una función anónima. Llámalo como
fuente
×@@@𝒫@#
Debería ser inmejorable.(*/@#~2#:@i.@^#)
16 caracteres en J;)Actualización: C (función f), 92
Incluso como una función, esta sigue siendo la entrada más larga aquí. Es la primera vez que paso una matriz de longitud desconocida como argumento de función en C, y aparentemente no hay forma de que una función de C sepa la longitud de una matriz que se le pasó, ya que el argumento se pasa como un puntero ( independientemente de la sintaxis utilizada). Por lo tanto, se requiere un segundo argumento para indicar la longitud.
Mantuve la salida en stdout, porque configurar una matriz entera y devolverla seguramente sería más larga.
Gracias a Dennis por los consejos.
Vea la función
f
(92 caracteres excluyendo espacios en blanco innecesarios) en los programas de prueba a continuación.Salida a través de printf
Salida a través del puntero de matriz
C (programa), 108
excluyendo espacios en blanco innecesarios.
Entrada desde la línea de comandos, salida a stdout. C no va a ganar aquí, pero tal vez intente convertir a una función mañana.
Básicamente, iteramos a través de todas las
1<<c
combinaciones de primos, y cada biti/c
está asociado con la presencia o ausencia de un primo particular en el producto. El "bucle interno"i%c
recorre los números primos, multiplicándolos de acuerdo con el valor dei/c.
Cuandoi%c
alcanza 0, el producto sale, luego se establece en 1 para la siguiente iteración "externa".curiosamente,
printf("%d ",p,p=1)
no funciona (siempre imprime un 1.) Esta no es la primera vez que veo un comportamiento extraño cuando se usa un valor enprintf
ay se asigna más tarde en el mismo paréntesis. Es posible en este caso que la segunda coma no se trate como un separador de argumentos, sino más bien como un operador.Uso
fuente
-Wsequence-point
o-Wall
, GCC se quejará.c-=1
ac--
o incluso utilizari=--c<<c
si no le importa UB (parece que funciona con GCC). 2. Ambos usos de||
pueden ser reemplazados por operadores ternarios:p=i%c?p:!!printf("%d ",p)
yp*=(i/c>>i%c)&1?1:atoi(v[i%c+1])
c-=1
es un juego de golf tan básico que no debería haberlo perdido, pero fue una corrección rápida de errores porque había olvidado que hay una cadena adicional en argv (el nombre del programa) quei=..c<<c
funciona en GCC / cygwin, pero he dejado mi original programa tal como es y pasó a una función. Así que acabo de enterarme de quesizeof
no funciona en matrices pasadas como argumentos de función. He incorporado sus sugerencias para operadores ternarios en la función. Me he quedado con la salida a stdout ya que no veo una forma corta de devolver una matriz.Haskell, 27 bytes
Esta es una implementación de Haskell de la respuesta CJam de @ sudo como una función anónima. No superará la increíble solución Haskell de @proud haskeller, pero la dejaré aquí de todos modos.
Explicación:
foldr
toma una función binaria, un valor y una lista. A continuación, se reemplaza cada célula contras en la lista por una aplicación de la función, y el final de la lista por el valor, como este:foldr f v [a,b,c] == f a (f b (f c v))
. Nuestro valor es una lista de un elemento que contiene1
, y la función binaria esf = (=<<)(++).map.(*)
. Ahora,f
toma un númeron
, crea una función(n*)
que se multiplica porn
, hace de ella una funcióng = map(n*)
que aplica esa función a todos los elementos de una lista y alimenta esa función(=<<)(++)
. Aquí,(++)
está la función de concatenación, y(=<<)
es un enlace monádico , que en este caso toma(++)
yg
, y da una función que toma una lista, se aplicag
a una copia y concatena los dos.En resumen: comience con
[1]
, y para cada númeron
en la lista de entrada, tome una copia de la lista actual, multiplique todo porn
y añádala a la lista actual.fuente
Python: 55 caracteres
Genera recursivamente los productos eligiendo incluir o excluir cada número a su vez.
fuente
and
si escribes la suma al revés.PARI / GP , 26 bytes
Las versiones más largas incluyen
(30 bytes) y
(31 bytes).
Tenga en cuenta que si la entrada fuera una matriz de factorización en lugar de un conjunto, 18 bytes podrían guardarse usando
divisors
solo. Pero convertir un conjunto en una matriz de factorización parece tomar más de 18 bytes. (Puedo hacerlo en 39 bytes directamente comov->concat(Mat(v~),Mat(vectorv(#v,i,1)))
24 bytes multiplicando y re-factorizandov->factor(factorback(v))
, ¿alguien puede hacerlo mejor?)fuente
Sabio -
3634Esencialmente, lo mismo que la solución de Martin Büttner , si lo entiendo correctamente. Como lo mencioné en un comentario, podría publicarlo como respuesta.
Esta es una función anónima, que por ejemplo se puede llamar de la siguiente manera:
fuente
J (20)
Esto resultó más de lo que esperaba o esperaba. Aún así: ¡más corto que Haskel!
Uso:
Esto funciona para cualquier conjunto de números, no solo primos. Además, los números primos pueden tener un tamaño ilimitado, siempre que la matriz tenga el postfix
x
:2 3 5 7x
fuente
*/@#~2#:@i.@^#
Es una alternativa para 14 bytes.05AB1E , 2 bytes
Pruébalo en línea!
Explicación
fuente
R, 56 bytes
Estoy considerando aquí que s es el conjunto (y una lista). Estoy seguro de que puede hacerse aún más corto. Ya vere.
fuente
PHP, 97 bytes
fuente