@logic-pad/core 0.26.1 → 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.
Files changed (241) hide show
  1. package/README.md +31 -31
  2. package/assets/logic-core.global.d.ts +3264 -3262
  3. package/package.json +4 -1
  4. package/dist/benchmark/helper.d.ts +0 -21
  5. package/dist/benchmark/helper.js +0 -34
  6. package/dist/benchmark/prepareBench.d.ts +0 -1
  7. package/dist/benchmark/prepareBench.js +0 -140
  8. package/dist/benchmark/runBench.d.ts +0 -1
  9. package/dist/benchmark/runBench.js +0 -206
  10. package/dist/src/data/config.d.ts +0 -119
  11. package/dist/src/data/config.js +0 -72
  12. package/dist/src/data/configurable.d.ts +0 -14
  13. package/dist/src/data/configurable.js +0 -26
  14. package/dist/src/data/dataHelper.d.ts +0 -92
  15. package/dist/src/data/dataHelper.js +0 -217
  16. package/dist/src/data/events/eventHelper.d.ts +0 -1
  17. package/dist/src/data/events/eventHelper.js +0 -6
  18. package/dist/src/data/events/onFinalValidation.d.ts +0 -14
  19. package/dist/src/data/events/onFinalValidation.js +0 -4
  20. package/dist/src/data/events/onGetTile.d.ts +0 -7
  21. package/dist/src/data/events/onGetTile.js +0 -4
  22. package/dist/src/data/events/onGridChange.d.ts +0 -6
  23. package/dist/src/data/events/onGridChange.js +0 -4
  24. package/dist/src/data/events/onGridResize.d.ts +0 -9
  25. package/dist/src/data/events/onGridResize.js +0 -4
  26. package/dist/src/data/events/onSetGrid.d.ts +0 -7
  27. package/dist/src/data/events/onSetGrid.js +0 -19
  28. package/dist/src/data/events/onSymbolDisplay.d.ts +0 -16
  29. package/dist/src/data/events/onSymbolDisplay.js +0 -4
  30. package/dist/src/data/events/onSymbolMerge.d.ts +0 -10
  31. package/dist/src/data/events/onSymbolMerge.js +0 -4
  32. package/dist/src/data/events/onSymbolValidation.d.ts +0 -18
  33. package/dist/src/data/events/onSymbolValidation.js +0 -4
  34. package/dist/src/data/grid.d.ts +0 -410
  35. package/dist/src/data/grid.js +0 -1106
  36. package/dist/src/data/gridConnections.d.ts +0 -25
  37. package/dist/src/data/gridConnections.js +0 -309
  38. package/dist/src/data/gridZones.d.ts +0 -26
  39. package/dist/src/data/gridZones.js +0 -117
  40. package/dist/src/data/instruction.d.ts +0 -26
  41. package/dist/src/data/instruction.js +0 -29
  42. package/dist/src/data/primitives.d.ts +0 -138
  43. package/dist/src/data/primitives.js +0 -177
  44. package/dist/src/data/puzzle.d.ts +0 -73
  45. package/dist/src/data/puzzle.js +0 -105
  46. package/dist/src/data/rules/banPatternRule.d.ts +0 -30
  47. package/dist/src/data/rules/banPatternRule.js +0 -125
  48. package/dist/src/data/rules/cellCountPerZoneRule.d.ts +0 -23
  49. package/dist/src/data/rules/cellCountPerZoneRule.js +0 -39
  50. package/dist/src/data/rules/cellCountRule.d.ts +0 -33
  51. package/dist/src/data/rules/cellCountRule.js +0 -138
  52. package/dist/src/data/rules/completePatternRule.d.ts +0 -24
  53. package/dist/src/data/rules/completePatternRule.js +0 -46
  54. package/dist/src/data/rules/connectAllRule.d.ts +0 -29
  55. package/dist/src/data/rules/connectAllRule.js +0 -88
  56. package/dist/src/data/rules/connectZonesRule.d.ts +0 -29
  57. package/dist/src/data/rules/connectZonesRule.js +0 -111
  58. package/dist/src/data/rules/containsShapeRule.d.ts +0 -34
  59. package/dist/src/data/rules/containsShapeRule.js +0 -125
  60. package/dist/src/data/rules/customRule.d.ts +0 -34
  61. package/dist/src/data/rules/customRule.js +0 -74
  62. package/dist/src/data/rules/differentCountPerZoneRule.d.ts +0 -30
  63. package/dist/src/data/rules/differentCountPerZoneRule.js +0 -96
  64. package/dist/src/data/rules/exactCountPerZoneRule.d.ts +0 -33
  65. package/dist/src/data/rules/exactCountPerZoneRule.js +0 -99
  66. package/dist/src/data/rules/foresightRule.d.ts +0 -36
  67. package/dist/src/data/rules/foresightRule.js +0 -107
  68. package/dist/src/data/rules/index.d.ts +0 -3
  69. package/dist/src/data/rules/index.js +0 -10
  70. package/dist/src/data/rules/lyingSymbolRule.d.ts +0 -31
  71. package/dist/src/data/rules/lyingSymbolRule.js +0 -207
  72. package/dist/src/data/rules/musicControlLine.d.ts +0 -82
  73. package/dist/src/data/rules/musicControlLine.js +0 -167
  74. package/dist/src/data/rules/musicGridRule.d.ts +0 -51
  75. package/dist/src/data/rules/musicGridRule.js +0 -212
  76. package/dist/src/data/rules/mysteryRule.d.ts +0 -39
  77. package/dist/src/data/rules/mysteryRule.js +0 -146
  78. package/dist/src/data/rules/noLoopsRule.d.ts +0 -29
  79. package/dist/src/data/rules/noLoopsRule.js +0 -218
  80. package/dist/src/data/rules/offByXRule.d.ts +0 -32
  81. package/dist/src/data/rules/offByXRule.js +0 -124
  82. package/dist/src/data/rules/perfectionRule.d.ts +0 -45
  83. package/dist/src/data/rules/perfectionRule.js +0 -158
  84. package/dist/src/data/rules/regionAreaRule.d.ts +0 -34
  85. package/dist/src/data/rules/regionAreaRule.js +0 -149
  86. package/dist/src/data/rules/regionShapeRule.d.ts +0 -22
  87. package/dist/src/data/rules/regionShapeRule.js +0 -58
  88. package/dist/src/data/rules/rule.d.ts +0 -18
  89. package/dist/src/data/rules/rule.js +0 -19
  90. package/dist/src/data/rules/rules.gen.d.ts +0 -23
  91. package/dist/src/data/rules/rules.gen.js +0 -27
  92. package/dist/src/data/rules/sameCountPerZoneRule.d.ts +0 -30
  93. package/dist/src/data/rules/sameCountPerZoneRule.js +0 -95
  94. package/dist/src/data/rules/sameShapeRule.d.ts +0 -28
  95. package/dist/src/data/rules/sameShapeRule.js +0 -68
  96. package/dist/src/data/rules/symbolsPerRegionRule.d.ts +0 -38
  97. package/dist/src/data/rules/symbolsPerRegionRule.js +0 -181
  98. package/dist/src/data/rules/undercluedRule.d.ts +0 -24
  99. package/dist/src/data/rules/undercluedRule.js +0 -53
  100. package/dist/src/data/rules/uniqueShapeRule.d.ts +0 -28
  101. package/dist/src/data/rules/uniqueShapeRule.js +0 -65
  102. package/dist/src/data/rules/wrapAroundRule.d.ts +0 -36
  103. package/dist/src/data/rules/wrapAroundRule.js +0 -241
  104. package/dist/src/data/serializer/allSerializers.d.ts +0 -32
  105. package/dist/src/data/serializer/allSerializers.js +0 -71
  106. package/dist/src/data/serializer/compressor/allCompressors.d.ts +0 -14
  107. package/dist/src/data/serializer/compressor/allCompressors.js +0 -43
  108. package/dist/src/data/serializer/compressor/checksumCompressor.d.ts +0 -6
  109. package/dist/src/data/serializer/compressor/checksumCompressor.js +0 -21
  110. package/dist/src/data/serializer/compressor/compressorBase.d.ts +0 -16
  111. package/dist/src/data/serializer/compressor/compressorBase.js +0 -2
  112. package/dist/src/data/serializer/compressor/deflateCompressor.d.ts +0 -7
  113. package/dist/src/data/serializer/compressor/deflateCompressor.js +0 -17
  114. package/dist/src/data/serializer/compressor/gzipCompressor.d.ts +0 -5
  115. package/dist/src/data/serializer/compressor/gzipCompressor.js +0 -9
  116. package/dist/src/data/serializer/compressor/streamCompressor.d.ts +0 -6
  117. package/dist/src/data/serializer/compressor/streamCompressor.js +0 -41
  118. package/dist/src/data/serializer/serializerBase.d.ts +0 -32
  119. package/dist/src/data/serializer/serializerBase.js +0 -2
  120. package/dist/src/data/serializer/serializer_checksum.d.ts +0 -35
  121. package/dist/src/data/serializer/serializer_checksum.js +0 -179
  122. package/dist/src/data/serializer/serializer_v0.d.ts +0 -55
  123. package/dist/src/data/serializer/serializer_v0.js +0 -484
  124. package/dist/src/data/shapes.d.ts +0 -19
  125. package/dist/src/data/shapes.js +0 -137
  126. package/dist/src/data/solver/allSolvers.d.ts +0 -3
  127. package/dist/src/data/solver/allSolvers.js +0 -13
  128. package/dist/src/data/solver/auto/autoSolver.d.ts +0 -18
  129. package/dist/src/data/solver/auto/autoSolver.js +0 -156
  130. package/dist/src/data/solver/backtrack/backtrackSolver.d.ts +0 -11
  131. package/dist/src/data/solver/backtrack/backtrackSolver.js +0 -54
  132. package/dist/src/data/solver/backtrack/backtrackWorker.d.ts +0 -1
  133. package/dist/src/data/solver/backtrack/backtrackWorker.js +0 -312
  134. package/dist/src/data/solver/backtrack/data.d.ts +0 -47
  135. package/dist/src/data/solver/backtrack/data.js +0 -151
  136. package/dist/src/data/solver/backtrack/rules/banPattern.d.ts +0 -9
  137. package/dist/src/data/solver/backtrack/rules/banPattern.js +0 -77
  138. package/dist/src/data/solver/backtrack/rules/cellCount.d.ts +0 -7
  139. package/dist/src/data/solver/backtrack/rules/cellCount.js +0 -25
  140. package/dist/src/data/solver/backtrack/rules/connectAll.d.ts +0 -7
  141. package/dist/src/data/solver/backtrack/rules/connectAll.js +0 -44
  142. package/dist/src/data/solver/backtrack/rules/regionArea.d.ts +0 -8
  143. package/dist/src/data/solver/backtrack/rules/regionArea.js +0 -71
  144. package/dist/src/data/solver/backtrack/rules/regionShape.d.ts +0 -8
  145. package/dist/src/data/solver/backtrack/rules/regionShape.js +0 -57
  146. package/dist/src/data/solver/backtrack/rules/sameShape.d.ts +0 -8
  147. package/dist/src/data/solver/backtrack/rules/sameShape.js +0 -14
  148. package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.d.ts +0 -10
  149. package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.js +0 -82
  150. package/dist/src/data/solver/backtrack/rules/uniqueShape.d.ts +0 -8
  151. package/dist/src/data/solver/backtrack/rules/uniqueShape.js +0 -14
  152. package/dist/src/data/solver/backtrack/symbols/areaNumber.d.ts +0 -9
  153. package/dist/src/data/solver/backtrack/symbols/areaNumber.js +0 -75
  154. package/dist/src/data/solver/backtrack/symbols/dart.d.ts +0 -8
  155. package/dist/src/data/solver/backtrack/symbols/dart.js +0 -45
  156. package/dist/src/data/solver/backtrack/symbols/directionLinker.d.ts +0 -11
  157. package/dist/src/data/solver/backtrack/symbols/directionLinker.js +0 -121
  158. package/dist/src/data/solver/backtrack/symbols/focus.d.ts +0 -9
  159. package/dist/src/data/solver/backtrack/symbols/focus.js +0 -48
  160. package/dist/src/data/solver/backtrack/symbols/galaxy.d.ts +0 -9
  161. package/dist/src/data/solver/backtrack/symbols/galaxy.js +0 -14
  162. package/dist/src/data/solver/backtrack/symbols/letter.d.ts +0 -9
  163. package/dist/src/data/solver/backtrack/symbols/letter.js +0 -95
  164. package/dist/src/data/solver/backtrack/symbols/lotus.d.ts +0 -11
  165. package/dist/src/data/solver/backtrack/symbols/lotus.js +0 -55
  166. package/dist/src/data/solver/backtrack/symbols/minesweeper.d.ts +0 -9
  167. package/dist/src/data/solver/backtrack/symbols/minesweeper.js +0 -44
  168. package/dist/src/data/solver/backtrack/symbols/myopia.d.ts +0 -7
  169. package/dist/src/data/solver/backtrack/symbols/myopia.js +0 -73
  170. package/dist/src/data/solver/backtrack/symbols/viewpoint.d.ts +0 -7
  171. package/dist/src/data/solver/backtrack/symbols/viewpoint.js +0 -51
  172. package/dist/src/data/solver/cspuz/cspuzSolver.d.ts +0 -13
  173. package/dist/src/data/solver/cspuz/cspuzSolver.js +0 -124
  174. package/dist/src/data/solver/cspuz/cspuzWorker.d.ts +0 -1
  175. package/dist/src/data/solver/cspuz/cspuzWorker.js +0 -82
  176. package/dist/src/data/solver/cspuz/jsonify.d.ts +0 -3
  177. package/dist/src/data/solver/cspuz/jsonify.js +0 -215
  178. package/dist/src/data/solver/eventIteratingSolver.d.ts +0 -8
  179. package/dist/src/data/solver/eventIteratingSolver.js +0 -54
  180. package/dist/src/data/solver/solver.d.ts +0 -77
  181. package/dist/src/data/solver/solver.js +0 -59
  182. package/dist/src/data/solver/universal/universalSolver.d.ts +0 -7
  183. package/dist/src/data/solver/universal/universalSolver.js +0 -13
  184. package/dist/src/data/solver/universal/universalWorker.d.ts +0 -1
  185. package/dist/src/data/solver/universal/universalWorker.js +0 -128
  186. package/dist/src/data/symbols/areaNumberSymbol.d.ts +0 -31
  187. package/dist/src/data/symbols/areaNumberSymbol.js +0 -80
  188. package/dist/src/data/symbols/customIconSymbol.d.ts +0 -35
  189. package/dist/src/data/symbols/customIconSymbol.js +0 -94
  190. package/dist/src/data/symbols/customSymbol.d.ts +0 -25
  191. package/dist/src/data/symbols/customSymbol.js +0 -45
  192. package/dist/src/data/symbols/customTextSymbol.d.ts +0 -35
  193. package/dist/src/data/symbols/customTextSymbol.js +0 -95
  194. package/dist/src/data/symbols/dartSymbol.d.ts +0 -36
  195. package/dist/src/data/symbols/dartSymbol.js +0 -96
  196. package/dist/src/data/symbols/directionLinkerSymbol.d.ts +0 -29
  197. package/dist/src/data/symbols/directionLinkerSymbol.js +0 -232
  198. package/dist/src/data/symbols/everyLetterSymbol.d.ts +0 -32
  199. package/dist/src/data/symbols/everyLetterSymbol.js +0 -119
  200. package/dist/src/data/symbols/focusSymbol.d.ts +0 -40
  201. package/dist/src/data/symbols/focusSymbol.js +0 -159
  202. package/dist/src/data/symbols/galaxySymbol.d.ts +0 -27
  203. package/dist/src/data/symbols/galaxySymbol.js +0 -61
  204. package/dist/src/data/symbols/hiddenSymbol.d.ts +0 -38
  205. package/dist/src/data/symbols/hiddenSymbol.js +0 -113
  206. package/dist/src/data/symbols/houseSymbol.d.ts +0 -33
  207. package/dist/src/data/symbols/houseSymbol.js +0 -104
  208. package/dist/src/data/symbols/index.d.ts +0 -3
  209. package/dist/src/data/symbols/index.js +0 -10
  210. package/dist/src/data/symbols/letterSymbol.d.ts +0 -32
  211. package/dist/src/data/symbols/letterSymbol.js +0 -118
  212. package/dist/src/data/symbols/lotusSymbol.d.ts +0 -30
  213. package/dist/src/data/symbols/lotusSymbol.js +0 -132
  214. package/dist/src/data/symbols/minesweeperSymbol.d.ts +0 -33
  215. package/dist/src/data/symbols/minesweeperSymbol.js +0 -106
  216. package/dist/src/data/symbols/myopiaSymbol.d.ts +0 -37
  217. package/dist/src/data/symbols/myopiaSymbol.js +0 -182
  218. package/dist/src/data/symbols/numberSymbol.d.ts +0 -19
  219. package/dist/src/data/symbols/numberSymbol.js +0 -32
  220. package/dist/src/data/symbols/symbol.d.ts +0 -29
  221. package/dist/src/data/symbols/symbol.js +0 -87
  222. package/dist/src/data/symbols/symbols.gen.d.ts +0 -15
  223. package/dist/src/data/symbols/symbols.gen.js +0 -19
  224. package/dist/src/data/symbols/unsupportedSymbol.d.ts +0 -23
  225. package/dist/src/data/symbols/unsupportedSymbol.js +0 -47
  226. package/dist/src/data/symbols/viewpointSymbol.d.ts +0 -32
  227. package/dist/src/data/symbols/viewpointSymbol.js +0 -95
  228. package/dist/src/data/tile.d.ts +0 -26
  229. package/dist/src/data/tile.js +0 -56
  230. package/dist/src/data/tileConnections.d.ts +0 -25
  231. package/dist/src/data/tileConnections.js +0 -74
  232. package/dist/src/data/validate.d.ts +0 -5
  233. package/dist/src/data/validate.js +0 -131
  234. package/dist/src/data/validateAsync.d.ts +0 -15
  235. package/dist/src/data/validateAsync.js +0 -71
  236. package/dist/src/data/validateAsyncWorker.d.ts +0 -1
  237. package/dist/src/data/validateAsyncWorker.js +0 -9
  238. package/dist/src/index.d.ts +0 -109
  239. package/dist/src/index.js +0 -112
  240. package/dist/src/polyfill/streamPolyfill.d.ts +0 -2
  241. 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,95 +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
