simple-combinatorics
Version:
A simple permutations and combinatorics library for JavaScript
89 lines (84 loc) • 2.23 kB
JavaScript
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
}