UNPKG

ultra-mega-enumerator

Version:

Ultra Mega Enumerator is a lightweight library designed to enumerate various combinatorial objects.

70 lines 2.29 kB
"use strict"; 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