- }
30
- for (const symbol of this.letters[id]) {
31
- const symbolX = Math.floor(symbol.x);
32
- const symbolY = Math.floor(symbol.y);
33
- if (grid.getTile(symbolX, symbolY) === BTTile.Empty)
34
- continue;
35
- if (!this.visitArea(grid, visited, { x: symbolX, y: symbolY }, id + 1))
36
- return false;
37
- break;
38
- }
39
- }
40
- return { tilesNeedCheck: null, ratings: null };
41
- }
42
- visitArea(grid, visited, pos, id) {
43
- const tile = grid.getTile(pos.x, pos.y);
44
- const sameTileQueue = [pos];
45
- const usableTileQueue = [];
46
- let letterVisited = 0;
47
- visited.set(pos.x, pos.y, id);
48
- // Count same tile
49
- while (sameTileQueue.length > 0) {
50
- const curPos = sameTileQueue.pop();
51
- const letterId = this.letterGrid.get(curPos.x, curPos.y);
52
- if (letterId === id) {
53
- letterVisited += 1;
54
- }
55
- else if (letterId !== 0) {
56
- return false;
57
- }
58
- for (const edge of grid.getEdges(curPos)) {
59
- if ((visited.get(edge.x, edge.y) & 0b01111111) === id)
60
- continue;
61
- const edgeTile = grid.getTile(edge.x, edge.y);
62
- if (edgeTile === BTTile.Empty) {
63
- usableTileQueue.push(edge);
64
- visited.set(edge.x, edge.y, id | 0b10000000);
65
- }
66
- else if (edgeTile === tile) {
67
- sameTileQueue.push(edge);
68
- visited.set(edge.x, edge.y, id);
69
- }
70
- }
71
- }
72
- if (letterVisited === this.letters[id - 1].length)
73
- return true;
74
- // Count usable tile
75
- while (usableTileQueue.length > 0) {
76
- const curPos = usableTileQueue.pop();
77
- const letterId = this.letterGrid.get(curPos.x, curPos.y);
78
- if (letterId === id) {
79
- letterVisited += 1;
80
- if (letterVisited === this.letters[id - 1].length)
81
- return true;
82
- }
83
- for (const edge of grid.getEdges(curPos)) {
84
- if ((visited.get(edge.x, edge.y) & 0b01111111) === id)
85
- continue;
86
- const edgeTile = grid.getTile(edge.x, edge.y);
87
- if (edgeTile === BTTile.Empty || edgeTile === tile) {
88
- usableTileQueue.push(edge);
89
- visited.set(edge.x, edge.y, id | 0b10000000);
90
- }
91
- }
92
- }
93
- return letterVisited === this.letters[id - 1].length;
94
- }
95
- }
@@ -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
- }