El desafío es enumerar todas las particiones ordenadas (composición (combinatoria)) de un entero positivo dado n. Estas son las listas de números de 1a ncuya suma es n. Por ejemplo, dada la entrada n = 4, el resultado debería ser:
4
1, 3
3, 1
2, 2
2, 1, 1
1, 2, 1
1, 1, 2
1, 1, 1, 1
El resultado puede estar en cualquier orden, pero debe contener cada partición ordenada una vez. Esto significa que para n = 4, [1, 1, 2], [1, 2, 1]y [2, 1, 1]deben ser parte del resultado.
Aquí está mi propio código JavaScript que logra esto:
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);
});
}
Golfizado, ES6 ( 169 167 119 109 105 89 85 bytes ):
n=>n?[].concat(...[...Array(n)].map((x,i)=>i+1).map(b=>m(n-b).map(a=>[b,...a]))):[[]]