@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.
Files changed (239) hide show
  1. package/README.md +31 -31
  2. package/assets/logic-core.global.d.ts +3264 -3247
  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 -153
  130. package/dist/src/data/solver/backtrack/backtrackSolver.d.ts +0 -11
  131. package/dist/src/data/solver/backtrack/backtrackSolver.js +0 -52
  132. package/dist/src/data/solver/backtrack/backtrackWorker.d.ts +0 -1
  133. package/dist/src/data/solver/backtrack/backtrackWorker.js +0 -308
  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 -93
  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 -117
  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 -211
  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 -14
  223. package/dist/src/data/symbols/symbols.gen.js +0 -18
  224. package/dist/src/data/symbols/viewpointSymbol.d.ts +0 -32
  225. package/dist/src/data/symbols/viewpointSymbol.js +0 -95
  226. package/dist/src/data/tile.d.ts +0 -26
  227. package/dist/src/data/tile.js +0 -56
  228. package/dist/src/data/tileConnections.d.ts +0 -25
  229. package/dist/src/data/tileConnections.js +0 -74
  230. package/dist/src/data/validate.d.ts +0 -5
  231. package/dist/src/data/validate.js +0 -131
  232. package/dist/src/data/validateAsync.d.ts +0 -15
  233. package/dist/src/data/validateAsync.js +0 -71
  234. package/dist/src/data/validateAsyncWorker.d.ts +0 -1
  235. package/dist/src/data/validateAsyncWorker.js +0 -9
  236. package/dist/src/index.d.ts +0 -108
  237. package/dist/src/index.js +0 -111
  238. package/dist/src/polyfill/streamPolyfill.d.ts +0 -2
  239. package/dist/src/polyfill/streamPolyfill.js +0 -1
