UNPKG

@logic-pad/core

Version:
79 lines (78 loc) 3.06 kB
import { move } from '../../../dataHelper.js'; import { ORIENTATIONS, Orientation } from '../../../primitives.js'; import BTModule, { BTTile, createOneTileResult, getOppositeColor, } from '../data.js'; export default class MyopiaBTModule extends BTModule { constructor(instr) { super(); Object.defineProperty(this, "instr", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.instr = instr; } checkGlobal(grid) { // TODO: Optimize myopia symbol // TODO: What to do if a non-existence tile is in front? const tile = grid.getTile(this.instr.x, this.instr.y); if (tile === BTTile.Empty) return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y }); const traverse = (dir) => { let min = 0; let max = 0; let connected = true; let stopped = false; let pos = move(this.instr, dir); while (grid.isInBound(pos.x, pos.y)) { const curTile = grid.getTile(pos.x, pos.y); if (connected) { if (tile === curTile || curTile === BTTile.NonExist) { min += 1; } else { connected = false; } } if (getOppositeColor(tile) === curTile) { stopped = true; break; } max += 1; pos = move(pos, dir); } return [min, stopped ? max : Number.MAX_SAFE_INTEGER, connected]; }; const allDirections = this.instr.diagonals ? ORIENTATIONS : [Orientation.Up, Orientation.Down, Orientation.Left, Orientation.Right]; const pointedDirections = []; const otherDirections = []; for (const dir of allDirections) { const res = traverse(dir); if (this.instr.directions[dir]) { pointedDirections.push(res); } else { otherDirections.push(res); } } for (let i = 0; i < pointedDirections.length; i++) { const direction1 = pointedDirections[i]; for (let j = i + 1; j < pointedDirections.length; j++) { const direction2 = pointedDirections[j]; if (direction1[0] > direction2[1] || direction2[0] > direction1[1]) return false; } } if (Math.min(...otherDirections.map(d => d[1])) <= Math.max(...pointedDirections.map(d => d[0]))) return false; if (pointedDirections.length === 0 && otherDirections.some(d => d[1] !== Number.MAX_SAFE_INTEGER)) return false; if (pointedDirections.some(d => d[2] && d[1] === Number.MAX_SAFE_INTEGER)) return false; return { tilesNeedCheck: null, ratings: null }; } }