Le défi est de lister toutes les partitions ordonnées (composition (combinatoire)) d'un entier positif donné n
. Ce sont les listes de nombres de 1
à n
dont la somme est n
. Par exemple, pour une entrée donnée n = 4
, le résultat devrait être:
4
1, 3
3, 1
2, 2
2, 1, 1
1, 2, 1
1, 1, 2
1, 1, 1, 1
Le résultat peut être dans n'importe quel ordre, mais doit contenir une fois chaque partition ordonnée. Cela signifie que pour n = 4
, [1, 1, 2]
, [1, 2, 1]
et [2, 1, 1]
doivent tous faire partie du résultat.
Voici mon propre code JavaScript qui y parvient:
function range(n) {
for (var range = [], i = 0; i < n; range.push(++i));
return range;
}
function composition(n) {
return n < 1 ? [[]] : range(n).map(function(i) {
return composition(n - i).map(function(j) {
return [i].concat(j);
});
}).reduce(function(a, b) {
return a.concat(b);
});
}
Golfed, ES6 ( 169 167 119 109 105 89 85 octets ):
n=>n?[].concat(...[...Array(n)].map((x,i)=>i+1).map(b=>m(n-b).map(a=>[b,...a]))):[[]]
Réponses:
Pyth,
76 octetsSolution à 7 octets:
Pyth a une partition entière intégrée
./
, donc 5 des 7 octets reçoivent les commandes.Essayez-le en ligne!
Explication:
Solution à 6 octets:
Si vous avez une liste,
./
calculera avec les commandes; il ne reste plus qu'à refaire les listes.Essayez-le en ligne!
Explication:
la source
Haskell, 37 octets
xnor a enregistré deux octets.
la source
f n=[a:x|a<-[1..n],x<-f$n-a]
soit plus court.given positive integer n ... numbers from 1 to n
)f 0=[[]]
se trouve être un cas de base plus court quef 1=[[1]]
:)Python, 56 octets
Une solution récursive: les partitions ordonnées de
n
sont une partition de plus petitei
avec0<=i<n
, suivie du resten-i
comme dernier élément. Pour un cas de base,n=0
n'a que la partition vide.la source
Python 2, 61 octets
Ce n'est pas le plus court, mais j'aime vraiment la méthode car c'est tellement bizarre.
Génère et évalue récursivement des
2**(n-1)
chaînes, commepour
n=4
. Ces chaînes sont évaluées en tuples représentant toutes les partitions. Entre deux 1 quelconques se trouve soit un+
, les joignant en un seul nombre, soit un,
, divisant des sections adjacentes.la source
import re
lambda n:map(lambda n:map(len,re.finall('10*',bin(n))),range(1<<n-1,1<<n))
JavaScript (Firefox 30-57), 63 octets
la source
f=n=>n<2?[[1]]:f(n-1).map(([n,...a])=>r.push([1+n,...a],[1,n,...a]),r=[])&&r
.Mathematica, 40 octets
L'intégration de Mathematica pour les partitions entières ne donne pas tout ordonné partitions , nous devons donc générer toutes les permutations possibles de chacune d'entre elles, puis aplatir le résultat.
la source
CJam ,
17 ans14 octetsEssayez-le en ligne!
Explication
Je sais j'ai dit que l'utilisation du produit cartésien est plus longue, mais j'ai fini par trouver un moyen de l'utiliser plus efficacement. Je pense que les deux approches sont intéressantes en soi, donc je les mets dans des postes séparés.
Ceci est toujours basé sur l'idée que nous pouvons choisir des
n
temps entre l'ajout de a1
à la partition actuelle ou l'incrémentation du dernier élément de la partition actuelle. Dans cette solution, nous le faisons en générant 2 n-1 programmes différents qui correspondent à ces différents choix.la source
)
". J'ai donc ajoutéed
et testé. +1 pour abus créatif d'erreur.Gelée ,
76 octets-1 octet grâce à @Dennis (conversion de unaire
ḅ1
, plutôt que somme pour chacun pour chacunS€€
)TryItOnline
Comment?
la source
Pure Bash, 51
Il s'agit d'un port de la brillante réponse de @ xnor , utilisant plusieurs niveaux d'extensions bash pour obtenir le résultat souhaité:
Ideone.
$a
contenant1
suivie den-1
zéros.${a//0/{+,']\ $[}1'}
remplace chaque0
dans$a
des copies de la chaîne{+,']\ $[}1'
. Ainsi n = 4 on obtient la chaîne1{+,']\ $[}1'{+,']\ $[}1'{+,']\ $[}1'
$[
et postfixé],
pour donner$[1{+,']\ $[}1'{+,']\ $[}1'{+,']\ $[}1]
$[1+1+1+1], $[1+1+1] 1, $[1+1] $[1+1], $[1+1] 1 1,...
Une utilisation prudente des guillemets, une barre oblique inversée s'échappe et
eval
garantit que les extensions se produisent dans le bon ordre.la source
Rubis, 61 octets
non golfé
usage
la source
x<<i
est plus court que[i]+x
..flatten(1)
n'est-ce pas.flatten 1
?Brachylog , 20 octets
Essayez-le en ligne!
Explication
C'est une situation où vous pensez que les langages déclaratifs feraient bien, mais à cause de la surcharge
+
et de la difficulté à écrire un prédicat de sommation qui propage correctement les contraintes, ils ne le font pas.la source
L
être comprise entre 1 et l'entrée.+
fonctionne également sur un seul entier, je dois forcer.
à être une liste avec##
, et comme+
fonctionne également sur une liste de listes, je dois imposer que les éléments de.
sont des entiers avec:#$a
.CJam , 19 octets
Essayez-le en ligne!
Explication
CJam n'a pas de combinatoire utile intégrée pour les partitions entières. Nous allons donc le faire manuellement. Pour trouver toutes les partitions ordonnées d'un entier
n
, nous pouvons regarder une liste den
celles-ci et considérer toutes les manières possibles d'insérer des séparateurs. Ensuite, nous allons additionner les1
s dans chaque section. Exemple pourn = 3
:J'ai essayé d'utiliser un produit cartésien pour générer tous ces séparateurs, mais cela a fini par 21 octets. Au lieu de cela, je suis retourné à cette ancienne technique pour générer des ensembles de puissance (cela est basé sur une ancienne réponse de Dennis mais je ne la trouve pas pour le moment). L'idée est la suivante: pour générer toutes les partitions, nous pouvons partir d'une liste vide. Ensuite
n
, nous pouvons prendre une décision binaire: soit nous ajoutons un1
(correspond à un séparateur dans l'exemple ci-dessus), soit nous incrémentons la dernière valeur de la liste (correspond à ne pas avoir de séparateur). Pour générer toutes les partitions, nous effectuons simplement les deux opérations à chaque étape et conservons toutes les sorties possibles pour l'étape suivante. Il s'avère que dans CJam, l'ajout et l'incrémentation du premier élément sont plus courts, mais le principe reste le même:la source
T-SQL, 203 octets
Golfé:
Non golfé:
Violon
la source
Mathematica 10.0, 44 octets
Une tentative sans utiliser de modules internes liés aux partitions. A partir de chaque partition ordonnée de taille k , deux partitions successives de k + 1 sont générées: l'une en ajoutant 1 au début, et l'autre en incrémentant la première valeur.
Un moyen plus drôle, mais malheureusement 2 octets de plus pour implémenter la même idée:
la source
MapAt
index à -1.05AB1E ,
1412 octetsEnregistré 2 octets grâce à Adnan
Explication
Essayez-le en ligne!
La solution correspondante est plus courte de 2 octets dans 2sable .
2sable , 10 octets
Essayez-le en ligne!
la source
—
place deiy,
:).Haskell, 41 octets
Pas la solution Haskell la plus courte, mais j'aime bien qu'elle n'utilise pas de
[..]
plages. Au lieu de cela, il calcule récursivement les partitions den
comme les partitions den-1
avec soit un nouveau 1 au début soit une première valeur supérieure. Cela explique pourquoi il y2^(n-1)
en a.la source
Mathematica, 53 octets
Ne bat pas la réponse de Martin Ender, qui utilise la fonction intégrée
IntegerPartitions
fonction intégrée (et les intégrés sont tout à fait corrects pour moi). (Cela ne bat pas non plus la réponse de feersum, que je n'ai vue que trop tard.) Mais je voulais pratiquer une fonction récursive au golf.Génère récursivement toutes les compositions, en générant tous les nombres finaux possibles
j
, puis en se rappelant#-j
où se#
trouve l'entrée.la source
Array
lieu deTable
et en évitant l'Append
aide d' une liste etApply
:±0={{}};±n_:=Join@@Array[{##,n-+##}&@@@±#&,n,0]
@@
-il?f@@g[a,b]
évalue àf[a,b]
. Ici, nous utilisons le fait qu'une liste comme{ { {1,1,1}, {2,1} } , { {1,2} }, { {3} } }
invisible a la têteList
; doncJoin@@{ { {1,1,1}, {2,1} } , { {1,2} }, { {3} } }
évalue àJoin@@List[ { {1,1,1}, {2,1} } , { {1,2} }, { {3} } ]
évalue àJoin[ { {1,1,1}, {2,1} } , { {1,2} }, { {3} } ]
évalue à{ {1,1,1}, {2,1}, {1,2}, {3} }
.Rétine , 32 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Cela fonctionne de manière similaire à ma réponse CJam . Nous parcourons une liste
N
et à chaque position nous prenons les deux branches de la décision binaire a) incrémentons la dernière valeur ou b) commençons une nouvelle valeur à 1.Étape 1
Convertissez l'entrée en unaire.
Étape 2
Le
+
dit à Retina d'exécuter cette étape en boucle jusqu'à ce que la sortie cesse de changer. Le lui%
dit de diviser l'entrée en lignes avant d'appliquer la scène et de les rejoindre ensuite. En mettant l'%
after the+
, la rétine se fend et rejoint après chaque itération. Une itération de la scène prend l'une des décisions que j'ai mentionnées et bifurque ainsi l'ensemble actuel de partitions.Comment cela fonctionne réellement, c'est qu'il correspond à un
1
(mais seulement le premier comme indiqué par le1
devant du backtick), et le remplace par!
(que nous utiliserons comme le chiffre unaire de notre sortie), suivi du1
s restant sur cette ligne (cela incrémente la dernière valeur). Ensuite, sur une autre ligne (¶
), il imprime le préfixe de la ligne actuelle, suivi de,!
, qui insère un séparateur, puis démarre la valeur suivante à1
.Étape 3
Cela convertit les séquences de
!
en nombres décimaux en les remplaçant par leur longueur.Étape 4
Et enfin, nous remarquons que nous avons généré deux fois plus de lignes que nous le voulions, et la moitié d'entre elles commencent par un
,
(celles où nous avons initialement pris la décision de fractionner, même s'il n'y avait rien à séparer après). Par conséquent, nous supprimons toutes les lignes commençant par a,
.la source
Perl, 44 octets
Comprend +3 pour
-n
(le code utilise$'
et$0
il ne peut donc pas être exécuté en-e
ligne de commande)Donnez un numéro à partitionner sur STDIN:
partitions.pl
Si cela ne vous dérange pas les espaces supplémentaires à la fin d'une ligne et une nouvelle ligne supplémentaire, cette solution de 42 octets fonctionne également (exécutée en tant que
perl -M5.010 partitions.pl
):la source
Julia, 113 octets
Solution non récursive
Expliqué:
[vcat([1 for _=i+1:N],sum([1 for _=N-i:N-1])) for i=1:N]
construire un ensemble de listes qui résument à N, dont les permutations ressembleront à la solution (par exemple pour N = 4: [[1,1,1,1], [1,1,2], [1,3], [4 ]])map(x->[permutations(x)...],)
Calculez toutes les permutationsreduce(vcat,)
les combiner dans une liste de listesunique()
filtrer les doublonsla source
N
comme entrée. Vous pouvez créer une fonction lambda en ajoutantN->
au début au coût de 3 octets.f(N)=
, je me suis perdu lors de la copie, je l'ai eu en comptant les octetsMATL , 15 octets
Essayez-le en ligne!
Explication
n
Avec une entrée donnée , cela calcule la puissance cartésienne avec des exposants croissantsk
de1
àn
; et pour chaque exposantk
sélectionne les tuples qui ont une somme égale à l'entrée.la source
Lua
214203182 octetsVersion non résolue.
Trouvé un espace vide et supprimé une variable inutile pour sécuriser 11 octets. il s'avère que table.insert () est inefficace en octets
la source
PHP, 125 octets
-4 octets pour
print_r($r);
au lieu deecho json_encode($r);
pour la sortieune solution récursive avec 250 octets
la source
Prolog, 81 octets + 6 octets à appeler
Essayez-le en ligne!
Appelez avec
[4]*L.
, répétez avec;
jusqu'à ce que toutes les solutions aient été présentées.Alternativement, si une pression répétée
;
n'est pas correcte (ou doit être ajoutée au nombre d'octets), l'appelbagof(L,[4]*L,M).
ajoute 17 octets pour l'appel.la source
J ,
3026 octetsFonctionne en divisant la liste des n unaires en utilisant les valeurs binaires de 2 n .
Essayez-le en ligne!
Explication
la source
En fait,
1716 octetsCette réponse est partiellement basée sur la réponse MATL de Luis Mendo . Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
En fait,
171615 octetsCeci est une fourchette intéressante de la réponse CJam de Martin Ender (celle avec le produit cartésien), avec une différence de mise en œuvre que j'ai trouvée intéressante. Lorsque l'une des chaînes de Martin commence par un incrément, les erreurs empêchent cette chaîne d'être évaluée. En fait, l'erreur est supprimée et la chaîne est quand même évaluée. Cela finit par donner les compositions de chacun
k
dans la gamme[1..n]
.Plutôt que d' essayer d'enlever les compositions supplémentaires, je pris la
n-1
e puissance cartésien d'"1u"
une annexe"1"
au début de chaque chaîne. Cette astuce ne donne que les compositions den
. C'est malheureusement plus long que la réponse de Martin.Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source