@logic-pad/core 0.26.0 → 0.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -31
- package/assets/logic-core.global.d.ts +3264 -3247
- package/package.json +4 -1
- package/dist/benchmark/helper.d.ts +0 -21
- package/dist/benchmark/helper.js +0 -34
- package/dist/benchmark/prepareBench.d.ts +0 -1
- package/dist/benchmark/prepareBench.js +0 -140
- package/dist/benchmark/runBench.d.ts +0 -1
- package/dist/benchmark/runBench.js +0 -206
- package/dist/src/data/config.d.ts +0 -119
- package/dist/src/data/config.js +0 -72
- package/dist/src/data/configurable.d.ts +0 -14
- package/dist/src/data/configurable.js +0 -26
- package/dist/src/data/dataHelper.d.ts +0 -92
- package/dist/src/data/dataHelper.js +0 -217
- package/dist/src/data/events/eventHelper.d.ts +0 -1
- package/dist/src/data/events/eventHelper.js +0 -6
- package/dist/src/data/events/onFinalValidation.d.ts +0 -14
- package/dist/src/data/events/onFinalValidation.js +0 -4
- package/dist/src/data/events/onGetTile.d.ts +0 -7
- package/dist/src/data/events/onGetTile.js +0 -4
- package/dist/src/data/events/onGridChange.d.ts +0 -6
- package/dist/src/data/events/onGridChange.js +0 -4
- package/dist/src/data/events/onGridResize.d.ts +0 -9
- package/dist/src/data/events/onGridResize.js +0 -4
- package/dist/src/data/events/onSetGrid.d.ts +0 -7
- package/dist/src/data/events/onSetGrid.js +0 -19
- package/dist/src/data/events/onSymbolDisplay.d.ts +0 -16
- package/dist/src/data/events/onSymbolDisplay.js +0 -4
- package/dist/src/data/events/onSymbolMerge.d.ts +0 -10
- package/dist/src/data/events/onSymbolMerge.js +0 -4
- package/dist/src/data/events/onSymbolValidation.d.ts +0 -18
- package/dist/src/data/events/onSymbolValidation.js +0 -4
- package/dist/src/data/grid.d.ts +0 -410
- package/dist/src/data/grid.js +0 -1106
- package/dist/src/data/gridConnections.d.ts +0 -25
- package/dist/src/data/gridConnections.js +0 -309
- package/dist/src/data/gridZones.d.ts +0 -26
- package/dist/src/data/gridZones.js +0 -117
- package/dist/src/data/instruction.d.ts +0 -26
- package/dist/src/data/instruction.js +0 -29
- package/dist/src/data/primitives.d.ts +0 -138
- package/dist/src/data/primitives.js +0 -177
- package/dist/src/data/puzzle.d.ts +0 -73
- package/dist/src/data/puzzle.js +0 -105
- package/dist/src/data/rules/banPatternRule.d.ts +0 -30
- package/dist/src/data/rules/banPatternRule.js +0 -125
- package/dist/src/data/rules/cellCountPerZoneRule.d.ts +0 -23
- package/dist/src/data/rules/cellCountPerZoneRule.js +0 -39
- package/dist/src/data/rules/cellCountRule.d.ts +0 -33
- package/dist/src/data/rules/cellCountRule.js +0 -138
- package/dist/src/data/rules/completePatternRule.d.ts +0 -24
- package/dist/src/data/rules/completePatternRule.js +0 -46
- package/dist/src/data/rules/connectAllRule.d.ts +0 -29
- package/dist/src/data/rules/connectAllRule.js +0 -88
- package/dist/src/data/rules/connectZonesRule.d.ts +0 -29
- package/dist/src/data/rules/connectZonesRule.js +0 -111
- package/dist/src/data/rules/containsShapeRule.d.ts +0 -34
- package/dist/src/data/rules/containsShapeRule.js +0 -125
- package/dist/src/data/rules/customRule.d.ts +0 -34
- package/dist/src/data/rules/customRule.js +0 -74
- package/dist/src/data/rules/differentCountPerZoneRule.d.ts +0 -30
- package/dist/src/data/rules/differentCountPerZoneRule.js +0 -96
- package/dist/src/data/rules/exactCountPerZoneRule.d.ts +0 -33
- package/dist/src/data/rules/exactCountPerZoneRule.js +0 -99
- package/dist/src/data/rules/foresightRule.d.ts +0 -36
- package/dist/src/data/rules/foresightRule.js +0 -107
- package/dist/src/data/rules/index.d.ts +0 -3
- package/dist/src/data/rules/index.js +0 -10
- package/dist/src/data/rules/lyingSymbolRule.d.ts +0 -31
- package/dist/src/data/rules/lyingSymbolRule.js +0 -207
- package/dist/src/data/rules/musicControlLine.d.ts +0 -82
- package/dist/src/data/rules/musicControlLine.js +0 -167
- package/dist/src/data/rules/musicGridRule.d.ts +0 -51
- package/dist/src/data/rules/musicGridRule.js +0 -212
- package/dist/src/data/rules/mysteryRule.d.ts +0 -39
- package/dist/src/data/rules/mysteryRule.js +0 -146
- package/dist/src/data/rules/noLoopsRule.d.ts +0 -29
- package/dist/src/data/rules/noLoopsRule.js +0 -218
- package/dist/src/data/rules/offByXRule.d.ts +0 -32
- package/dist/src/data/rules/offByXRule.js +0 -124
- package/dist/src/data/rules/perfectionRule.d.ts +0 -45
- package/dist/src/data/rules/perfectionRule.js +0 -158
- package/dist/src/data/rules/regionAreaRule.d.ts +0 -34
- package/dist/src/data/rules/regionAreaRule.js +0 -149
- package/dist/src/data/rules/regionShapeRule.d.ts +0 -22
- package/dist/src/data/rules/regionShapeRule.js +0 -58
- package/dist/src/data/rules/rule.d.ts +0 -18
- package/dist/src/data/rules/rule.js +0 -19
- package/dist/src/data/rules/rules.gen.d.ts +0 -23
- package/dist/src/data/rules/rules.gen.js +0 -27
- package/dist/src/data/rules/sameCountPerZoneRule.d.ts +0 -30
- package/dist/src/data/rules/sameCountPerZoneRule.js +0 -95
- package/dist/src/data/rules/sameShapeRule.d.ts +0 -28
- package/dist/src/data/rules/sameShapeRule.js +0 -68
- package/dist/src/data/rules/symbolsPerRegionRule.d.ts +0 -38
- package/dist/src/data/rules/symbolsPerRegionRule.js +0 -181
- package/dist/src/data/rules/undercluedRule.d.ts +0 -24
- package/dist/src/data/rules/undercluedRule.js +0 -53
- package/dist/src/data/rules/uniqueShapeRule.d.ts +0 -28
- package/dist/src/data/rules/uniqueShapeRule.js +0 -65
- package/dist/src/data/rules/wrapAroundRule.d.ts +0 -36
- package/dist/src/data/rules/wrapAroundRule.js +0 -241
- package/dist/src/data/serializer/allSerializers.d.ts +0 -32
- package/dist/src/data/serializer/allSerializers.js +0 -71
- package/dist/src/data/serializer/compressor/allCompressors.d.ts +0 -14
- package/dist/src/data/serializer/compressor/allCompressors.js +0 -43
- package/dist/src/data/serializer/compressor/checksumCompressor.d.ts +0 -6
- package/dist/src/data/serializer/compressor/checksumCompressor.js +0 -21
- package/dist/src/data/serializer/compressor/compressorBase.d.ts +0 -16
- package/dist/src/data/serializer/compressor/compressorBase.js +0 -2
- package/dist/src/data/serializer/compressor/deflateCompressor.d.ts +0 -7
- package/dist/src/data/serializer/compressor/deflateCompressor.js +0 -17
- package/dist/src/data/serializer/compressor/gzipCompressor.d.ts +0 -5
- package/dist/src/data/serializer/compressor/gzipCompressor.js +0 -9
- package/dist/src/data/serializer/compressor/streamCompressor.d.ts +0 -6
- package/dist/src/data/serializer/compressor/streamCompressor.js +0 -41
- package/dist/src/data/serializer/serializerBase.d.ts +0 -32
- package/dist/src/data/serializer/serializerBase.js +0 -2
- package/dist/src/data/serializer/serializer_checksum.d.ts +0 -35
- package/dist/src/data/serializer/serializer_checksum.js +0 -179
- package/dist/src/data/serializer/serializer_v0.d.ts +0 -55
- package/dist/src/data/serializer/serializer_v0.js +0 -484
- package/dist/src/data/shapes.d.ts +0 -19
- package/dist/src/data/shapes.js +0 -137
- package/dist/src/data/solver/allSolvers.d.ts +0 -3
- package/dist/src/data/solver/allSolvers.js +0 -13
- package/dist/src/data/solver/auto/autoSolver.d.ts +0 -18
- package/dist/src/data/solver/auto/autoSolver.js +0 -153
- package/dist/src/data/solver/backtrack/backtrackSolver.d.ts +0 -11
- package/dist/src/data/solver/backtrack/backtrackSolver.js +0 -52
- package/dist/src/data/solver/backtrack/backtrackWorker.d.ts +0 -1
- package/dist/src/data/solver/backtrack/backtrackWorker.js +0 -308
- package/dist/src/data/solver/backtrack/data.d.ts +0 -47
- package/dist/src/data/solver/backtrack/data.js +0 -151
- package/dist/src/data/solver/backtrack/rules/banPattern.d.ts +0 -9
- package/dist/src/data/solver/backtrack/rules/banPattern.js +0 -77
- package/dist/src/data/solver/backtrack/rules/cellCount.d.ts +0 -7
- package/dist/src/data/solver/backtrack/rules/cellCount.js +0 -25
- package/dist/src/data/solver/backtrack/rules/connectAll.d.ts +0 -7
- package/dist/src/data/solver/backtrack/rules/connectAll.js +0 -44
- package/dist/src/data/solver/backtrack/rules/regionArea.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/regionArea.js +0 -71
- package/dist/src/data/solver/backtrack/rules/regionShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/regionShape.js +0 -57
- package/dist/src/data/solver/backtrack/rules/sameShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/sameShape.js +0 -14
- package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.d.ts +0 -10
- package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.js +0 -82
- package/dist/src/data/solver/backtrack/rules/uniqueShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/uniqueShape.js +0 -14
- package/dist/src/data/solver/backtrack/symbols/areaNumber.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/areaNumber.js +0 -75
- package/dist/src/data/solver/backtrack/symbols/dart.d.ts +0 -8
- package/dist/src/data/solver/backtrack/symbols/dart.js +0 -45
- package/dist/src/data/solver/backtrack/symbols/directionLinker.d.ts +0 -11
- package/dist/src/data/solver/backtrack/symbols/directionLinker.js +0 -121
- package/dist/src/data/solver/backtrack/symbols/focus.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/focus.js +0 -48
- package/dist/src/data/solver/backtrack/symbols/galaxy.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/galaxy.js +0 -14
- package/dist/src/data/solver/backtrack/symbols/letter.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/letter.js +0 -93
- package/dist/src/data/solver/backtrack/symbols/lotus.d.ts +0 -11
- package/dist/src/data/solver/backtrack/symbols/lotus.js +0 -55
- package/dist/src/data/solver/backtrack/symbols/minesweeper.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/minesweeper.js +0 -44
- package/dist/src/data/solver/backtrack/symbols/myopia.d.ts +0 -7
- package/dist/src/data/solver/backtrack/symbols/myopia.js +0 -73
- package/dist/src/data/solver/backtrack/symbols/viewpoint.d.ts +0 -7
- package/dist/src/data/solver/backtrack/symbols/viewpoint.js +0 -51
- package/dist/src/data/solver/cspuz/cspuzSolver.d.ts +0 -13
- package/dist/src/data/solver/cspuz/cspuzSolver.js +0 -117
- package/dist/src/data/solver/cspuz/cspuzWorker.d.ts +0 -1
- package/dist/src/data/solver/cspuz/cspuzWorker.js +0 -82
- package/dist/src/data/solver/cspuz/jsonify.d.ts +0 -3
- package/dist/src/data/solver/cspuz/jsonify.js +0 -211
- package/dist/src/data/solver/eventIteratingSolver.d.ts +0 -8
- package/dist/src/data/solver/eventIteratingSolver.js +0 -54
- package/dist/src/data/solver/solver.d.ts +0 -77
- package/dist/src/data/solver/solver.js +0 -59
- package/dist/src/data/solver/universal/universalSolver.d.ts +0 -7
- package/dist/src/data/solver/universal/universalSolver.js +0 -13
- package/dist/src/data/solver/universal/universalWorker.d.ts +0 -1
- package/dist/src/data/solver/universal/universalWorker.js +0 -128
- package/dist/src/data/symbols/areaNumberSymbol.d.ts +0 -31
- package/dist/src/data/symbols/areaNumberSymbol.js +0 -80
- package/dist/src/data/symbols/customIconSymbol.d.ts +0 -35
- package/dist/src/data/symbols/customIconSymbol.js +0 -94
- package/dist/src/data/symbols/customSymbol.d.ts +0 -25
- package/dist/src/data/symbols/customSymbol.js +0 -45
- package/dist/src/data/symbols/customTextSymbol.d.ts +0 -35
- package/dist/src/data/symbols/customTextSymbol.js +0 -95
- package/dist/src/data/symbols/dartSymbol.d.ts +0 -36
- package/dist/src/data/symbols/dartSymbol.js +0 -96
- package/dist/src/data/symbols/directionLinkerSymbol.d.ts +0 -29
- package/dist/src/data/symbols/directionLinkerSymbol.js +0 -232
- package/dist/src/data/symbols/everyLetterSymbol.d.ts +0 -32
- package/dist/src/data/symbols/everyLetterSymbol.js +0 -119
- package/dist/src/data/symbols/focusSymbol.d.ts +0 -40
- package/dist/src/data/symbols/focusSymbol.js +0 -159
- package/dist/src/data/symbols/galaxySymbol.d.ts +0 -27
- package/dist/src/data/symbols/galaxySymbol.js +0 -61
- package/dist/src/data/symbols/hiddenSymbol.d.ts +0 -38
- package/dist/src/data/symbols/hiddenSymbol.js +0 -113
- package/dist/src/data/symbols/houseSymbol.d.ts +0 -33
- package/dist/src/data/symbols/houseSymbol.js +0 -104
- package/dist/src/data/symbols/index.d.ts +0 -3
- package/dist/src/data/symbols/index.js +0 -10
- package/dist/src/data/symbols/letterSymbol.d.ts +0 -32
- package/dist/src/data/symbols/letterSymbol.js +0 -118
- package/dist/src/data/symbols/lotusSymbol.d.ts +0 -30
- package/dist/src/data/symbols/lotusSymbol.js +0 -132
- package/dist/src/data/symbols/minesweeperSymbol.d.ts +0 -33
- package/dist/src/data/symbols/minesweeperSymbol.js +0 -106
- package/dist/src/data/symbols/myopiaSymbol.d.ts +0 -37
- package/dist/src/data/symbols/myopiaSymbol.js +0 -182
- package/dist/src/data/symbols/numberSymbol.d.ts +0 -19
- package/dist/src/data/symbols/numberSymbol.js +0 -32
- package/dist/src/data/symbols/symbol.d.ts +0 -29
- package/dist/src/data/symbols/symbol.js +0 -87
- package/dist/src/data/symbols/symbols.gen.d.ts +0 -14
- package/dist/src/data/symbols/symbols.gen.js +0 -18
- package/dist/src/data/symbols/viewpointSymbol.d.ts +0 -32
- package/dist/src/data/symbols/viewpointSymbol.js +0 -95
- package/dist/src/data/tile.d.ts +0 -26
- package/dist/src/data/tile.js +0 -56
- package/dist/src/data/tileConnections.d.ts +0 -25
- package/dist/src/data/tileConnections.js +0 -74
- package/dist/src/data/validate.d.ts +0 -5
- package/dist/src/data/validate.js +0 -131
- package/dist/src/data/validateAsync.d.ts +0 -15
- package/dist/src/data/validateAsync.js +0 -71
- package/dist/src/data/validateAsyncWorker.d.ts +0 -1
- package/dist/src/data/validateAsyncWorker.js +0 -9
- package/dist/src/index.d.ts +0 -108
- package/dist/src/index.js +0 -111
- package/dist/src/polyfill/streamPolyfill.d.ts +0 -2
- package/dist/src/polyfill/streamPolyfill.js +0 -1
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import BTModule, { BTTile, checkSubtilePlacement, IntArray2D, createOneTileResult, } from '../data.js';
|
|
2
|
-
export default class AreaNumberBTModule extends BTModule {
|
|
3
|
-
instr;
|
|
4
|
-
constructor(instr) {
|
|
5
|
-
super();
|
|
6
|
-
this.instr = instr;
|
|
7
|
-
}
|
|
8
|
-
checkGlobal(grid) {
|
|
9
|
-
const checkResult = checkSubtilePlacement(grid, this.instr);
|
|
10
|
-
if (checkResult !== undefined)
|
|
11
|
-
return checkResult;
|
|
12
|
-
const thisX = Math.floor(this.instr.x);
|
|
13
|
-
const thisY = Math.floor(this.instr.y);
|
|
14
|
-
const tile = grid.getTile(thisX, thisY);
|
|
15
|
-
if (tile === BTTile.Empty)
|
|
16
|
-
return createOneTileResult(grid, { x: thisX, y: thisY });
|
|
17
|
-
const visited = IntArray2D.create(grid.width, grid.height);
|
|
18
|
-
const sameTileQueue = [{ x: thisX, y: thisY }];
|
|
19
|
-
const usableTileQueue = [];
|
|
20
|
-
let sameCellCount = 0;
|
|
21
|
-
let usableCellCount = 0;
|
|
22
|
-
visited.set(thisX, thisY, 1);
|
|
23
|
-
// Count same tile
|
|
24
|
-
while (sameTileQueue.length > 0) {
|
|
25
|
-
const curPos = sameTileQueue.pop();
|
|
26
|
-
sameCellCount += 1;
|
|
27
|
-
for (const edge of grid.getEdges(curPos)) {
|
|
28
|
-
if (visited.get(edge.x, edge.y))
|
|
29
|
-
continue;
|
|
30
|
-
const edgeTile = grid.getTile(edge.x, edge.y);
|
|
31
|
-
if (edgeTile === BTTile.Empty) {
|
|
32
|
-
usableTileQueue.push(edge);
|
|
33
|
-
}
|
|
34
|
-
else if (edgeTile === tile) {
|
|
35
|
-
sameTileQueue.push(edge);
|
|
36
|
-
}
|
|
37
|
-
visited.set(edge.x, edge.y, 1);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (sameCellCount > this.instr.number)
|
|
41
|
-
return false;
|
|
42
|
-
const ratings = [];
|
|
43
|
-
for (const pos of usableTileQueue) {
|
|
44
|
-
ratings.push({ pos, score: 1 });
|
|
45
|
-
}
|
|
46
|
-
// Count usable tile
|
|
47
|
-
while (usableTileQueue.length > 0) {
|
|
48
|
-
const curPos = usableTileQueue.pop();
|
|
49
|
-
usableCellCount += 1;
|
|
50
|
-
if (sameCellCount + usableCellCount >= this.instr.number)
|
|
51
|
-
return { tilesNeedCheck: null, ratings };
|
|
52
|
-
for (const edge of grid.getEdges(curPos)) {
|
|
53
|
-
if (visited.get(edge.x, edge.y))
|
|
54
|
-
continue;
|
|
55
|
-
const edgeTile = grid.getTile(edge.x, edge.y);
|
|
56
|
-
if (edgeTile === BTTile.Empty || edgeTile === tile) {
|
|
57
|
-
usableTileQueue.push(edge);
|
|
58
|
-
visited.set(edge.x, edge.y, 1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return sameCellCount + usableCellCount >= this.instr.number
|
|
63
|
-
? { tilesNeedCheck: null, ratings }
|
|
64
|
-
: false;
|
|
65
|
-
}
|
|
66
|
-
checkLocal(grid, positions) {
|
|
67
|
-
// TODO: Also skip checks if color is the same and within the zone but not directly affectin
|
|
68
|
-
const thisX = Math.floor(this.instr.x);
|
|
69
|
-
const thisY = Math.floor(this.instr.y);
|
|
70
|
-
// Skip checks if it is too far to affect the symbol
|
|
71
|
-
if (positions.every(pos => Math.abs(pos.x - thisX) + Math.abs(pos.y - thisY) > this.instr.number))
|
|
72
|
-
return true;
|
|
73
|
-
return this.checkGlobal(grid);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import DartSymbol from '../../../symbols/dartSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class DartBTModule extends BTModule {
|
|
4
|
-
instr: DartSymbol;
|
|
5
|
-
constructor(instr: DartSymbol);
|
|
6
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
7
|
-
private buildCheckAndRating;
|
|
8
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { move } from '../../../dataHelper.js';
|
|
2
|
-
import BTModule, { BTTile, IntArray2D, createOneTileResult, getOppositeColor, } from '../data.js';
|
|
3
|
-
export default class DartBTModule extends BTModule {
|
|
4
|
-
instr;
|
|
5
|
-
constructor(instr) {
|
|
6
|
-
super();
|
|
7
|
-
this.instr = instr;
|
|
8
|
-
}
|
|
9
|
-
checkGlobal(grid) {
|
|
10
|
-
const tile = grid.getTile(this.instr.x, this.instr.y);
|
|
11
|
-
if (tile === BTTile.Empty)
|
|
12
|
-
return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y });
|
|
13
|
-
let pos = move({ x: this.instr.x, y: this.instr.y }, this.instr.orientation);
|
|
14
|
-
let completed = 0;
|
|
15
|
-
let empty = 0;
|
|
16
|
-
while (grid.isInBound(pos.x, pos.y)) {
|
|
17
|
-
// Opposite tiles
|
|
18
|
-
if (grid.getTile(pos.x, pos.y) === getOppositeColor(tile)) {
|
|
19
|
-
completed += 1;
|
|
20
|
-
if (completed > this.instr.number)
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
// Empty tiles
|
|
24
|
-
if (grid.getTile(pos.x, pos.y) === BTTile.Empty)
|
|
25
|
-
empty += 1;
|
|
26
|
-
pos = move(pos, this.instr.orientation);
|
|
27
|
-
}
|
|
28
|
-
if (completed + empty < this.instr.number)
|
|
29
|
-
return false;
|
|
30
|
-
return this.buildCheckAndRating(grid);
|
|
31
|
-
}
|
|
32
|
-
buildCheckAndRating(grid) {
|
|
33
|
-
const tilesNeedCheck = IntArray2D.create(grid.width, grid.height);
|
|
34
|
-
const ratings = [];
|
|
35
|
-
let pos = { x: this.instr.x, y: this.instr.y };
|
|
36
|
-
while (grid.isInBound(pos.x, pos.y)) {
|
|
37
|
-
if (grid.getTile(pos.x, pos.y) === BTTile.Empty) {
|
|
38
|
-
tilesNeedCheck.set(pos.x, pos.y, 1);
|
|
39
|
-
ratings.push({ pos, score: 1 });
|
|
40
|
-
}
|
|
41
|
-
pos = move(pos, this.instr.orientation);
|
|
42
|
-
}
|
|
43
|
-
return { tilesNeedCheck, ratings };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Position } from '../../../primitives.js';
|
|
2
|
-
import DirectionLinkerSymbol from '../../../symbols/directionLinkerSymbol.js';
|
|
3
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
4
|
-
export default abstract class DirectionLinkerBTModule extends BTModule {
|
|
5
|
-
instr: DirectionLinkerSymbol;
|
|
6
|
-
constructor(instr: DirectionLinkerSymbol);
|
|
7
|
-
private initialPositions;
|
|
8
|
-
private getInitialPositions;
|
|
9
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
10
|
-
protected abstract movePos(grid: BTGridData, x: number, y: number): Position | null;
|
|
11
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import BTModule, { BTTile, IntArray2D, } from '../data.js';
|
|
2
|
-
export default class DirectionLinkerBTModule extends BTModule {
|
|
3
|
-
instr;
|
|
4
|
-
constructor(instr) {
|
|
5
|
-
super();
|
|
6
|
-
this.instr = instr;
|
|
7
|
-
}
|
|
8
|
-
initialPositions = null;
|
|
9
|
-
getInitialPositions() {
|
|
10
|
-
if (this.instr.x % 1 !== 0 && this.instr.y % 1 !== 0)
|
|
11
|
-
return [
|
|
12
|
-
{ x: Math.floor(this.instr.x), y: Math.floor(this.instr.y) },
|
|
13
|
-
{ x: Math.ceil(this.instr.x), y: Math.ceil(this.instr.y) },
|
|
14
|
-
{ x: Math.floor(this.instr.x), y: Math.ceil(this.instr.y) },
|
|
15
|
-
{ x: Math.ceil(this.instr.x), y: Math.floor(this.instr.y) },
|
|
16
|
-
];
|
|
17
|
-
else if (this.instr.x % 1 !== 0)
|
|
18
|
-
return [
|
|
19
|
-
{ x: Math.floor(this.instr.x), y: this.instr.y },
|
|
20
|
-
{ x: Math.ceil(this.instr.x), y: this.instr.y },
|
|
21
|
-
];
|
|
22
|
-
else if (this.instr.y % 1 !== 0)
|
|
23
|
-
return [
|
|
24
|
-
{ x: this.instr.x, y: Math.floor(this.instr.y) },
|
|
25
|
-
{ x: this.instr.x, y: Math.ceil(this.instr.y) },
|
|
26
|
-
];
|
|
27
|
-
else
|
|
28
|
-
return [{ x: this.instr.x, y: this.instr.y }];
|
|
29
|
-
}
|
|
30
|
-
checkGlobal(grid) {
|
|
31
|
-
this.initialPositions ??= this.getInitialPositions();
|
|
32
|
-
const tilesNeedCheck = IntArray2D.create(grid.width, grid.height);
|
|
33
|
-
const ratings = [];
|
|
34
|
-
for (const pos of this.initialPositions) {
|
|
35
|
-
const tile = grid.isInBound(pos.x, pos.y)
|
|
36
|
-
? grid.getTile(pos.x, pos.y)
|
|
37
|
-
: BTTile.NonExist;
|
|
38
|
-
if (tile === BTTile.Empty) {
|
|
39
|
-
const oppoPos = this.movePos(grid, pos.x, pos.y);
|
|
40
|
-
if (oppoPos === null ||
|
|
41
|
-
grid.getTile(oppoPos.x, oppoPos.y) === BTTile.NonExist)
|
|
42
|
-
return false;
|
|
43
|
-
else {
|
|
44
|
-
if (grid.getTile(oppoPos.x, oppoPos.y) === BTTile.Empty) {
|
|
45
|
-
tilesNeedCheck.set(oppoPos.x, oppoPos.y, 1);
|
|
46
|
-
ratings.push({ pos: oppoPos, score: 1 });
|
|
47
|
-
}
|
|
48
|
-
tilesNeedCheck.set(pos.x, pos.y, 1);
|
|
49
|
-
ratings.push({ pos, score: 1 });
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else if (tile === BTTile.NonExist) {
|
|
53
|
-
const oppoPos = this.movePos(grid, pos.x, pos.y);
|
|
54
|
-
if (oppoPos !== null &&
|
|
55
|
-
grid.getTile(oppoPos.x, oppoPos.y) !== BTTile.NonExist) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
const oppoPos = this.movePos(grid, pos.x, pos.y);
|
|
61
|
-
if (oppoPos !== null) {
|
|
62
|
-
const oppoTile = grid.getTile(oppoPos.x, oppoPos.y);
|
|
63
|
-
if (oppoTile === BTTile.Empty) {
|
|
64
|
-
tilesNeedCheck.set(oppoPos.x, oppoPos.y, 1);
|
|
65
|
-
ratings.push({ pos: oppoPos, score: 1 });
|
|
66
|
-
}
|
|
67
|
-
else if (oppoTile === BTTile.NonExist)
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (ratings.length > 0) {
|
|
76
|
-
return { tilesNeedCheck, ratings };
|
|
77
|
-
}
|
|
78
|
-
const queue = this.initialPositions
|
|
79
|
-
.filter(pos => grid.isInBound(pos.x, pos.y) &&
|
|
80
|
-
grid.getTile(pos.x, pos.y) !== BTTile.NonExist)
|
|
81
|
-
.map(pos => {
|
|
82
|
-
const oppoPos = this.movePos(grid, pos.x, pos.y);
|
|
83
|
-
return {
|
|
84
|
-
pos,
|
|
85
|
-
color: grid.getTile(pos.x, pos.y),
|
|
86
|
-
oppoColor: grid.getTile(oppoPos.x, oppoPos.y),
|
|
87
|
-
};
|
|
88
|
-
});
|
|
89
|
-
const visited = IntArray2D.create(grid.width, grid.height);
|
|
90
|
-
// Visit all connected tiles
|
|
91
|
-
while (queue.length > 0) {
|
|
92
|
-
const curPos = queue.pop();
|
|
93
|
-
if (visited.get(curPos.pos.x, curPos.pos.y))
|
|
94
|
-
continue;
|
|
95
|
-
visited.set(curPos.pos.x, curPos.pos.y, 1);
|
|
96
|
-
const oppoPos = this.movePos(grid, curPos.pos.x, curPos.pos.y);
|
|
97
|
-
if (oppoPos === null)
|
|
98
|
-
return false;
|
|
99
|
-
const oppoTile = grid.getTile(oppoPos.x, oppoPos.y);
|
|
100
|
-
if (!(oppoTile === BTTile.Empty || oppoTile === curPos.oppoColor))
|
|
101
|
-
return false;
|
|
102
|
-
for (const edge of grid.getEdges(curPos.pos)) {
|
|
103
|
-
if (visited.get(edge.x, edge.y))
|
|
104
|
-
continue;
|
|
105
|
-
const edgeTile = grid.getTile(edge.x, edge.y);
|
|
106
|
-
if (edgeTile === BTTile.Empty) {
|
|
107
|
-
tilesNeedCheck.set(edge.x, edge.y, 1);
|
|
108
|
-
ratings.push({ pos: edge, score: 1 });
|
|
109
|
-
}
|
|
110
|
-
else if (edgeTile === curPos.color) {
|
|
111
|
-
queue.push({
|
|
112
|
-
pos: edge,
|
|
113
|
-
color: curPos.color,
|
|
114
|
-
oppoColor: curPos.oppoColor,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return { tilesNeedCheck, ratings };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import FocusSymbol from '../../../symbols/focusSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class FocusBTModule extends BTModule {
|
|
4
|
-
instr: FocusSymbol;
|
|
5
|
-
private cachedCheckResult?;
|
|
6
|
-
constructor(instr: FocusSymbol);
|
|
7
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
8
|
-
private buildCheckAndRating;
|
|
9
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import BTModule, { BTTile, IntArray2D, createOneTileResult, } from '../data.js';
|
|
2
|
-
export default class FocusBTModule extends BTModule {
|
|
3
|
-
instr;
|
|
4
|
-
cachedCheckResult;
|
|
5
|
-
constructor(instr) {
|
|
6
|
-
super();
|
|
7
|
-
this.instr = instr;
|
|
8
|
-
}
|
|
9
|
-
checkGlobal(grid) {
|
|
10
|
-
const tile = grid.getTile(this.instr.x, this.instr.y);
|
|
11
|
-
if (tile === BTTile.Empty)
|
|
12
|
-
return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y });
|
|
13
|
-
let gray = 0;
|
|
14
|
-
let same = 0;
|
|
15
|
-
for (let y = this.instr.y - 1; y <= this.instr.y + 1; y++) {
|
|
16
|
-
for (let x = this.instr.x - 1; x <= this.instr.x + 1; x++) {
|
|
17
|
-
if (y !== this.instr.y && x !== this.instr.x)
|
|
18
|
-
continue;
|
|
19
|
-
if (!grid.isInBound(x, y) || (x === this.instr.x && y === this.instr.y))
|
|
20
|
-
continue;
|
|
21
|
-
const checkTile = grid.getTile(x, y);
|
|
22
|
-
if (checkTile === BTTile.Empty)
|
|
23
|
-
gray++;
|
|
24
|
-
else if (checkTile === tile)
|
|
25
|
-
same++;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (same > this.instr.number || same + gray < this.instr.number)
|
|
29
|
-
return false;
|
|
30
|
-
this.cachedCheckResult ??= this.buildCheckAndRating(grid);
|
|
31
|
-
return this.cachedCheckResult;
|
|
32
|
-
}
|
|
33
|
-
buildCheckAndRating(grid) {
|
|
34
|
-
const tilesNeedCheck = IntArray2D.create(grid.width, grid.height);
|
|
35
|
-
const ratings = [];
|
|
36
|
-
for (let y = this.instr.y - 1; y <= this.instr.y + 1; y++) {
|
|
37
|
-
for (let x = this.instr.x - 1; x <= this.instr.x + 1; x++) {
|
|
38
|
-
if (y !== this.instr.y && x !== this.instr.x)
|
|
39
|
-
continue;
|
|
40
|
-
if (!grid.isInBound(x, y) || (x === this.instr.x && y === this.instr.y))
|
|
41
|
-
continue;
|
|
42
|
-
tilesNeedCheck.set(x, y, 1);
|
|
43
|
-
ratings.push({ pos: { x, y }, score: 1 });
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return { tilesNeedCheck, ratings };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Position } from '../../../primitives.js';
|
|
2
|
-
import GalaxySymbol from '../../../symbols/galaxySymbol.js';
|
|
3
|
-
import { BTGridData } from '../data.js';
|
|
4
|
-
import DirectionLinkerBTModule from './directionLinker.js';
|
|
5
|
-
export default class GalaxyBTModule extends DirectionLinkerBTModule {
|
|
6
|
-
instr: GalaxySymbol;
|
|
7
|
-
constructor(instr: GalaxySymbol);
|
|
8
|
-
protected movePos(grid: BTGridData, x: number, y: number): Position | null;
|
|
9
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import DirectionLinkerBTModule from './directionLinker.js';
|
|
2
|
-
export default class GalaxyBTModule extends DirectionLinkerBTModule {
|
|
3
|
-
instr;
|
|
4
|
-
constructor(instr) {
|
|
5
|
-
super(instr);
|
|
6
|
-
this.instr = instr;
|
|
7
|
-
}
|
|
8
|
-
// Translate a position in relative to a galaxy symbol
|
|
9
|
-
movePos(grid, x, y) {
|
|
10
|
-
const symbol = this.instr;
|
|
11
|
-
const pos = { x: 2 * symbol.x - x, y: 2 * symbol.y - y };
|
|
12
|
-
return grid.isInBound(pos.x, pos.y) ? pos : null;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import LetterSymbol from '../../../symbols/letterSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class LetterBTModule extends BTModule {
|
|
4
|
-
private letters;
|
|
5
|
-
private letterGrid;
|
|
6
|
-
constructor(instrs: LetterSymbol[], width: number, height: number);
|
|
7
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
8
|
-
private visitArea;
|
|
9
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import BTModule, { BTTile, checkSubtilePlacement, IntArray2D, } from '../data.js';
|
|
2
|
-
export default class LetterBTModule extends BTModule {
|
|
3
|
-
letters;
|
|
4
|
-
letterGrid;
|
|
5
|
-
constructor(instrs, width, height) {
|
|
6
|
-
super();
|
|
7
|
-
this.letters = [];
|
|
8
|
-
this.letterGrid = IntArray2D.create(width, height);
|
|
9
|
-
const letterMap = new Map();
|
|
10
|
-
let letterCount = 0;
|
|
11
|
-
for (const instr of instrs) {
|
|
12
|
-
if (!letterMap.has(instr.letter)) {
|
|
13
|
-
letterMap.set(instr.letter, letterCount);
|
|
14
|
-
this.letters[letterCount] = [];
|
|
15
|
-
letterCount += 1;
|
|
16
|
-
}
|
|
17
|
-
const id = letterMap.get(instr.letter);
|
|
18
|
-
this.letters[id].push(instr);
|
|
19
|
-
this.letterGrid.set(Math.floor(instr.x), Math.floor(instr.y), id + 1);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
checkGlobal(grid) {
|
|
23
|
-
const visited = IntArray2D.create(grid.width, grid.height);
|
|
24
|
-
for (let id = 0; id < this.letters.length; id++) {
|
|
25
|
-
for (const symbol of this.letters[id]) {
|
|
26
|
-
const checkResult = checkSubtilePlacement(grid, symbol);
|
|
27
|
-
if (checkResult !== undefined)
|
|
28
|
-
return checkResult;
|
|
29
|
-
const symbolX = Math.floor(symbol.x);
|
|
30
|
-
const symbolY = Math.floor(symbol.y);
|
|
31
|
-
if (grid.getTile(symbolX, symbolY) === BTTile.Empty)
|
|
32
|
-
continue;
|
|
33
|
-
if (!this.visitArea(grid, visited, { x: symbolX, y: symbolY }, id + 1))
|
|
34
|
-
return false;
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return { tilesNeedCheck: null, ratings: null };
|
|
39
|
-
}
|
|
40
|
-
visitArea(grid, visited, pos, id) {
|
|
41
|
-
const tile = grid.getTile(pos.x, pos.y);
|
|
42
|
-
const sameTileQueue = [pos];
|
|
43
|
-
const usableTileQueue = [];
|
|
44
|
-
let letterVisited = 0;
|
|
45
|
-
visited.set(pos.x, pos.y, id);
|
|
46
|
-
// Count same tile
|
|
47
|
-
while (sameTileQueue.length > 0) {
|
|
48
|
-
const curPos = sameTileQueue.pop();
|
|
49
|
-
const letterId = this.letterGrid.get(curPos.x, curPos.y);
|
|
50
|
-
if (letterId === id) {
|
|
51
|
-
letterVisited += 1;
|
|
52
|
-
}
|
|
53
|
-
else if (letterId !== 0) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
for (const edge of grid.getEdges(curPos)) {
|
|
57
|
-
if ((visited.get(edge.x, edge.y) & 0b01111111) === id)
|
|
58
|
-
continue;
|
|
59
|
-
const edgeTile = grid.getTile(edge.x, edge.y);
|
|
60
|
-
if (edgeTile === BTTile.Empty) {
|
|
61
|
-
usableTileQueue.push(edge);
|
|
62
|
-
visited.set(edge.x, edge.y, id | 0b10000000);
|
|
63
|
-
}
|
|
64
|
-
else if (edgeTile === tile) {
|
|
65
|
-
sameTileQueue.push(edge);
|
|
66
|
-
visited.set(edge.x, edge.y, id);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (letterVisited === this.letters[id - 1].length)
|
|
71
|
-
return true;
|
|
72
|
-
// Count usable tile
|
|
73
|
-
while (usableTileQueue.length > 0) {
|
|
74
|
-
const curPos = usableTileQueue.pop();
|
|
75
|
-
const letterId = this.letterGrid.get(curPos.x, curPos.y);
|
|
76
|
-
if (letterId === id) {
|
|
77
|
-
letterVisited += 1;
|
|
78
|
-
if (letterVisited === this.letters[id - 1].length)
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
for (const edge of grid.getEdges(curPos)) {
|
|
82
|
-
if ((visited.get(edge.x, edge.y) & 0b01111111) === id)
|
|
83
|
-
continue;
|
|
84
|
-
const edgeTile = grid.getTile(edge.x, edge.y);
|
|
85
|
-
if (edgeTile === BTTile.Empty || edgeTile === tile) {
|
|
86
|
-
usableTileQueue.push(edge);
|
|
87
|
-
visited.set(edge.x, edge.y, id | 0b10000000);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return letterVisited === this.letters[id - 1].length;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Position } from '../../../primitives.js';
|
|
2
|
-
import LotusSymbol from '../../../symbols/lotusSymbol.js';
|
|
3
|
-
import { BTGridData, CheckResult } from '../data.js';
|
|
4
|
-
import DirectionLinkerBTModule from './directionLinker.js';
|
|
5
|
-
export default class LotusBTModule extends DirectionLinkerBTModule {
|
|
6
|
-
instr: LotusSymbol;
|
|
7
|
-
constructor(instr: LotusSymbol);
|
|
8
|
-
protected movePos(grid: BTGridData, x: number, y: number): Position | null;
|
|
9
|
-
private getTileSafe;
|
|
10
|
-
checkGlobal(grid: BTGridData): false | CheckResult;
|
|
11
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Orientation } from '../../../primitives.js';
|
|
2
|
-
import { BTTile } from '../data.js';
|
|
3
|
-
import DirectionLinkerBTModule from './directionLinker.js';
|
|
4
|
-
export default class LotusBTModule extends DirectionLinkerBTModule {
|
|
5
|
-
instr;
|
|
6
|
-
constructor(instr) {
|
|
7
|
-
super(instr);
|
|
8
|
-
this.instr = instr;
|
|
9
|
-
}
|
|
10
|
-
// Translate a position in relative to a lotus symbol
|
|
11
|
-
movePos(grid, x, y) {
|
|
12
|
-
const symbol = this.instr;
|
|
13
|
-
let pos;
|
|
14
|
-
if (symbol.orientation === Orientation.Up ||
|
|
15
|
-
symbol.orientation === Orientation.Down) {
|
|
16
|
-
pos = { x: 2 * symbol.x - x, y };
|
|
17
|
-
}
|
|
18
|
-
else if (symbol.orientation === Orientation.UpRight ||
|
|
19
|
-
symbol.orientation === Orientation.DownLeft) {
|
|
20
|
-
pos = { x: symbol.y + symbol.x - y, y: symbol.y + symbol.x - x };
|
|
21
|
-
}
|
|
22
|
-
else if (symbol.orientation === Orientation.Right ||
|
|
23
|
-
symbol.orientation === Orientation.Left) {
|
|
24
|
-
pos = { x, y: 2 * symbol.y - y };
|
|
25
|
-
}
|
|
26
|
-
else if (symbol.orientation === Orientation.DownRight ||
|
|
27
|
-
symbol.orientation === Orientation.UpLeft) {
|
|
28
|
-
pos = { x: symbol.x - symbol.y + y, y: symbol.y - symbol.x + x };
|
|
29
|
-
}
|
|
30
|
-
return grid.isInBound(pos.x, pos.y) ? pos : null;
|
|
31
|
-
}
|
|
32
|
-
getTileSafe(grid, x, y) {
|
|
33
|
-
return grid.isInBound(x, y) ? grid.getTile(x, y) : BTTile.NonExist;
|
|
34
|
-
}
|
|
35
|
-
checkGlobal(grid) {
|
|
36
|
-
if (this.instr.orientation === Orientation.DownLeft ||
|
|
37
|
-
this.instr.orientation === Orientation.DownRight ||
|
|
38
|
-
this.instr.orientation === Orientation.UpLeft ||
|
|
39
|
-
this.instr.orientation === Orientation.UpRight) {
|
|
40
|
-
if (this.instr.x % 1 === 0 || this.instr.y % 1 === 0)
|
|
41
|
-
if (this.instr.x % 1 !== 0 || this.instr.y % 1 !== 0) {
|
|
42
|
-
if (this.getTileSafe(grid, Math.floor(this.instr.x), Math.floor(this.instr.y)) === BTTile.NonExist &&
|
|
43
|
-
this.getTileSafe(grid, Math.ceil(this.instr.x), Math.ceil(this.instr.y)) === BTTile.NonExist &&
|
|
44
|
-
this.getTileSafe(grid, Math.floor(this.instr.x), Math.ceil(this.instr.y)) === BTTile.NonExist &&
|
|
45
|
-
this.getTileSafe(grid, Math.ceil(this.instr.x), Math.floor(this.instr.y)) === BTTile.NonExist) {
|
|
46
|
-
return { tilesNeedCheck: null, ratings: null };
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return super.checkGlobal(grid);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import MinesweeperSymbol from '../../../symbols/minesweeperSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class MinesweeperBTModule extends BTModule {
|
|
4
|
-
instr: MinesweeperSymbol;
|
|
5
|
-
private cachedCheckResult?;
|
|
6
|
-
constructor(instr: MinesweeperSymbol);
|
|
7
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
8
|
-
private buildCheckAndRating;
|
|
9
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import BTModule, { BTTile, IntArray2D, createOneTileResult, getOppositeColor, } from '../data.js';
|
|
2
|
-
export default class MinesweeperBTModule extends BTModule {
|
|
3
|
-
instr;
|
|
4
|
-
cachedCheckResult;
|
|
5
|
-
constructor(instr) {
|
|
6
|
-
super();
|
|
7
|
-
this.instr = instr;
|
|
8
|
-
}
|
|
9
|
-
checkGlobal(grid) {
|
|
10
|
-
const tile = grid.getTile(this.instr.x, this.instr.y);
|
|
11
|
-
if (tile === BTTile.Empty)
|
|
12
|
-
return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y });
|
|
13
|
-
let gray = 0;
|
|
14
|
-
let opposite = 0;
|
|
15
|
-
for (let y = this.instr.y - 1; y <= this.instr.y + 1; y++) {
|
|
16
|
-
for (let x = this.instr.x - 1; x <= this.instr.x + 1; x++) {
|
|
17
|
-
if (!grid.isInBound(x, y) || (x === this.instr.x && y === this.instr.y))
|
|
18
|
-
continue;
|
|
19
|
-
const checkTile = grid.getTile(x, y);
|
|
20
|
-
if (checkTile === BTTile.Empty)
|
|
21
|
-
gray++;
|
|
22
|
-
else if (checkTile === getOppositeColor(tile))
|
|
23
|
-
opposite++;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
if (opposite > this.instr.number || opposite + gray < this.instr.number)
|
|
27
|
-
return false;
|
|
28
|
-
this.cachedCheckResult ??= this.buildCheckAndRating(grid);
|
|
29
|
-
return this.cachedCheckResult;
|
|
30
|
-
}
|
|
31
|
-
buildCheckAndRating(grid) {
|
|
32
|
-
const tilesNeedCheck = IntArray2D.create(grid.width, grid.height);
|
|
33
|
-
const ratings = [];
|
|
34
|
-
for (let y = this.instr.y - 1; y <= this.instr.y + 1; y++) {
|
|
35
|
-
for (let x = this.instr.x - 1; x <= this.instr.x + 1; x++) {
|
|
36
|
-
if (!grid.isInBound(x, y) || (x === this.instr.x && y === this.instr.y))
|
|
37
|
-
continue;
|
|
38
|
-
tilesNeedCheck.set(x, y, 1);
|
|
39
|
-
ratings.push({ pos: { x, y }, score: 1 });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return { tilesNeedCheck, ratings };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import MyopiaSymbol from '../../../symbols/myopiaSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class MyopiaBTModule extends BTModule {
|
|
4
|
-
instr: MyopiaSymbol;
|
|
5
|
-
constructor(instr: MyopiaSymbol);
|
|
6
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
7
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { move } from '../../../dataHelper.js';
|
|
2
|
-
import { ORIENTATIONS, Orientation } from '../../../primitives.js';
|
|
3
|
-
import BTModule, { BTTile, createOneTileResult, getOppositeColor, } from '../data.js';
|
|
4
|
-
export default class MyopiaBTModule extends BTModule {
|
|
5
|
-
instr;
|
|
6
|
-
constructor(instr) {
|
|
7
|
-
super();
|
|
8
|
-
this.instr = instr;
|
|
9
|
-
}
|
|
10
|
-
checkGlobal(grid) {
|
|
11
|
-
// TODO: Optimize myopia symbol
|
|
12
|
-
// TODO: What to do if a non-existence tile is in front?
|
|
13
|
-
const tile = grid.getTile(this.instr.x, this.instr.y);
|
|
14
|
-
if (tile === BTTile.Empty)
|
|
15
|
-
return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y });
|
|
16
|
-
const traverse = (dir) => {
|
|
17
|
-
let min = 0;
|
|
18
|
-
let max = 0;
|
|
19
|
-
let connected = true;
|
|
20
|
-
let stopped = false;
|
|
21
|
-
let pos = move(this.instr, dir);
|
|
22
|
-
while (grid.isInBound(pos.x, pos.y)) {
|
|
23
|
-
const curTile = grid.getTile(pos.x, pos.y);
|
|
24
|
-
if (connected) {
|
|
25
|
-
if (tile === curTile || curTile === BTTile.NonExist) {
|
|
26
|
-
min += 1;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
connected = false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (getOppositeColor(tile) === curTile) {
|
|
33
|
-
stopped = true;
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
max += 1;
|
|
37
|
-
pos = move(pos, dir);
|
|
38
|
-
}
|
|
39
|
-
return [min, stopped ? max : Number.MAX_SAFE_INTEGER, connected];
|
|
40
|
-
};
|
|
41
|
-
const allDirections = this.instr.diagonals
|
|
42
|
-
? ORIENTATIONS
|
|
43
|
-
: [Orientation.Up, Orientation.Down, Orientation.Left, Orientation.Right];
|
|
44
|
-
const pointedDirections = [];
|
|
45
|
-
const otherDirections = [];
|
|
46
|
-
for (const dir of allDirections) {
|
|
47
|
-
const res = traverse(dir);
|
|
48
|
-
if (this.instr.directions[dir]) {
|
|
49
|
-
pointedDirections.push(res);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
otherDirections.push(res);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
for (let i = 0; i < pointedDirections.length; i++) {
|
|
56
|
-
const direction1 = pointedDirections[i];
|
|
57
|
-
for (let j = i + 1; j < pointedDirections.length; j++) {
|
|
58
|
-
const direction2 = pointedDirections[j];
|
|
59
|
-
if (direction1[0] > direction2[1] || direction2[0] > direction1[1])
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (Math.min(...otherDirections.map(d => d[1])) <=
|
|
64
|
-
Math.max(...pointedDirections.map(d => d[0])))
|
|
65
|
-
return false;
|
|
66
|
-
if (pointedDirections.length === 0 &&
|
|
67
|
-
otherDirections.some(d => d[1] !== Number.MAX_SAFE_INTEGER))
|
|
68
|
-
return false;
|
|
69
|
-
if (pointedDirections.some(d => d[2] && d[1] === Number.MAX_SAFE_INTEGER))
|
|
70
|
-
return false;
|
|
71
|
-
return { tilesNeedCheck: null, ratings: null };
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import ViewpointSymbol from '../../../symbols/viewpointSymbol.js';
|
|
2
|
-
import BTModule, { BTGridData, CheckResult } from '../data.js';
|
|
3
|
-
export default class ViewpointBTModule extends BTModule {
|
|
4
|
-
instr: ViewpointSymbol;
|
|
5
|
-
constructor(instr: ViewpointSymbol);
|
|
6
|
-
checkGlobal(grid: BTGridData): CheckResult | false;
|
|
7
|
-
}
|