sudoku-solve
Version:
Konni's Sudoku solving library
47 lines (46 loc) • 1.92 kB
JavaScript
;
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;