ultra-mega-enumerator
Version:
Ultra Mega Enumerator is a lightweight library designed to enumerate various combinatorial objects.
70 lines • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CombinationEnumeration = void 0;
const AbstractEnumeration_1 = require("./AbstractEnumeration");
const Combination_1 = require("./../objects/Combination");
class CombinationEnumeration extends AbstractEnumeration_1.AbstractEnumeration {
constructor(n, k) {
super();
this.current = CombinationEnumeration.first(n, k);
}
static first(n, k) {
if (k > n || n < 0 || k < 0) {
return null;
}
const combination = new Combination_1.Combination(n);
for (let i = 0; i < k; i++) {
combination.set(i, true);
}
return combination;
}
static next(c) {
const n = c.size();
let newCombination = null;
let j = -1;
for (let i = 0; i < n - 1; i++) {
if (c.get(i) && !c.get(i + 1)) {
j = i;
break;
}
}
if (j !== -1) {
newCombination = new Combination_1.Combination(c.size());
for (let i = 0; i < n; i++) {
newCombination.set(i, c.get(i));
}
newCombination.set(j, false);
newCombination.set(j + 1, true);
let s = -1;
for (let i = 0; i < j; i++) {
if (!newCombination.get(i)) {
s = i;
break;
}
}
for (let i = j; i >= 0; i--) {
if (newCombination.get(i) && s !== -1 && s < i) {
newCombination.set(i, false);
newCombination.set(s, true);
while (s < j && newCombination.get(s)) {
s++;
}
}
}
}
return newCombination;
}
hasMoreElements() {
return this.current !== null;
}
nextElement() {
if (this.current === null) {
throw new Error("No such element");
}
const currentValue = this.current;
this.current = CombinationEnumeration.next(currentValue);
return currentValue;
}
}
exports.CombinationEnumeration = CombinationEnumeration;
//# sourceMappingURL=CombinationEnumeration.js.map