Votre défi est simple: un entier étant donné N , ouput chaque liste des nombres entiers positifs que des sommes à N . Par exemple, si l'entrée était 5, vous devez sortir
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
Ces listes ne doivent pas être sorties dans un ordre particulier, pas plus que les numéros à l'intérieur de chaque liste. Par exemple, ce serait également une sortie acceptable pour «5»:
[1, 1, 1, 2]
[5]
[3, 1, 1]
[2, 1, 2]
[4, 1]
[1, 1, 1, 1, 1]
[2, 3]
Vous pouvez supposer en toute sécurité que l'entrée sera un entier positif, et vous pouvez prendre ce nombre dans n'importe quel format raisonnable.
Vous ne pouvez pas utiliser de fonctions intégrées à cet effet.
Si votre programme échoue ou prend trop de temps pour un grand N, c'est OK, mais vous devez au moins produire la sortie correcte pour les 15 premiers.
Les failles standard s'appliquent et la réponse la plus courte en octets l'emporte!
Test 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]]
Cas de test super grand: 15 devraient produire ceci
[[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]]
Catalogue
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Réponses:
Pyth,
109 octetsJe ne sais pas trop si ce n'est pas de la triche, mais les règles ont seulement dit que l'on ne peut pas utiliser la partition entière (ce n'est pas clairement indiqué dans la question elle-même, mais un commentaire d'OP dans la question dit partition entière). J'utilise une partition de liste de
chaînes, ce qui crée des tranches de la liste qui concaténent jusqu'à la liste "mère". Je pense que je dois remercier @Maltysen pour l'idée d'utiliser des listes plutôt que des chaînes.n = 15 prend moins d'une seconde sur ma machine.
Dans le pseudocode de flux de données:
Essayez-le en ligne ici.
la source
{mSlMd./*N
enregistre un octetPyth, 18 octets
Essayez-le en ligne! (Le
y
à la fin est utilisé pour appeler la fonction)C'est assez rapide.
Cela utilise la récursivité. Si l'entrée est
b
, ma méthode générera les partitions de0
àb-1
, puis générera les partitions correctes à partir de chacune.Par exemple, lorsque
b=4
:b=0
donne[[]]
b=1
donne[[1]]
b=2
donne[[2], [1, 1]]
b=3
donne[[3], [1, 2], [1, 1, 1]]
Ensuite, à chaque partition dans
b=0
, ajoutez4
(pour faire la somme 4); à chaque partitionb=1
, ajoutez3
(pour faire la somme4
); etc.C'est principalement ainsi que cela fonctionne.
la source
MATL , 20 octets
Essayez-le en ligne!
Pour l'entrée,
15
cela prend environ 2 secondes dans le compilateur en ligne.Explication
Cela fonctionne en générant des points de partition puis en les convertissant en longueurs de partition . Ce que je veux dire par là est le suivant. Étant donné l'entrée N = 5, une partition possible est [2 2 1]. Ceci est représenté par des points de partition [0 2 4 5], de sorte que des différences (ou longueurs) consécutives des points de partition donnent la partition résultante du numéro d'entrée.
Tous les tableaux de points de partition commencent par 0 et se terminent par N . Le nombre k de points intermédiaires varie de 0 à N -1. Pour N et k donnés, les points intermédiaires peuvent être générés comme une combinaison des nombres [1, 2, ..., N -1] pris k à la fois.
Plusieurs tableaux de points de partition peuvent donner lieu au même résultat dans un ordre différent. Par exemple, les points de partition [0 1 3 5] donneraient les longueurs de partition [1 2 2], c'est-à-dire les mêmes que les [2 2 1] précédents uniquement dans un ordre différent. Cela doit être pris en compte en triant chaque tableau de longueurs de partition et en supprimant les doublons .
la source
Haskell, 53 octets
la source
J,
4942363532 octetsC'est tacite maintenant!
Construit la partition entière de n en construisant les partitions entières de 1 à n . Calcule le résultat pour n = 15 en une milliseconde.
En commençant par la partition entière initiale
[[1]]
qui correspond à n = 1, construisez la partition entière suivante en joignant les résultats de deux opérations: en ajoutant un 1 à chaque partition; incrémenter la plus petite valeur de 1 dans chaque partition. Bien sûr, les partitions en double seront supprimées. Pour obtenir la partition entière n = 2 et au-delà,Usage
Explication
Étant donné que J ne prend pas en charge les tableaux irréguliers, chaque partition doit être encadrée afin de ne pas être remplie de zéro lorsqu'elle est ajoutée à d'autres partitions.
la source
Python, 65 octets
Python 3
Cette fonction accumule une partition et imprime les sorties, en se ramifiant sur les choix. Il décide du nombre de 1 à mettre dans la partition, du nombre de 2, etc. Pour chaque valeur
i
, soiti
et diminuen
àn-i
, oui+1
Si
i>n
, alors plus aucune pièce ne peut être fabriquée, cela s'arrête. Sin
tombe à0
, la partition réussit et est donc imprimée.Python 2
Une méthode récursive qui génère une liste de partitions. Comme avec le code Python 3, il compte la taille de la pièce
i
et décide à chaque étape s'il faut ajouter une autre partie de la taillei
ou s'arrêter.Les deux font
n=15
presque instantanément.la source
Javascript, 194 octets
Non minifié
Trouver des uniques en les triant et en les comparant à une chaîne est un vrai hack, mais économise probablement de l'espace.
la source
Quite a hack but saves space
C'est exactement de cela qu'il s'agit. : DPython 3.5,
8272 octetsRenvoie un ensemble de tuples. n = 15 se termine instantanément.
Testez - le sur repl.it .
la source
Haskell, 44 octets
La fonction auxiliaire
n%m
donne les partitions den
en parties≥m
, la fonction principale utilisantm=1
. Il branche de chaque première entréej
avecm≤j≤n
, récursif sur la partition restante den-j
en parties qui sont au moinsj
. Le cas de basen==0
donne juste la partition vide.la source
Pyth, 17 octets
Définit une fonction nommée
y
. Essayez-le en ligne .la source
Gelée , 9 octets
Essayez-le en ligne!
Comment ça marche
la source
J, 39 octets
Il s'agit d'un verbe monadique qui prend un entier et renvoie un tableau de tableaux encadrés. Essayez-le ici. Usage:
Sur l'entrée 15, il fonctionne pendant environ une seconde sur ma machine.
Explication
Ce défi ressemblait immédiatement à un travail pour Catalog (
{
) et Cut (;.
). Le contour de l'algorithme est:n
.n
tableau de longueurs fictif le long des 1 et énumérez les longueurs de chaque partie.Apparemment, Luis Mendo avait aussi la même idée .
Explication du code:
la source
;.
nouveau.Brachylog , 33 octets (non concurrent)
Ce n'est pas en concurrence en raison d'une correction de bogue.
Cela prend environ 1 seconde
15
sur ma machine. Pour20
et plus, cela se bloque avec uneOut of global stack
exception.Explication
Cela n'utilise aucun partitionnement intégré d'aucune sorte, et utilise à la place le fait que cela
+
fonctionne dans les deux sens via la propagation des contraintes.Prédicat principal:
Prédicat 1:
la source
Mathematica,
6254 octetsLes partitions d'un entier n peuvent être trouvées en résolvant pour n -tuples d'entiers non négatifs ( c 1 , c 2 , ..., c n ) tels que c 1 + 2 c 2 + ... + n c n = n .
FrobeniusSolve
est capable de trouver toutes les solutions à cette équation qui sont utilisées pour créer autant de copies de leurs valeurs respectives afin de trouver toutes les partitions entières de n .la source
FrobeniusSolve
ne trouve pas de partitions entières, il trouve toutes les solutions d'entiers non négatifsx1 ... xN
aux équations de la formea1 x1 + a2 x2 + ... aN xN = b
donnéea1 ... aN
etb
.JavaScript
(Firefox 30-57) 79ES6, 65 octetsPort de la solution Python @ xnor. (Si seulement j'avais remarqué que vous pouviez récuser
m
aussi bien quen
...)la source