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)();