Una colección de enteros positivos d_1 d_2 ... d_k
es una factorización de un entero positivo n
si
d_1 * d_2 * ... * d_k = n
Cada número entero positivo tiene una factorización prima única , pero en general también tienen factorizaciones en las que algunos de los términos son compuestos. P.ej
12 = 6 * 2 = 4 * 3 = 3 * 2 * 2
Escriba un programa, función, verbo o similar que tome como entrada un solo entero positivo y devuelva o imprima una lista completa de sus factorizaciones distintas. Las factorizaciones pueden producirse en cualquier orden, y sus términos pueden estar en cualquier orden, pero no deben existir permutaciones entre sí. Las factorizaciones pueden no incluir 1
con dos excepciones: para la entrada n
, puede dar la factorización en n*1
lugar de n
; y para la entrada 1
puede dar la factorización en 1
lugar de la lista vacía.
Puede suponer que la entrada estará en el rango de un entero de 32 bits con signo. Si la salida es como una cadena, debe haber una distinción clara entre la delimitación de números dentro de una factorización y la delimitación de las factorizaciones, pero no es necesario (por ejemplo) que los factores se unan con un *
.
Su código debe ser capaz de manejar cualquier entrada válida dentro de los 10 minutos en una máquina de escritorio razonable.
Ejemplos
1 [[]]
or [[1]]
or [[1 1]]
7 [[7]]
or [[7 1]]
or [[1 7]]
12 [[12] [6 2] [4 3] [2 3 2]]
or variants
16 [[2 2 2 2] [2 2 4] [2 8] [4 4] [16]]
or variants
901800900 a list of 198091 factorisations
1338557220 a list of 246218 factorisations
fuente
901800900
y en1338557220
algún lugar donde podamos verificarlas? Mi código me está dando factorizaciones 2048 y 1024 para esos números, respectivamente, y no estoy seguro de por qué.Respuestas:
Haskell, 56 bytes
(2!)(1338557220::Int)
imprime en cinco minutos en mi computadora portátil, cuando se compilaghc -O3
.Haskell, 62 bytes, pero mucho más rápido.
(2!)(1338557220::Int)
imprime en un cuarto de segundo en mi computadora portátil, cuando se compilaghc -O3
.fuente
ghc
me daParse error: naked expression at top level
y meghci
daparse error on input `='
(2!)
con el programamain = print ((2!) (1338557220::Int))
, compile conghc -O3 factor.hs
y ejecute con./factor
.Pyth, 29 bytes
Pruébalo en línea
Se ejecuta en veinte segundos
1338557220
en mi computadora portátil.fuente
pyth factor.pyth
(opyth -c 'Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2'
), proporcionando16
stdin. Asegúrese de estar utilizando una versión actual de Pyth; implícitoQ
fue agregado en marzo. Sin embargo, no puedo imaginar cómo podrías obtener la división por cero."
lugar de'
, y bash estaba expandiendo el!%
a otra cosa.Python ,
2523133123111451411371351038483 bytesEsto se basa en gran medida en la respuesta Pyth de Anders Kaseorg . Cualquier sugerencia de golf bienvenida. Pruébalo en línea!
Editar: 19 bytes de golf gracias a Dennis. Se corrigió un error tipográfico en el código y se agregó un enlace TIO.
Sin golf:
fuente
**.5
se deshace de la importación.JavaScript (ES6), 83 bytes
Solo tomé prestado el truco de raíz cuadrada de @ AndersKaseorg porque terminó ahorrándome bytes en general. Imprime
1
una entrada de1
, de lo contrario no imprime1
s.fuente
Ruby 1.9+,
878987 bytesEsta respuesta se basa en la respuesta Pyth de Anders Kaseorg . Este código solo funciona para versiones posteriores a Ruby 1.9, ya que las lambdas stabby
->
solo se introdujeron en 1.9. Cualquier sugerencia de golf es bienvenida.Sin golf:
fuente
g[n/d,d]
:wrong number of arguments (0 for 1)
->
se introdujeron en Ruby 1.9. Editaré la respuesta para mostrar el número de versión requerido.g[n/d,d]
.g(n/d,d)
Es más compatible con versiones anteriores.f[n]
se requiere llamar lambdas stabby y Rubdas lambdas en general.f(n)
y lasf n
llamadas requierendef
yend
. Más información aquí y aquíJ, 52 bytes
No es tan eficiente como podría ser, ya que algunas factorizaciones pueden repetirse y se debe hacer un pase final después de clasificar cada factorización y luego desduplicar.
Pruébalo en línea! (Pero trate de mantener los valores de entrada pequeños).
En mi escritorio, los tiempos son
Explicación
Este método se basa en generar todas las particiones establecidas para los factores primos del entero de entrada n . El rendimiento es mejor cuando n no tiene cuadrados, de lo contrario se crearán factorizaciones duplicadas.
fuente