UNPKG

simple-combinatorics

Version:

A simple permutations and combinatorics library for JavaScript

89 lines (84 loc) 2.23 kB
function permute(n, k = n, noRepeat = true) { if (typeof k === 'boolean') { noRepeat = k; k = n; } let o = 0; if (noRepeat) { o = -1; } let out = n; for (let i = 1; i < k; i++) { out *= n + o * i; } return out; } function permuteList(arr, k = arr.length, noRepeat = true) { if (k === 0) { return [[]]; } else if (typeof k === 'boolean') { noRepeat = k; k = arr.length; } let result = []; for (let i = 0; i < arr.length; i++) { let newAlphabet = [...arr]; if (noRepeat) { newAlphabet.splice(i, 1); } let smallerCombinations = permuteList(newAlphabet, k - 1, noRepeat); for (let j = 0; j < smallerCombinations.length; j++) { let combination = [...smallerCombinations[j]]; combination.push(arr[i]); result.push(combination); } } return result; } function choose(n, k = n, noRepeat = true) { if (typeof k === 'boolean') { noRepeat = k; k = n; } let o = 0; if (noRepeat) { o = -1; } let out = n; let kFac = 1; for (let i = 1; i < k; i++) { out *= (n + o * i); kFac *= (i + 1); } return out / kFac; } function chooseList(arr, k = arr.length, noRepeat = true) { if (k === 0) { return [[]]; } else if (typeof k === 'boolean') { noRepeat = k; k = arr.length; } let result = []; for (let i = 0; i < arr.length; i++) { let o = noRepeat ? 1 : 0; let newAlphabet = [...arr].slice(i + o, arr.length); let smallerCombinations = chooseList(newAlphabet, k - 1, noRepeat); for (let j = 0; j < smallerCombinations.length; j++) { let combination = [...smallerCombinations[j]]; combination.push(arr[i]); result.push(combination); } } return result; } function range(a, b) { return Array(Math.abs(b - a) + 1).fill().map((_, i) => i + a); } module.exports = { permute, permuteList, choose, chooseList, range }