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à ndont 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]))):[[]]