Su reto es simple: Dado un número entero N , ouput todas las listas de números enteros positivos que sumas a N . Por ejemplo, si la entrada fue 5, debe generar
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
Estas listas no tienen que salir en ningún orden en particular, ni los números dentro de cada lista. Por ejemplo, esto también sería un resultado aceptable para '5':
[1, 1, 1, 2]
[5]
[3, 1, 1]
[2, 1, 2]
[4, 1]
[1, 1, 1, 1, 1]
[2, 3]
Puede asumir con seguridad que la entrada será un número entero positivo, y puede tomar este número en cualquier formato razonable.
Es posible que no se utilice ningún funciones incorporadas que hacen esto.
Si su programa falla o toma demasiado tiempo para N grande, está bien, pero al menos debe producir la salida correcta para los primeros 15.
Se aplican las lagunas estándar, ¡y gana la respuesta más corta en bytes!
Prueba IO
1:
[[1]]
2:
[[1, 1], [2]]
3:
[[1, 1, 1], [1, 2], [3]]
4:
[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]
5:
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 4], [2, 3], [5]]
7:
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 3], [1, 1, 1, 2, 2], [1, 1, 1, 4], [1, 1, 2, 3], [1, 1, 5], [1, 2, 2, 2], [1, 2, 4], [1, 3, 3], [1, 6], [2, 2, 3], [2, 5], [3, 4], [7]]
10:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 6], [1, 1, 1, 2, 2, 3], [1, 1, 1, 2, 5], [1, 1, 1, 3, 4], [1, 1, 1, 7], [1, 1, 2, 2, 2, 2], [1, 1, 2, 2, 4], [1, 1, 2, 3, 3], [1, 1, 2, 6], [1, 1, 3, 5], [1, 1, 4, 4], [1, 1, 8], [1, 2, 2, 2, 3], [1, 2, 2, 5], [1, 2, 3, 4], [1, 2, 7], [1, 3, 3, 3], [1, 3, 6], [1, 4, 5], [1, 9], [2, 2, 2, 2, 2], [2, 2, 2, 4], [2, 2, 3, 3], [2, 2, 6], [2, 3, 5], [2, 4, 4], [2, 8], [3, 3, 4], [3, 7], [4, 6], [5, 5], [10]]
Caso de prueba súper grande: 15 debería generar esto
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 6], [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 2, 5], [1, 1, 1, 1, 1, 1, 1, 1, 3, 4], [1, 1, 1, 1, 1, 1, 1, 1, 7], [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 2, 2, 4], [1, 1, 1, 1, 1, 1, 1, 2, 3, 3], [1, 1, 1, 1, 1, 1, 1, 2, 6], [1, 1, 1, 1, 1, 1, 1, 3, 5], [1, 1, 1, 1, 1, 1, 1, 4, 4], [1, 1, 1, 1, 1, 1, 1, 8], [1, 1, 1, 1, 1, 1, 2, 2, 2, 3], [1, 1, 1, 1, 1, 1, 2, 2, 5], [1, 1, 1, 1, 1, 1, 2, 3, 4], [1, 1, 1, 1, 1, 1, 2, 7], [1, 1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 3, 6], [1, 1, 1, 1, 1, 1, 4, 5], [1, 1, 1, 1, 1, 1, 9], [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 2, 2, 2, 4], [1, 1, 1, 1, 1, 2, 2, 3, 3], [1, 1, 1, 1, 1, 2, 2, 6], [1, 1, 1, 1, 1, 2, 3, 5], [1, 1, 1, 1, 1, 2, 4, 4], [1, 1, 1, 1, 1, 2, 8], [1, 1, 1, 1, 1, 3, 3, 4], [1, 1, 1, 1, 1, 3, 7], [1, 1, 1, 1, 1, 4, 6], [1, 1, 1, 1, 1, 5, 5], [1, 1, 1, 1, 1, 10], [1, 1, 1, 1, 2, 2, 2, 2, 3], [1, 1, 1, 1, 2, 2, 2, 5], [1, 1, 1, 1, 2, 2, 3, 4], [1, 1, 1, 1, 2, 2, 7], [1, 1, 1, 1, 2, 3, 3, 3], [1, 1, 1, 1, 2, 3, 6], [1, 1, 1, 1, 2, 4, 5], [1, 1, 1, 1, 2, 9], [1, 1, 1, 1, 3, 3, 5], [1, 1, 1, 1, 3, 4, 4], [1, 1, 1, 1, 3, 8], [1, 1, 1, 1, 4, 7], [1, 1, 1, 1, 5, 6], [1, 1, 1, 1, 11], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 1, 2, 2, 2, 2, 4], [1, 1, 1, 2, 2, 2, 3, 3], [1, 1, 1, 2, 2, 2, 6], [1, 1, 1, 2, 2, 3, 5], [1, 1, 1, 2, 2, 4, 4], [1, 1, 1, 2, 2, 8], [1, 1, 1, 2, 3, 3, 4], [1, 1, 1, 2, 3, 7], [1, 1, 1, 2, 4, 6], [1, 1, 1, 2, 5, 5], [1, 1, 1, 2, 10], [1, 1, 1, 3, 3, 3, 3], [1, 1, 1, 3, 3, 6], [1, 1, 1, 3, 4, 5], [1, 1, 1, 3, 9], [1, 1, 1, 4, 4, 4], [1, 1, 1, 4, 8], [1, 1, 1, 5, 7], [1, 1, 1, 6, 6], [1, 1, 1, 12], [1, 1, 2, 2, 2, 2, 2, 3], [1, 1, 2, 2, 2, 2, 5], [1, 1, 2, 2, 2, 3, 4], [1, 1, 2, 2, 2, 7], [1, 1, 2, 2, 3, 3, 3], [1, 1, 2, 2, 3, 6], [1, 1, 2, 2, 4, 5], [1, 1, 2, 2, 9], [1, 1, 2, 3, 3, 5], [1, 1, 2, 3, 4, 4], [1, 1, 2, 3, 8], [1, 1, 2, 4, 7], [1, 1, 2, 5, 6], [1, 1, 2, 11], [1, 1, 3, 3, 3, 4], [1, 1, 3, 3, 7], [1, 1, 3, 4, 6], [1, 1, 3, 5, 5], [1, 1, 3, 10], [1, 1, 4, 4, 5], [1, 1, 4, 9], [1, 1, 5, 8], [1, 1, 6, 7], [1, 1, 13], [1, 2, 2, 2, 2, 2, 2, 2], [1, 2, 2, 2, 2, 2, 4], [1, 2, 2, 2, 2, 3, 3], [1, 2, 2, 2, 2, 6], [1, 2, 2, 2, 3, 5], [1, 2, 2, 2, 4, 4], [1, 2, 2, 2, 8], [1, 2, 2, 3, 3, 4], [1, 2, 2, 3, 7], [1, 2, 2, 4, 6], [1, 2, 2, 5, 5], [1, 2, 2, 10], [1, 2, 3, 3, 3, 3], [1, 2, 3, 3, 6], [1, 2, 3, 4, 5], [1, 2, 3, 9], [1, 2, 4, 4, 4], [1, 2, 4, 8], [1, 2, 5, 7], [1, 2, 6, 6], [1, 2, 12], [1, 3, 3, 3, 5], [1, 3, 3, 4, 4], [1, 3, 3, 8], [1, 3, 4, 7], [1, 3, 5, 6], [1, 3, 11], [1, 4, 4, 6], [1, 4, 5, 5], [1, 4, 10], [1, 5, 9], [1, 6, 8], [1, 7, 7], [1, 14], [2, 2, 2, 2, 2, 2, 3], [2, 2, 2, 2, 2, 5], [2, 2, 2, 2, 3, 4], [2, 2, 2, 2, 7], [2, 2, 2, 3, 3, 3], [2, 2, 2, 3, 6], [2, 2, 2, 4, 5], [2, 2, 2, 9], [2, 2, 3, 3, 5], [2, 2, 3, 4, 4], [2, 2, 3, 8], [2, 2, 4, 7], [2, 2, 5, 6], [2, 2, 11], [2, 3, 3, 3, 4], [2, 3, 3, 7], [2, 3, 4, 6], [2, 3, 5, 5], [2, 3, 10], [2, 4, 4, 5], [2, 4, 9], [2, 5, 8], [2, 6, 7], [2, 13], [3, 3, 3, 3, 3], [3, 3, 3, 6], [3, 3, 4, 5], [3, 3, 9], [3, 4, 4, 4], [3, 4, 8], [3, 5, 7], [3, 6, 6], [3, 12], [4, 4, 7], [4, 5, 6], [4, 11], [5, 5, 5], [5, 10], [6, 9], [7, 8], [15]]
Catalogar
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
fuente
Respuestas:
Pyth,
109 bytesNo estoy muy seguro si esto no es trampa, pero las reglas solo dicen que uno no puede usar la partición entera (no se establece claramente en la pregunta en sí, pero un comentario de OP en la pregunta dice partición entera). Estoy usando la partición de la lista de
cadenas, que hace cortes de la lista que se concatenan con la lista "madre". Creo que tengo que agradecer a @Maltysen por la idea de usar listas en lugar de cadenas.n = 15 toma menos de un segundo en mi máquina.
En el seudocódigo de flujo de datos:
Pruébelo en línea aquí.
fuente
{mSlMd./*N
guarda un bytePyth, 18 bytes
Pruébalo en línea! (Al
y
final se usa para llamar a la función)Esto es bastante rápido
Esto usa la recursividad. Si la entrada es
b
, mi método generará las particiones de0
ab-1
, y luego generará las particiones correctas de cada uno.Por ejemplo, cuando
b=4
:b=0
da[[]]
b=1
da[[1]]
b=2
da[[2], [1, 1]]
b=3
da[[3], [1, 2], [1, 1, 1]]
Luego, a cada partición
b=0
, agregue4
(para hacer la suma 4); a cada partición enb=1
, agregar3
(para hacer la suma4
); etc.Así es principalmente como funciona.
fuente
MATL , 20 bytes
Pruébalo en línea!
Para la entrada
15
, tarda unos 2 segundos en el compilador en línea.Explicación
Esto funciona generando puntos de partición y luego convirtiéndolos a longitudes de partición . Lo que quiero decir con esto es lo siguiente. Dada la entrada N = 5, una posible partición es [2 2 1]. Esto se representa mediante puntos de partición [0 2 4 5], de modo que las diferencias consecutivas (o longitudes) de los puntos de partición dan la partición resultante del número de entrada.
Todos los conjuntos de puntos de partición empiezan con 0 puntos y terminan con N . El número k de puntos intermedios varía de 0 a N -1. Para N y k dados, los puntos intermedios se pueden generar como una combinación de los números [1, 2, ..., N -1] tomados k a la vez.
Varios conjuntos de puntos de partición pueden dar lugar al mismo resultado en un orden diferente. Por ejemplo, los puntos de partición [0 1 3 5] darían las longitudes de partición [1 2 2], es decir, las mismas que las anteriores [2 2 1] solo en un orden diferente. Esto debe tenerse en cuenta ordenando cada matriz de longitudes de partición y eliminando duplicados .
fuente
Haskell, 53 bytes
fuente
J,
4942363532 bytes¡Es tácito ahora!
Construye la partición entera de n construyendo las particiones enteras de 1 a n . Calcula el resultado para n = 15 en un milisegundo.
Comenzando con la partición entera inicial
[[1]]
que corresponde a n = 1, construya la siguiente partición entera uniendo los resultados de dos operaciones: agregando un 1 a cada partición; incrementando el valor más pequeño en 1 en cada partición. Por supuesto, se eliminarán las particiones duplicadas. Para obtener la partición entera n = 2 y en adelante,Uso
Explicación
Como J no admite matrices irregulares, cada partición debe estar encuadrada para que no se rellenen con ceros cuando se agreguen a otras particiones.
fuente
Python, 65 bytes
Python 3
Esta función acumula una partición e imprime las salidas, ramificando las opciones. Decide cuántos 1 colocar en la partición, cuántos 2, etc. Para cada valor
i
, ya seai
y disminuyen
an-i
, oi+1
Si
i>n
, entonces no se pueden hacer más partes, por lo que se detiene. Sin
cae0
, la partición se realiza correctamente y, por lo tanto, se imprime.Python 2
Un método recursivo que genera una lista de particiones. Al igual que con el código Python 3, cuenta el tamaño de la parte
i
y decide en cada paso si agregar otra parte de tamañoi
o detener.Ambos lo hacen
n=15
casi al instante.fuente
Javascript, 194 bytes
No minificado
Encontrar elementos únicos clasificando y comparando con una cadena es un gran truco, pero probablemente ahorra espacio.
fuente
Quite a hack but saves space
De eso se trata exactamente este sitio. : DPython 3.5,
8272 bytesDevuelve un conjunto de tuplas. n = 15 termina al instante.
Probarlo en repl.it .
fuente
Haskell, 44 bytes
La función auxiliar
n%m
da las particiones den
en partes≥m
, con la función principal usandom=1
. Se ramifica de cada primera entradaj
conm≤j≤n
, recurriendo en la partición restante den-j
en partes que son al menosj
. El caso basen==0
da solo la partición vacía.fuente
Pyth, 17 bytes
Define una función llamada
y
. Pruébalo en línea .fuente
Jalea , 9 bytes
Pruébalo en línea!
Cómo funciona
fuente
J, 39 bytes
Este es un verbo monádico que toma un número entero y devuelve una matriz de matrices en caja. Pruébalo aquí. Uso:
En la entrada 15, se ejecuta durante aproximadamente un segundo en mi máquina.
Explicación
Este desafío inmediatamente parecía un trabajo para Catalog (
{
) y Cut (;.
). El esquema del algoritmo es:n
.n
matriz de longitud ficticia a lo largo de los 1s y enumere las longitudes de cada parte.Aparentemente, Luis Mendo también tuvo la misma idea .
Explicación del código:
fuente
;.
nuevo.Brachylog , 33 bytes (no competidor)
Esto no es competitivo debido a una corrección de errores.
Esto toma aproximadamente 1 segundo
15
en mi máquina. Para20
y más, esto se bloquea con unaOut of global stack
excepción.Explicación
Esto no utiliza particiones integradas de ningún tipo, y en su lugar utiliza el hecho de que
+
funciona en ambos sentidos a través de la propagación de restricciones.Predicado principal:
Predicado 1:
fuente
Mathematica,
6254 bytesLas particiones de un número entero n se pueden encontrar resolviendo n -tuplas de números enteros no negativos ( c 1 , c 2 , ..., c n ) de modo que c 1 + 2 c 2 + ... + n c n = n .
FrobeniusSolve
es capaz de encontrar todas las soluciones a esta ecuación que se utilizan para crear tantas copias de sus respectivos valores con el fin de encontrar todas las particiones enteras de n .fuente
FrobeniusSolve
no encuentra particiones enteras, encuentra todas las soluciones de enteros no negativosx1 ... xN
a las ecuaciones de la formaa1 x1 + a2 x2 + ... aN xN = b
dadaa1 ... aN
yb
.JavaScript
(Firefox 30-57) 79ES6, 65 bytesPuerto de la solución Python de @ xnor. (Si tan solo me hubiera dado cuenta de que podrías volver a aparecer
m
yn
...)fuente