@@ -1,30 +0,0 @@
1
- import { AnyConfig } from '../config.js';
2
- import GridData from '../grid.js';
3
- import { Color, RuleState } from '../primitives.js';
4
- import CellCountPerZoneRule from './cellCountPerZoneRule.js';
5
- import { SearchVariant } from './rule.js';
6
- export default class SameCountPerZoneRule extends CellCountPerZoneRule {
7
- readonly color: Color;
8
- readonly title = "Equal Count Per Zone";
9
- private static readonly CONFIGS;
10
- private static readonly EXAMPLE_GRID_LIGHT;
11
- private static readonly EXAMPLE_GRID_DARK;
12
- private static readonly EXAMPLE_GRID_GRAY;
13
- private static readonly SEARCH_VARIANTS;
14
- /**
15
- * **Zones of the same size have the same number of <color> cells.**
16
- *
17
- * @param color - The color of the cells to count.
18
- */
19
- constructor(color: Color);
20
- get id(): string;
21
- get explanation(): string;
22
- get configs(): readonly AnyConfig[] | null;
23
- createExampleGrid(): GridData;
24
- get searchVariants(): SearchVariant[];
25
- validateGrid(grid: GridData): RuleState;
26
- copyWith({ color }: {
27
- color?: Color;
28
- }): this;
29
- }
30
- export declare const instance: SameCountPerZoneRule;
@@ -1,95 +0,0 @@
1
- import { ConfigType } from '../config.js';
2
- import GridData from '../grid.js';
3
- import GridZones from '../gridZones.js';
4
- import { Color, State } from '../primitives.js';
5
- import CellCountPerZoneRule from './cellCountPerZoneRule.js';
6
- export default class SameCountPerZoneRule extends CellCountPerZoneRule {
7
- color;
8
- title = 'Equal Count Per Zone';
9
- static CONFIGS = Object.freeze([
10
- {
11
- type: ConfigType.Color,
12
- default: Color.Light,
13
- allowGray: true,
14
- field: 'color',
15
- description: 'Color',
16
- configurable: true,
17
- },
18
- ]);
19
- static EXAMPLE_GRID_LIGHT = Object.freeze(GridData.create(['bwbbb', 'wbbwb', 'bbbwb', 'bwbwb'])
20
- .withZones(new GridZones([
21
- { x1: 0, y1: 1, x2: 0, y2: 2 },
22
- { x1: 1, y1: 1, x2: 1, y2: 2 },
23
- { x1: 2, y1: 1, x2: 2, y2: 2 },
24
- { x1: 3, y1: 1, x2: 3, y2: 2 },
25
- { x1: 4, y1: 1, x2: 4, y2: 2 },
26
- { x1: 1, y1: 0, x2: 2, y2: 0 },
27
- { x1: 1, y1: 1, x2: 2, y2: 1 },
28
- { x1: 2, y1: 2, x2: 3, y2: 2 },
29
- { x1: 2, y1: 3, x2: 3, y2: 3 },
30
- ]))
31
- .addRule(new SameCountPerZoneRule(Color.Light)));
32
- static EXAMPLE_GRID_DARK = Object.freeze(SameCountPerZoneRule.EXAMPLE_GRID_LIGHT.withTiles(tiles => tiles.map(row => row.map(tile => tile.withColor(tile.color === Color.Dark ? Color.Light : Color.Dark)))));
33
- static EXAMPLE_GRID_GRAY = Object.freeze(SameCountPerZoneRule.EXAMPLE_GRID_LIGHT.withTiles(tiles => tiles.map(row => row.map(tile => tile.withColor(tile.color === Color.Light ? Color.Gray : tile.color)))));
34
- static SEARCH_VARIANTS = [
35
- new SameCountPerZoneRule(Color.Light).searchVariant(),
36
- new SameCountPerZoneRule(Color.Dark).searchVariant(),
37
- ];
38
- /**
39
- * **Zones of the same size have the same number of <color> cells.**
40
- *
41
- * @param color - The color of the cells to count.
42
- */
43
- constructor(color) {
44
- super(color);
45
- this.color = color;
46
- }
47
- get id() {
48
- return `zone_cell_count`;
49
- }
50
- get explanation() {
51
- return `Zones of the same size have the same number of ${this.color} cells`;
52
- }
53
- get configs() {
54
- return SameCountPerZoneRule.CONFIGS;
55
- }
56
- createExampleGrid() {
57
- if (this.color === Color.Light) {
58
- return SameCountPerZoneRule.EXAMPLE_GRID_LIGHT;
59
- }
60
- else if (this.color === Color.Dark) {
61
- return SameCountPerZoneRule.EXAMPLE_GRID_DARK;
62
- }
63
- else {
64
- return SameCountPerZoneRule.EXAMPLE_GRID_GRAY;
65
- }
66
- }
67
- get searchVariants() {
68
- return SameCountPerZoneRule.SEARCH_VARIANTS;
69
- }
70
- validateGrid(grid) {
71
- const { zones, complete } = this.getZoneCounts(grid);
72
- if (zones.length <= 1) {
73
- return { state: complete ? State.Satisfied : State.Incomplete };
74
- }
75
- else {
76
- const errorZone = zones.find(z => zones.some(zz => zz !== z &&
77
- zz.positions.length === z.positions.length &&
78
- (zz.completed > z.completed + z.possible ||
79
- zz.completed + zz.possible < z.completed)));
80
- if (errorZone) {
81
- return {
82
- state: State.Error,
83
- positions: errorZone.positions,
84
- };
85
- }
86
- else {
87
- return { state: complete ? State.Satisfied : State.Incomplete };
88
- }
89
- }
90
- }
91
- copyWith({ color }) {
92
- return new SameCountPerZoneRule(color ?? this.color);
93
- }
94
- }
95
- export const instance = new SameCountPerZoneRule(Color.Light);
@@ -1,28 +0,0 @@
1
- import { AnyConfig } from '../config.js';
2
- import GridData from '../grid.js';
3
- import { Color, RuleState } from '../primitives.js';
4
- import RegionShapeRule from './regionShapeRule.js';
5
- import { SearchVariant } from './rule.js';
6
- export default class SameShapeRule extends RegionShapeRule {
7
- readonly title = "Same Shape Areas";
8
- private static readonly CONFIGS;
9
- private static readonly EXAMPLE_GRID_LIGHT;
10
- private static readonly EXAMPLE_GRID_DARK;
11
- private static readonly SEARCH_VARIANTS;
12
- /**
13
- * **All &lt;color&gt; areas have the same shape and size**
14
- *
15
- * @param color - The color of the regions to compare.
16
- */
17
- constructor(color: Color);
18
- get id(): string;
19
- get explanation(): string;
20
- get configs(): readonly AnyConfig[] | null;
21
- createExampleGrid(): GridData;
22
- get searchVariants(): SearchVariant[];
23
- validateGrid(grid: GridData): RuleState;
24
- copyWith({ color }: {
25
- color?: Color;
26
- }): this;
27
- }
28
- export declare const instance: SameShapeRule;
@@ -1,68 +0,0 @@
1
- import { ConfigType } from '../config.js';
2
- import GridData from '../grid.js';
3
- import { minBy } from '../dataHelper.js';
4
- import { Color, State } from '../primitives.js';
5
- import RegionShapeRule from './regionShapeRule.js';
6
- export default class SameShapeRule extends RegionShapeRule {
7
- title = 'Same Shape Areas';
8
- static CONFIGS = Object.freeze([
9
- {
10
- type: ConfigType.Color,
11
- default: Color.Light,
12
- allowGray: false,
13
- field: 'color',
14
- description: 'Color',
15
- configurable: true,
16
- },
17
- ]);
18
- static EXAMPLE_GRID_LIGHT = Object.freeze(GridData.create(['wwbww', 'wbwbw', 'wbwbw', 'bwwbb']));
19
- static EXAMPLE_GRID_DARK = Object.freeze(GridData.create(['bbwbb', 'bwbwb', 'bwbwb', 'wbbww']));
20
- static SEARCH_VARIANTS = [
21
- new SameShapeRule(Color.Light).searchVariant(),
22
- new SameShapeRule(Color.Dark).searchVariant(),
23
- ];
24
- /**
25
- * **All &lt;color&gt; areas have the same shape and size**
26
- *
27
- * @param color - The color of the regions to compare.
28
- */
29
- constructor(color) {
30
- super(color);
31
- }
32
- get id() {
33
- return `same_shape`;
34
- }
35
- get explanation() {
36
- return `All ${this.color} areas have the same shape and size`;
37
- }
38
- get configs() {
39
- return SameShapeRule.CONFIGS;
40
- }
41
- createExampleGrid() {
42
- return this.color === Color.Light
43
- ? SameShapeRule.EXAMPLE_GRID_LIGHT
44
- : SameShapeRule.EXAMPLE_GRID_DARK;
45
- }
46
- get searchVariants() {
47
- return SameShapeRule.SEARCH_VARIANTS;
48
- }
49
- validateGrid(grid) {
50
- const { regions, complete } = this.getShapeRegions(grid);
51
- if (regions.length > 1) {
52
- return {
53
- state: State.Error,
54
- positions: minBy(regions, island => island.count).positions,
55
- };
56
- }
57
- else if (regions.length <= 1) {
58
- return { state: complete ? State.Satisfied : State.Incomplete };
59
- }
60
- else {
61
- return { state: State.Incomplete }; // not reachable but the TS is not happy
62
- }
63
- }
64
- copyWith({ color }) {
65
- return new SameShapeRule(color ?? this.color);
66
- }
67
- }
68
- export const instance = new SameShapeRule(Color.Dark);
@@ -1,38 +0,0 @@
1
- import Rule, { SearchVariant } from './rule.js';
2
- import GridData from '../grid.js';
3
- import { AnyConfig } from '../config.js';
4
- import { Color, Comparison, RuleState } from '../primitives.js';
5
- export default class SymbolsPerRegionRule extends Rule {
6
- readonly color: Color;
7
- readonly count: number;
8
- readonly comparison: Comparison;
9
- readonly title = "Symbols Per Area";
10
- private static readonly SYMBOL_POSITIONS;
11
- private static readonly CONFIGS;
12
- private static readonly EXAMPLE_GRIDS;
13
- private static readonly SEARCH_VARIANTS;
14
- /**
15
- * **Exactly &lt;count&gt; symbols per &lt;color&gt; area**
16
- *
17
- * @param color - Color of the region affected by the rule
18
- * @param count - Number of symbols to have in each region
19
- * @param comparison - Comparison to use when checking the number of symbols
20
- */
21
- constructor(color: Color, count: number, comparison?: Comparison);
22
- get id(): string;
23
- get explanation(): string;
24
- get configs(): readonly AnyConfig[] | null;
25
- createExampleGrid(): GridData;
26
- get searchVariants(): SearchVariant[];
27
- validateGrid(grid: GridData): RuleState;
28
- copyWith({ count, color, comparison, }: {
29
- count?: number;
30
- color?: Color;
31
- comparison?: Comparison;
32
- }): this;
33
- withColor(color: Color): this;
34
- withCount(count: number): this;
35
- withComparison(comparison: Comparison): this;
36
- private static countAllSymbolsOfPosition;
37
- }
38
- export declare const instance: SymbolsPerRegionRule;
@@ -1,181 +0,0 @@
1
- import Rule from './rule.js';
2
- import GridData from '../grid.js';
3
- import { ConfigType } from '../config.js';
4
- import { Color, Comparison, State, } from '../primitives.js';
5
- import { array } from '../dataHelper.js';
6
- import LetterSymbol from '../symbols/letterSymbol.js';
7
- import GridConnections from '../gridConnections.js';
8
- export default class SymbolsPerRegionRule extends Rule {
9
- color;
10
- count;
11
- comparison;
12
- title = 'Symbols Per Area';
13
- static SYMBOL_POSITIONS = [
14
- { x: 1, y: 1 },
15
- { x: 2, y: 2 },
16
- { x: 2, y: 1 },
17
- { x: 3, y: 1 },
18
- { x: 1, y: 2 },
19
- ];
20
- static CONFIGS = Object.freeze([
21
- {
22
- type: ConfigType.Number,
23
- default: 1,
24
- field: 'count',
25
- description: 'Count',
26
- configurable: true,
27
- },
28
- {
29
- type: ConfigType.Color,
30
- default: Color.Light,
31
- field: 'color',
32
- description: 'Color',
33
- configurable: true,
34
- allowGray: true,
35
- },
36
- {
37
- type: ConfigType.Comparison,
38
- default: Comparison.Equal,
39
- field: 'comparison',
40
- description: 'Comparison',
41
- configurable: true,
42
- },
43
- ]);
44
- static EXAMPLE_GRIDS = {
45
- [Color.Dark]: GridData.create(['wwwww', 'wbbbw', 'wbbww', 'wwwww']),
46
- [Color.Light]: GridData.create(['bbbbb', 'bwwwb', 'bwwbb', 'bbbbb']),
47
- [Color.Gray]: GridData.create(['bwbwb', 'wnnnw', 'bnnwb', 'wbwbw']),
48
- };
49
- static SEARCH_VARIANTS = [
50
- new SymbolsPerRegionRule(Color.Light, 1).searchVariant(),
51
- new SymbolsPerRegionRule(Color.Dark, 1).searchVariant(),
52
- new SymbolsPerRegionRule(Color.Light, 1, Comparison.AtLeast).searchVariant(),
53
- new SymbolsPerRegionRule(Color.Dark, 1, Comparison.AtLeast).searchVariant(),
54
- new SymbolsPerRegionRule(Color.Light, 1, Comparison.AtMost).searchVariant(),
55
- new SymbolsPerRegionRule(Color.Dark, 1, Comparison.AtMost).searchVariant(),
56
- ];
57
- /**
58
- * **Exactly &lt;count&gt; symbols per &lt;color&gt; area**
59
- *
60
- * @param color - Color of the region affected by the rule
61
- * @param count - Number of symbols to have in each region
62
- * @param comparison - Comparison to use when checking the number of symbols
63
- */
64
- constructor(color, count, comparison = Comparison.Equal) {
65
- super();
66
- this.color = color;
67
- this.count = count;
68
- this.comparison = comparison;
69
- this.color = color;
70
- this.count = count;
71
- this.comparison = comparison;
72
- }
73
- get id() {
74
- return `symbols_per_region`;
75
- }
76
- get explanation() {
77
- switch (this.comparison) {
78
- case Comparison.AtLeast:
79
- return `At least ${this.count} symbol${this.count === 1 ? '' : 's'} per ${this.color} area`;
80
- case Comparison.AtMost:
81
- return `At most ${this.count} symbol${this.count === 1 ? '' : 's'} per ${this.color} area`;
82
- default:
83
- return `Exactly ${this.count} symbol${this.count === 1 ? '' : 's'} per ${this.color} area`;
84
- }
85
- }
86
- get configs() {
87
- return SymbolsPerRegionRule.CONFIGS;
88
- }
89
- createExampleGrid() {
90
- if (this.count > SymbolsPerRegionRule.SYMBOL_POSITIONS.length ||
91
- this.comparison !== Comparison.Equal) {
92
- let description = '';
93
- switch (this.comparison) {
94
- case Comparison.AtLeast:
95
- description = `≥${this.count}X`;
96
- break;
97
- case Comparison.AtMost:
98
- description = `≤${this.count}X`;
99
- break;
100
- default:
101
- description = `${this.count}X`;
102
- break;
103
- }
104
- const symbol = new LetterSymbol(1.5, 1.5, description);
105
- return SymbolsPerRegionRule.EXAMPLE_GRIDS[this.color]
106
- .addSymbol(symbol)
107
- .withConnections(GridConnections.create(['.....', '.aa..', '.aa..', '.....']));
108
- }
109
- const symbols = [];
110
- for (let i = 0; i < this.count; i++) {
111
- const { x, y } = SymbolsPerRegionRule.SYMBOL_POSITIONS[i];
112
- symbols.push(new LetterSymbol(x, y, 'X'));
113
- }
114
- return SymbolsPerRegionRule.EXAMPLE_GRIDS[this.color].withSymbols(symbols);
115
- }
116
- get searchVariants() {
117
- return SymbolsPerRegionRule.SEARCH_VARIANTS;
118
- }
119
- validateGrid(grid) {
120
- const visited = array(grid.width, grid.height, (i, j) => !(grid.getTile(i, j).exists && grid.getTile(i, j).color === this.color));
121
- let complete = true;
122
- while (true) {
123
- const seed = grid.find((_tile, x, y) => !visited[y][x]);
124
- if (!seed)
125
- break;
126
- const completed = [];
127
- const gray = [];
128
- let nbSymbolsIn = 0;
129
- grid.iterateArea({ x: seed.x, y: seed.y }, tile => tile.color === this.color, (_, x, y) => {
130
- completed.push({ x, y });
131
- visited[y][x] = true;
132
- nbSymbolsIn += SymbolsPerRegionRule.countAllSymbolsOfPosition(grid, x, y);
133
- });
134
- if (this.comparison !== Comparison.AtLeast && nbSymbolsIn > this.count) {
135
- return { state: State.Error, positions: completed };
136
- }
137
- let nbSymbolsOut = 0;
138
- if (this.color === Color.Gray) {
139
- gray.push(...completed);
140
- nbSymbolsOut = nbSymbolsIn;
141
- }
142
- else {
143
- grid.iterateArea({ x: seed.x, y: seed.y }, tile => tile.color === Color.Gray || tile.color === this.color, (_, x, y) => {
144
- gray.push({ x, y });
145
- nbSymbolsOut += SymbolsPerRegionRule.countAllSymbolsOfPosition(grid, x, y);
146
- });
147
- }
148
- if (this.comparison !== Comparison.AtMost && nbSymbolsOut < this.count) {
149
- return { state: State.Error, positions: gray };
150
- }
151
- if (gray.length !== completed.length) {
152
- complete = false;
153
- }
154
- }
155
- return complete ? { state: State.Satisfied } : { state: State.Incomplete };
156
- }
157
- copyWith({ count, color, comparison, }) {
158
- return new SymbolsPerRegionRule(color ?? this.color, count ?? this.count, comparison ?? this.comparison);
159
- }
160
- withColor(color) {
161
- return this.copyWith({ color });
162
- }
163
- withCount(count) {
164
- return this.copyWith({ count });
165
- }
166
- withComparison(comparison) {
167
- return this.copyWith({ comparison });
168
- }
169
- static countAllSymbolsOfPosition(grid, x, y) {
170
- let count = 0;
171
- for (const symbolKind of grid.symbols.values()) {
172
- if (symbolKind.some(symbol => Math.floor(symbol.x) === x &&
173
- Math.floor(symbol.y) === y &&
174
- symbol.necessaryForCompletion)) {
175
- count++;
176
- }
177
- }
178
- return count;
179
- }
180
- }
181
- export const instance = new SymbolsPerRegionRule(Color.Dark, 1);
@@ -1,24 +0,0 @@
1
- import GridData from '../grid.js';
2
- import { RuleState } from '../primitives.js';
3
- import Rule, { SearchVariant } from './rule.js';
4
- export default class UndercluedRule extends Rule {
5
- readonly title = "Underclued";
6
- get configExplanation(): string;
7
- private static readonly EXAMPLE_GRID;
8
- private static readonly SEARCH_VARIANTS;
9
- /**
10
- * **Underclued Grid: Mark only what is definitely true**
11
- *
12
- * This rule validates answers based on the provided solution.
13
- */
14
- constructor();
15
- get id(): string;
16
- get explanation(): string;
17
- createExampleGrid(): GridData;
18
- get searchVariants(): SearchVariant[];
19
- validateGrid(_grid: GridData): RuleState;
20
- copyWith(_: object): this;
21
- get validateWithSolution(): boolean;
22
- get isSingleton(): boolean;
23
- }
24
- export declare const instance: UndercluedRule;
@@ -1,53 +0,0 @@
1
- import GridData from '../grid.js';
2
- import { MajorRule, State } from '../primitives.js';
3
- import AreaNumberSymbol from '../symbols/areaNumberSymbol.js';
4
- import CustomTextSymbol from '../symbols/customTextSymbol.js';
5
- import Rule from './rule.js';
6
- export default class UndercluedRule extends Rule {
7
- title = 'Underclued';
8
- get configExplanation() {
9
- return 'A solution must be provided. The solvers may be used to generate one automatically.';
10
- }
11
- static EXAMPLE_GRID = Object.freeze(GridData.create(['nbnnn', 'bwbnn', 'nbnnn', 'wwwnn'])
12
- .addSymbol(new AreaNumberSymbol(1, 1, 1))
13
- .addSymbol(new AreaNumberSymbol(0, 3, 4))
14
- .addSymbol(new CustomTextSymbol('', GridData.create([]), 0, 2, '?'))
15
- .addSymbol(new CustomTextSymbol('', GridData.create([]), 2, 2, '?'))
16
- .addSymbol(new CustomTextSymbol('', GridData.create([]), 3, 3, '?')));
17
- static SEARCH_VARIANTS = [
18
- new UndercluedRule().searchVariant(),
19
- ];
20
- /**
21
- * **Underclued Grid: Mark only what is definitely true**
22
- *
23
- * This rule validates answers based on the provided solution.
24
- */
25
- constructor() {
26
- super();
27
- }
28
- get id() {
29
- return MajorRule.Underclued;
30
- }
31
- get explanation() {
32
- return `*Underclued Grid:* Mark only what is definitely true`;
33
- }
34
- createExampleGrid() {
35
- return UndercluedRule.EXAMPLE_GRID;
36
- }
37
- get searchVariants() {
38
- return UndercluedRule.SEARCH_VARIANTS;
39
- }
40
- validateGrid(_grid) {
41
- return { state: State.Incomplete };
42
- }
43
- copyWith(_) {
44
- return new UndercluedRule();
45
- }
46
- get validateWithSolution() {
47
- return true;
48
- }
49
- get isSingleton() {
50
- return true;
51
- }
52
- }
53
- export const instance = new UndercluedRule();
@@ -1,28 +0,0 @@
1
- import { AnyConfig } from '../config.js';
2
- import GridData from '../grid.js';
3
- import { Color, RuleState } from '../primitives.js';
4
- import RegionShapeRule from './regionShapeRule.js';
5
- import { SearchVariant } from './rule.js';
6
- export default class UniqueShapeRule extends RegionShapeRule {
7
- readonly title = "Unique Shape Areas";
8
- private static readonly CONFIGS;
9
- private static readonly EXAMPLE_GRID_LIGHT;
10
- private static readonly EXAMPLE_GRID_DARK;
11
- private static readonly SEARCH_VARIANTS;
12
- /**
13
- * **No two &lt;color&gt; areas have the same shape and size**
14
- *
15
- * @param color - The color of the regions to compare.
16
- */
17
- constructor(color: Color);
18
- get id(): string;
19
- get explanation(): string;
20
- get configs(): readonly AnyConfig[] | null;
21
- createExampleGrid(): GridData;
22
- get searchVariants(): SearchVariant[];
23
- validateGrid(grid: GridData): RuleState;
24
- copyWith({ color }: {
25
- color?: Color;
26
- }): this;
27
- }
28
- export declare const instance: UniqueShapeRule;
@@ -1,65 +0,0 @@
1
- import { ConfigType } from '../config.js';
2
- import GridData from '../grid.js';
3
- import { Color, State } from '../primitives.js';
4
- import RegionShapeRule from './regionShapeRule.js';
5
- export default class UniqueShapeRule extends RegionShapeRule {
6
- title = 'Unique Shape Areas';
7
- static CONFIGS = Object.freeze([
8
- {
9
- type: ConfigType.Color,
10
- default: Color.Light,
11
- allowGray: false,
12
- field: 'color',
13
- description: 'Color',
14
- configurable: true,
15
- },
16
- ]);
17
- static EXAMPLE_GRID_LIGHT = Object.freeze(GridData.create(['bwbww', 'wwbww', 'wbwbb', 'bwwbw']));
18
- static EXAMPLE_GRID_DARK = Object.freeze(GridData.create(['wbwbb', 'bbwbb', 'bwbww', 'wbbwb']));
19
- static SEARCH_VARIANTS = [
20
- new UniqueShapeRule(Color.Light).searchVariant(),
21
- new UniqueShapeRule(Color.Dark).searchVariant(),
22
- ];
23
- /**
24
- * **No two &lt;color&gt; areas have the same shape and size**
25
- *
26
- * @param color - The color of the regions to compare.
27
- */
28
- constructor(color) {
29
- super(color);
30
- }
31
- get id() {
32
- return `unique_shape`;
33
- }
34
- get explanation() {
35
- return `No two ${this.color} areas have the same shape and size`;
36
- }
37
- get configs() {
38
- return UniqueShapeRule.CONFIGS;
39
- }
40
- createExampleGrid() {
41
- return this.color === Color.Light
42
- ? UniqueShapeRule.EXAMPLE_GRID_LIGHT
43
- : UniqueShapeRule.EXAMPLE_GRID_DARK;
44
- }
45
- get searchVariants() {
46
- return UniqueShapeRule.SEARCH_VARIANTS;
47
- }
48
- validateGrid(grid) {
49
- const { regions, complete } = this.getShapeRegions(grid);
50
- const errorRegion = regions.find(r => r.count > 1);
51
- if (errorRegion) {
52
- return {
53
- state: State.Error,
54
- positions: errorRegion.positions,
55
- };
56
- }
57
- else {
58
- return { state: complete ? State.Satisfied : State.Incomplete };
59
- }
60
- }
61
- copyWith({ color }) {
62
- return new UniqueShapeRule(color ?? this.color);
63
- }
64
- }
65
- export const instance = new UniqueShapeRule(Color.Dark);
@@ -1,36 +0,0 @@
1
- import { AnyConfig } from '../config.js';
2
- import { GetTileHandler } from '../events/onGetTile.js';
3
- import GridData from '../grid.js';
4
- import { Position, RuleState, Wrapping } from '../primitives.js';
5
- import Rule, { SearchVariant } from './rule.js';
6
- export default class WrapAroundRule extends Rule implements GetTileHandler {
7
- readonly horizontal: Wrapping;
8
- readonly vertical: Wrapping;
9
- readonly title = "Wrap Around";
10
- get configExplanation(): string;
11
- private static readonly EXAMPLE_GRID_NONE;
12
- private static readonly EXAMPLE_GRID_HORIZONTAL;
13
- private static readonly EXAMPLE_GRID_VERTICAL;
14
- private static readonly SEARCH_VARIANTS;
15
- private static readonly CONFIGS;
16
- /**
17
- * **The left and right edges are connected (in reverse)**
18
- *
19
- * @param horizontal - The horizontal wrapping.
20
- * @param vertical - The vertical wrapping.
21
- */
22
- constructor(horizontal: Wrapping, vertical: Wrapping);
23
- onGetTile(x: number, y: number, grid: GridData): Position;
24
- get id(): string;
25
- get explanation(): string;
26
- createExampleGrid(): GridData;
27
- get configs(): readonly AnyConfig[] | null;
28
- get searchVariants(): SearchVariant[];
29
- validateGrid(grid: GridData): RuleState;
30
- copyWith({ horizontal, vertical, }: {
31
- horizontal?: Wrapping;
32
- vertical?: Wrapping;
33
- }): this;
34
- get isSingleton(): boolean;
35
- }
36
- export declare const instance: WrapAroundRule;