Constellations/js/Solver/SingleCell.js

45 lines
936 B
JavaScript

import * as CellSet from Geometry.CellSet;
import getCellSets from Solver.State;
import * as Strategy from Solver.Strategy;
import {diagonal, getColumn, getRow, plus} from Geometry.Vector;
return {
find: find
};
function find(solvingState) {
var cellSets = getCellSets(solvingState);
return Strategy.map(
stepOfCell(solvingState.missing),
Strategy.tryEach(cellSets.map(getSingleCellIn))
);
}
function getSingleCellIn(cellSet) {
return function() {
if(cellSet.size() == 1) {
return cellSet.toList()[0];
}
};
}
function stepOfCell(missing) {
return function(cell) {
return {
reason: 'singleCell',
empty: toEmpty(cell).intersection(missing),
star: new CellSet.CellSet(cell)
};
};
}
function toEmpty(cell) {
var union = CellSet.union([
CellSet.rectangle(plus(cell, diagonal(-1)), diagonal(3)),
CellSet.row(getRow(cell)),
CellSet.column(getColumn(cell))
]);
union.remove(cell);
return union;
}