JavaScript で「順列」と「組合わせ」を計算する
//組合わせ c= 1:重複あり, 0:重複なし function combinations (a = [ ], b = a.length, c = 1) { return 2 > b ? a.map(a =>[a]) : a.flatMap ((d,e)=> combinations (a.slice (e+1-c), b-1, c).map (e=> [d,...e])); } //順列 c= 1:重複あり, 0:重複なし function permutations (a =[ ], b = a.length, c = 1) { return 2 > b ? a.map (a => [a]) : a.flatMap ((d,e,[...f]) => permutations ((f.splice (e,1-c), f), b - 1, c).map(a => [d, ...a])); } let ary = [1,2,3,4]; console.log(combinations(ary,3)); console.log(Permutations(ary,3,0));
1行で書く
//組合わせ c= 1:重複あり, 0:重複なし const permutations=((F=(a=[],b=a.length,c=1)=>2>b?a.map(d=>[d]):a.flatMap((d,e,[...f])=> F((f.splice(e,1-c),f),b-1,c).map(a=>[d,...a])))=>F)(); //順列 c= 1:重複あり, 0:重複なし const combinations=((f=(a=[],b=a.length,c=1)=>2>b?a.map(d=>[d]):a.flatMap((d,e)=>f(a.slice (e+1-c),b-1,c).map(a=>[d,...a])))=>f)();