ความท้าทายคือการแสดงรายการพาร์ทิชันทั้งหมดที่สั่งซื้อ (องค์ประกอบ (combinatorics)) nของจำนวนเต็มบวกให้ เหล่านี้เป็นรายการของตัวเลขจาก1การที่มีผลรวมเป็นn nตัวอย่างเช่นอินพุตที่กำหนดn = 4ผลลัพธ์ควรเป็น:
4
1, 3
3, 1
2, 2
2, 1, 1
1, 2, 1
1, 1, 2
, 1, 1, 1, 1, 1
ผลลัพธ์สามารถอยู่ในลำดับใดก็ได้ แต่ต้องมีพาร์ติชันที่สั่งซื้อแต่ละครั้ง ซึ่งหมายความว่าสำหรับn = 4, [1, 1, 2], [1, 2, 1]และ[2, 1, 1]ทุกคนจะต้องเป็นส่วนหนึ่งของผล
นี่คือรหัส JavaScript ของฉันเองซึ่งประสบความสำเร็จในสิ่งนี้:
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 ไบต์ ):
n=>n?[].concat(...[...Array(n)].map((x,i)=>i+1).map(b=>m(n-b).map(a=>[b,...a]))):[[]]