UNPKG

sudoku-solve

Version:

Konni's Sudoku solving library

47 lines (46 loc) 1.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RuleType = exports.Rule = void 0; const Changes_1 = require("./Changes"); const Twin_1 = require("./Twin"); var RuleType; (function (RuleType) { RuleType["ELIMINATION"] = "ELIMINATION"; RuleType["ONLY_POSSIBLE_POSITION"] = "ONLY_POSSIBLE_POSITION"; RuleType["TWINS"] = "TWINS"; })(RuleType || (RuleType = {})); exports.RuleType = RuleType; class Rule { static elimination(group) { const knownNumbers = group.knownNumbers(); const changes = group.numbers .filter((n) => !n.isSolved()) .map((n) => n.remove(knownNumbers, RuleType.ELIMINATION)); return new Changes_1.Changes(changes); } static onlyPossiblePosition(group) { const solvedNumbers = []; group.unknownNumbers().forEach(unknownNumber => { const possiblePositions = group.numbers.filter(n => n.isPossible(unknownNumber)); if (possiblePositions.length === 1) { // TODO improve by set + solvedNumber only here const solvedNumber = possiblePositions[0].solve(RuleType.ONLY_POSSIBLE_POSITION, unknownNumber); solvedNumbers.push(solvedNumber); } }); return new Changes_1.Changes(solvedNumbers.map(s => Changes_1.Change.solvedNumber(s))); } static twins(group) { const twins = Twin_1.Twin.find(group); let changes = new Changes_1.Changes([]); twins.forEach(twin => { const nonTwinNumbers = group.numbers .filter(n => !(n.positionEquals(twin.number1) || n.positionEquals(twin.number2))); const newChanges = nonTwinNumbers .map(n => n.remove(twin.values, RuleType.TWINS)); changes = changes.concat(new Changes_1.Changes(newChanges)); }); return changes; } } exports.Rule = Rule;