UNPKG

@logic-pad/core

Version:
114 lines (113 loc) 4.62 kB
import { instance as banPatternInstance } from '../../rules/banPatternRule.js'; import { instance as cellCountInstance } from '../../rules/cellCountRule.js'; import { instance as regionAreaInstance } from '../../rules/regionAreaRule.js'; import { instance as sameShapeInstance } from '../../rules/sameShapeRule.js'; import { instance as symbolsPerRegionInstance } from '../../rules/symbolsPerRegionRule.js'; import { instance as undercluedInstance } from '../../rules/undercluedRule.js'; import { instance as uniqueShapeInstance } from '../../rules/uniqueShapeRule.js'; import { instance as offByXInstance } from '../../rules/offByXRule.js'; import { instance as areaNumberInstance } from '../../symbols/areaNumberSymbol.js'; import { instance as dartInstance } from '../../symbols/dartSymbol.js'; import GalaxySymbol, { instance as galaxyInstance, } from '../../symbols/galaxySymbol.js'; import { instance as letterInstance } from '../../symbols/letterSymbol.js'; import LotusSymbol, { instance as lotusInstance, } from '../../symbols/lotusSymbol.js'; import { instance as minesweeperInstance } from '../../symbols/minesweeperSymbol.js'; import { instance as viewpointInstance } from '../../symbols/viewpointSymbol.js'; import { instance as connectAllInstance } from '../../rules/connectAllRule.js'; import EventIteratingSolver from '../eventIteratingSolver.js'; import GridData from '../../grid.js'; import { Color } from '../../primitives.js'; class CspuzSolver extends EventIteratingSolver { constructor() { super(...arguments); Object.defineProperty(this, "id", { enumerable: true, configurable: true, writable: true, value: 'cspuz' }); Object.defineProperty(this, "author", { enumerable: true, configurable: true, writable: true, value: 'semiexp' }); Object.defineProperty(this, "description", { enumerable: true, configurable: true, writable: true, value: 'A blazingly fast WebAssembly solver that supports most rules and symbols (including underclued).' }); } createWorker() { return new Worker(new URL('./cspuzWorker.js', import.meta.url), { type: 'module', }); } isGridSupported(grid) { if (!super.isGridSupported(grid)) { return false; } // special handling for galaxies and lotuses since dual-color symbols are not supported yet for (const [_, symbols] of grid.symbols) { for (const symbol of symbols) { if (symbol instanceof GalaxySymbol || symbol instanceof LotusSymbol) { if (symbol.x % 1 !== 0 && symbol.y % 1 !== 0) { return false; } else if (symbol.x % 1 !== 0 || symbol.y % 1 !== 0) { const tile1 = grid.getTile(Math.floor(symbol.x), Math.floor(symbol.y)); const tile2 = grid.getTile(Math.ceil(symbol.x), Math.ceil(symbol.y)); if (!tile1.fixed || !tile2.fixed || tile1.color !== tile2.color) { return false; } } } } } // special handling for fixed gray tiles if (grid.getTileCount(true, true, Color.Gray) > 0) { return false; } return true; } isInstructionSupported(instructionId) { return CspuzSolver.supportedInstrs.includes(instructionId); } async isEnvironmentSupported() { try { const abortController = new AbortController(); for await (const _ of this.solve(GridData.create(['.']), abortController.signal)) { abortController.abort(); } return true; } catch (ex) { return false; } } } Object.defineProperty(CspuzSolver, "supportedInstrs", { enumerable: true, configurable: true, writable: true, value: [ minesweeperInstance.id, areaNumberInstance.id, letterInstance.id, dartInstance.id, viewpointInstance.id, lotusInstance.id, galaxyInstance.id, connectAllInstance.id, banPatternInstance.id, sameShapeInstance.id, uniqueShapeInstance.id, regionAreaInstance.id, cellCountInstance.id, offByXInstance.id, undercluedInstance.id, symbolsPerRegionInstance.id, ] }); export default CspuzSolver;