Thách thức là liệt kê tất cả các phân vùng được sắp xếp (thành phần (tổ hợp)) của một số nguyên dương cho trước n. Đây là danh sách các số từ 1đến ntổng của nó n. Ví dụ, đầu vào đã cho n = 4, kết quả sẽ là:
4
1, 3
3, 1
2, 2
2, 1, 1
1, 2, 1
1, 1, 2
1, 1, 1, 1
Kết quả có thể theo bất kỳ thứ tự nào, nhưng phải chứa mỗi phân vùng được đặt hàng một lần. Điều này có nghĩa rằng cho n = 4, [1, 1, 2], [1, 2, 1]và [2, 1, 1]phải tất cả là một phần của kết quả.
Đây là mã JavaScript của riêng tôi để đạt được điều này:
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);
});
}
Đã chơi gôn, ES6 ( 169 167 119 109 105 89 85 byte ):
n=>n?[].concat(...[...Array(n)].map((x,i)=>i+1).map(b=>m(n-b).map(a=>[b,...a]))):[[]]