@logic-pad/core 0.1.0

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 (211) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +19 -0
  3. package/assets/logic-core.global.d.ts +5865 -0
  4. package/assets/z3-built.js +14723 -0
  5. package/assets/z3-built.wasm +0 -0
  6. package/assets/z3-built.worker.js +206 -0
  7. package/dist/data/config.d.ts +101 -0
  8. package/dist/data/config.js +55 -0
  9. package/dist/data/configurable.d.ts +12 -0
  10. package/dist/data/configurable.js +26 -0
  11. package/dist/data/dataHelper.d.ts +77 -0
  12. package/dist/data/dataHelper.js +190 -0
  13. package/dist/data/events/eventHelper.d.ts +1 -0
  14. package/dist/data/events/eventHelper.js +6 -0
  15. package/dist/data/events/onFinalValidation.d.ts +14 -0
  16. package/dist/data/events/onFinalValidation.js +4 -0
  17. package/dist/data/events/onGridChange.d.ts +6 -0
  18. package/dist/data/events/onGridChange.js +4 -0
  19. package/dist/data/events/onGridResize.d.ts +9 -0
  20. package/dist/data/events/onGridResize.js +4 -0
  21. package/dist/data/events/onSetGrid.d.ts +6 -0
  22. package/dist/data/events/onSetGrid.js +4 -0
  23. package/dist/data/events/onSymbolValidation.d.ts +18 -0
  24. package/dist/data/events/onSymbolValidation.js +4 -0
  25. package/dist/data/grid.d.ts +362 -0
  26. package/dist/data/grid.js +886 -0
  27. package/dist/data/gridConnections.d.ts +38 -0
  28. package/dist/data/gridConnections.js +328 -0
  29. package/dist/data/instruction.d.ts +19 -0
  30. package/dist/data/instruction.js +23 -0
  31. package/dist/data/primitives.d.ts +85 -0
  32. package/dist/data/primitives.js +90 -0
  33. package/dist/data/puzzle.d.ts +86 -0
  34. package/dist/data/puzzle.js +22 -0
  35. package/dist/data/rules/banPatternRule.d.ts +29 -0
  36. package/dist/data/rules/banPatternRule.js +133 -0
  37. package/dist/data/rules/cellCountRule.d.ts +32 -0
  38. package/dist/data/rules/cellCountRule.js +166 -0
  39. package/dist/data/rules/completePatternRule.d.ts +22 -0
  40. package/dist/data/rules/completePatternRule.js +53 -0
  41. package/dist/data/rules/connectAllRule.d.ts +28 -0
  42. package/dist/data/rules/connectAllRule.js +113 -0
  43. package/dist/data/rules/customRule.d.ts +32 -0
  44. package/dist/data/rules/customRule.js +92 -0
  45. package/dist/data/rules/foresightRule.d.ts +30 -0
  46. package/dist/data/rules/foresightRule.js +107 -0
  47. package/dist/data/rules/index.d.ts +3 -0
  48. package/dist/data/rules/index.js +10 -0
  49. package/dist/data/rules/musicControlLine.d.ts +64 -0
  50. package/dist/data/rules/musicControlLine.js +178 -0
  51. package/dist/data/rules/musicGridRule.d.ts +46 -0
  52. package/dist/data/rules/musicGridRule.js +211 -0
  53. package/dist/data/rules/mysteryRule.d.ts +37 -0
  54. package/dist/data/rules/mysteryRule.js +164 -0
  55. package/dist/data/rules/offByXRule.d.ts +30 -0
  56. package/dist/data/rules/offByXRule.js +134 -0
  57. package/dist/data/rules/regionAreaRule.d.ts +33 -0
  58. package/dist/data/rules/regionAreaRule.js +182 -0
  59. package/dist/data/rules/regionShapeRule.d.ts +22 -0
  60. package/dist/data/rules/regionShapeRule.js +58 -0
  61. package/dist/data/rules/rule.d.ts +18 -0
  62. package/dist/data/rules/rule.js +19 -0
  63. package/dist/data/rules/rules.gen.d.ts +14 -0
  64. package/dist/data/rules/rules.gen.js +18 -0
  65. package/dist/data/rules/sameShapeRule.d.ts +27 -0
  66. package/dist/data/rules/sameShapeRule.js +88 -0
  67. package/dist/data/rules/symbolsPerRegionRule.d.ts +37 -0
  68. package/dist/data/rules/symbolsPerRegionRule.js +211 -0
  69. package/dist/data/rules/undercluedRule.d.ts +22 -0
  70. package/dist/data/rules/undercluedRule.js +60 -0
  71. package/dist/data/rules/uniqueShapeRule.d.ts +27 -0
  72. package/dist/data/rules/uniqueShapeRule.js +85 -0
  73. package/dist/data/serializer/allSerializers.d.ts +30 -0
  74. package/dist/data/serializer/allSerializers.js +64 -0
  75. package/dist/data/serializer/compressor/allCompressors.d.ts +14 -0
  76. package/dist/data/serializer/compressor/allCompressors.js +43 -0
  77. package/dist/data/serializer/compressor/compressorBase.d.ts +16 -0
  78. package/dist/data/serializer/compressor/compressorBase.js +2 -0
  79. package/dist/data/serializer/compressor/deflateCompressor.d.ts +7 -0
  80. package/dist/data/serializer/compressor/deflateCompressor.js +17 -0
  81. package/dist/data/serializer/compressor/gzipCompressor.d.ts +5 -0
  82. package/dist/data/serializer/compressor/gzipCompressor.js +9 -0
  83. package/dist/data/serializer/compressor/streamCompressor.d.ts +6 -0
  84. package/dist/data/serializer/compressor/streamCompressor.js +36 -0
  85. package/dist/data/serializer/serializerBase.d.ts +27 -0
  86. package/dist/data/serializer/serializerBase.js +2 -0
  87. package/dist/data/serializer/serializer_v0.d.ts +36 -0
  88. package/dist/data/serializer/serializer_v0.js +426 -0
  89. package/dist/data/shapes.d.ts +17 -0
  90. package/dist/data/shapes.js +117 -0
  91. package/dist/data/solver/allSolvers.d.ts +3 -0
  92. package/dist/data/solver/allSolvers.js +11 -0
  93. package/dist/data/solver/backtrack/backtrackSolver.d.ts +9 -0
  94. package/dist/data/solver/backtrack/backtrackSolver.js +92 -0
  95. package/dist/data/solver/backtrack/backtrackWorker.d.ts +2 -0
  96. package/dist/data/solver/backtrack/backtrackWorker.js +295 -0
  97. package/dist/data/solver/backtrack/data.d.ts +46 -0
  98. package/dist/data/solver/backtrack/data.js +140 -0
  99. package/dist/data/solver/backtrack/rules/banPattern.d.ts +9 -0
  100. package/dist/data/solver/backtrack/rules/banPattern.js +66 -0
  101. package/dist/data/solver/backtrack/rules/cellCount.d.ts +7 -0
  102. package/dist/data/solver/backtrack/rules/cellCount.js +30 -0
  103. package/dist/data/solver/backtrack/rules/connectAll.d.ts +7 -0
  104. package/dist/data/solver/backtrack/rules/connectAll.js +49 -0
  105. package/dist/data/solver/backtrack/rules/regionArea.d.ts +8 -0
  106. package/dist/data/solver/backtrack/rules/regionArea.js +76 -0
  107. package/dist/data/solver/backtrack/rules/regionShape.d.ts +8 -0
  108. package/dist/data/solver/backtrack/rules/regionShape.js +62 -0
  109. package/dist/data/solver/backtrack/rules/sameShape.d.ts +8 -0
  110. package/dist/data/solver/backtrack/rules/sameShape.js +19 -0
  111. package/dist/data/solver/backtrack/rules/symbolsPerRegion.d.ts +10 -0
  112. package/dist/data/solver/backtrack/rules/symbolsPerRegion.js +92 -0
  113. package/dist/data/solver/backtrack/rules/uniqueShape.d.ts +8 -0
  114. package/dist/data/solver/backtrack/rules/uniqueShape.js +19 -0
  115. package/dist/data/solver/backtrack/symbols/areaNumber.d.ts +9 -0
  116. package/dist/data/solver/backtrack/symbols/areaNumber.js +77 -0
  117. package/dist/data/solver/backtrack/symbols/dart.d.ts +9 -0
  118. package/dist/data/solver/backtrack/symbols/dart.js +58 -0
  119. package/dist/data/solver/backtrack/symbols/directionLinker.d.ts +9 -0
  120. package/dist/data/solver/backtrack/symbols/directionLinker.js +50 -0
  121. package/dist/data/solver/backtrack/symbols/galaxy.d.ts +9 -0
  122. package/dist/data/solver/backtrack/symbols/galaxy.js +19 -0
  123. package/dist/data/solver/backtrack/symbols/letter.d.ts +9 -0
  124. package/dist/data/solver/backtrack/symbols/letter.js +100 -0
  125. package/dist/data/solver/backtrack/symbols/lotus.d.ts +9 -0
  126. package/dist/data/solver/backtrack/symbols/lotus.js +36 -0
  127. package/dist/data/solver/backtrack/symbols/minesweeper.d.ts +9 -0
  128. package/dist/data/solver/backtrack/symbols/minesweeper.js +55 -0
  129. package/dist/data/solver/backtrack/symbols/myopia.d.ts +7 -0
  130. package/dist/data/solver/backtrack/symbols/myopia.js +79 -0
  131. package/dist/data/solver/backtrack/symbols/viewpoint.d.ts +7 -0
  132. package/dist/data/solver/backtrack/symbols/viewpoint.js +56 -0
  133. package/dist/data/solver/solver.d.ts +61 -0
  134. package/dist/data/solver/solver.js +55 -0
  135. package/dist/data/solver/underclued/undercluedSolver.d.ts +8 -0
  136. package/dist/data/solver/underclued/undercluedSolver.js +55 -0
  137. package/dist/data/solver/underclued/undercluedWorker.d.ts +2 -0
  138. package/dist/data/solver/underclued/undercluedWorker.js +131 -0
  139. package/dist/data/solver/z3/modules/areaNumberModule.d.ts +9 -0
  140. package/dist/data/solver/z3/modules/areaNumberModule.js +35 -0
  141. package/dist/data/solver/z3/modules/cellCountModule.d.ts +9 -0
  142. package/dist/data/solver/z3/modules/cellCountModule.js +59 -0
  143. package/dist/data/solver/z3/modules/connectAllModule.d.ts +9 -0
  144. package/dist/data/solver/z3/modules/connectAllModule.js +32 -0
  145. package/dist/data/solver/z3/modules/dartModule.d.ts +9 -0
  146. package/dist/data/solver/z3/modules/dartModule.js +69 -0
  147. package/dist/data/solver/z3/modules/index.d.ts +3 -0
  148. package/dist/data/solver/z3/modules/index.js +10 -0
  149. package/dist/data/solver/z3/modules/letterModule.d.ts +9 -0
  150. package/dist/data/solver/z3/modules/letterModule.js +41 -0
  151. package/dist/data/solver/z3/modules/modules.gen.d.ts +8 -0
  152. package/dist/data/solver/z3/modules/modules.gen.js +12 -0
  153. package/dist/data/solver/z3/modules/myopiaModule.d.ts +9 -0
  154. package/dist/data/solver/z3/modules/myopiaModule.js +64 -0
  155. package/dist/data/solver/z3/modules/regionAreaModule.d.ts +9 -0
  156. package/dist/data/solver/z3/modules/regionAreaModule.js +48 -0
  157. package/dist/data/solver/z3/modules/viewpointModule.d.ts +9 -0
  158. package/dist/data/solver/z3/modules/viewpointModule.js +37 -0
  159. package/dist/data/solver/z3/modules/z3Module.d.ts +7 -0
  160. package/dist/data/solver/z3/modules/z3Module.js +3 -0
  161. package/dist/data/solver/z3/utils.d.ts +2 -0
  162. package/dist/data/solver/z3/utils.js +26 -0
  163. package/dist/data/solver/z3/z3Solver.d.ts +10 -0
  164. package/dist/data/solver/z3/z3Solver.js +134 -0
  165. package/dist/data/solver/z3/z3SolverContext.d.ts +808 -0
  166. package/dist/data/solver/z3/z3SolverContext.js +49 -0
  167. package/dist/data/symbols/areaNumberSymbol.d.ts +30 -0
  168. package/dist/data/symbols/areaNumberSymbol.js +88 -0
  169. package/dist/data/symbols/customIconSymbol.d.ts +35 -0
  170. package/dist/data/symbols/customIconSymbol.js +105 -0
  171. package/dist/data/symbols/customSymbol.d.ts +23 -0
  172. package/dist/data/symbols/customSymbol.js +48 -0
  173. package/dist/data/symbols/customTextSymbol.d.ts +33 -0
  174. package/dist/data/symbols/customTextSymbol.js +106 -0
  175. package/dist/data/symbols/dartSymbol.d.ts +35 -0
  176. package/dist/data/symbols/dartSymbol.js +110 -0
  177. package/dist/data/symbols/directionLinkerSymbol.d.ts +36 -0
  178. package/dist/data/symbols/directionLinkerSymbol.js +259 -0
  179. package/dist/data/symbols/galaxySymbol.d.ts +26 -0
  180. package/dist/data/symbols/galaxySymbol.js +74 -0
  181. package/dist/data/symbols/index.d.ts +3 -0
  182. package/dist/data/symbols/index.js +10 -0
  183. package/dist/data/symbols/letterSymbol.d.ts +31 -0
  184. package/dist/data/symbols/letterSymbol.js +137 -0
  185. package/dist/data/symbols/lotusSymbol.d.ts +29 -0
  186. package/dist/data/symbols/lotusSymbol.js +132 -0
  187. package/dist/data/symbols/minesweeperSymbol.d.ts +31 -0
  188. package/dist/data/symbols/minesweeperSymbol.js +100 -0
  189. package/dist/data/symbols/multiEntrySymbol.d.ts +11 -0
  190. package/dist/data/symbols/multiEntrySymbol.js +14 -0
  191. package/dist/data/symbols/myopiaSymbol.d.ts +34 -0
  192. package/dist/data/symbols/myopiaSymbol.js +187 -0
  193. package/dist/data/symbols/numberSymbol.d.ts +19 -0
  194. package/dist/data/symbols/numberSymbol.js +41 -0
  195. package/dist/data/symbols/symbol.d.ts +16 -0
  196. package/dist/data/symbols/symbol.js +51 -0
  197. package/dist/data/symbols/symbols.gen.d.ts +10 -0
  198. package/dist/data/symbols/symbols.gen.js +14 -0
  199. package/dist/data/symbols/viewpointSymbol.d.ts +31 -0
  200. package/dist/data/symbols/viewpointSymbol.js +106 -0
  201. package/dist/data/tile.d.ts +26 -0
  202. package/dist/data/tile.js +68 -0
  203. package/dist/data/tileConnections.d.ts +25 -0
  204. package/dist/data/tileConnections.js +74 -0
  205. package/dist/data/validate.d.ts +5 -0
  206. package/dist/data/validate.js +131 -0
  207. package/dist/index.d.ts +96 -0
  208. package/dist/index.js +100 -0
  209. package/dist/polyfill/streamPolyfill.d.ts +2 -0
  210. package/dist/polyfill/streamPolyfill.js +1 -0
  211. package/package.json +75 -0
@@ -0,0 +1,31 @@
1
+ import { AnyConfig } from '../config';
2
+ import GridData from '../grid';
3
+ import NumberSymbol from './numberSymbol';
4
+ export default class ViewpointSymbol extends NumberSymbol {
5
+ private static readonly CONFIGS;
6
+ private static readonly EXAMPLE_GRID;
7
+ /**
8
+ * **Viewpoint Numbers count visible cells in the four directions**
9
+ * @param x - The x-coordinate of the symbol.
10
+ * @param y - The y-coordinate of the symbol.
11
+ * @param number - The viewpoint number.
12
+ */
13
+ constructor(x: number, y: number, number: number);
14
+ get id(): string;
15
+ get placementStep(): number;
16
+ get explanation(): string;
17
+ get configs(): readonly AnyConfig[] | null;
18
+ createExampleGrid(): GridData;
19
+ private countForColor;
20
+ countTiles(grid: GridData): {
21
+ completed: number;
22
+ possible: number;
23
+ };
24
+ copyWith({ x, y, number, }: {
25
+ x?: number;
26
+ y?: number;
27
+ number?: number;
28
+ }): this;
29
+ withNumber(number: number): this;
30
+ }
31
+ export declare const instance: ViewpointSymbol;
@@ -0,0 +1,106 @@
1
+ import { ConfigType } from '../config';
2
+ import GridData from '../grid';
3
+ import { move } from '../dataHelper';
4
+ import { Color, DIRECTIONS } from '../primitives';
5
+ import NumberSymbol from './numberSymbol';
6
+ class ViewpointSymbol extends NumberSymbol {
7
+ /**
8
+ * **Viewpoint Numbers count visible cells in the four directions**
9
+ * @param x - The x-coordinate of the symbol.
10
+ * @param y - The y-coordinate of the symbol.
11
+ * @param number - The viewpoint number.
12
+ */
13
+ constructor(x, y, number) {
14
+ super(x, y, number);
15
+ }
16
+ get id() {
17
+ return `viewpoint`;
18
+ }
19
+ get placementStep() {
20
+ return 1;
21
+ }
22
+ get explanation() {
23
+ return '*Viewpoint Numbers* count visible cells in the four directions';
24
+ }
25
+ get configs() {
26
+ return ViewpointSymbol.CONFIGS;
27
+ }
28
+ createExampleGrid() {
29
+ return ViewpointSymbol.EXAMPLE_GRID;
30
+ }
31
+ countForColor(grid, color, pos) {
32
+ let minSize = 1;
33
+ let maxSize = 1;
34
+ for (const direction of DIRECTIONS) {
35
+ let continuous = true;
36
+ grid.iterateDirection(move(pos, direction), direction, tile => tile.color === color || tile.color === Color.Gray, tile => {
37
+ maxSize++;
38
+ if (tile.color === Color.Gray) {
39
+ continuous = false;
40
+ }
41
+ else {
42
+ if (continuous)
43
+ minSize++;
44
+ }
45
+ });
46
+ }
47
+ return { completed: minSize, possible: maxSize };
48
+ }
49
+ countTiles(grid) {
50
+ if (Math.floor(this.x) !== this.x || Math.floor(this.y) !== this.y)
51
+ return { completed: 0, possible: Number.MAX_SAFE_INTEGER };
52
+ const pos = { x: this.x, y: this.y };
53
+ const color = grid.getTile(this.x, this.y).color;
54
+ if (color === Color.Gray) {
55
+ const dark = this.countForColor(grid, Color.Dark, pos);
56
+ const light = this.countForColor(grid, Color.Light, pos);
57
+ return {
58
+ completed: Math.min(dark.completed, light.completed),
59
+ possible: Math.max(dark.possible, light.possible),
60
+ };
61
+ }
62
+ return this.countForColor(grid, color, pos);
63
+ }
64
+ copyWith({ x, y, number, }) {
65
+ return new ViewpointSymbol(x ?? this.x, y ?? this.y, number ?? this.number);
66
+ }
67
+ withNumber(number) {
68
+ return this.copyWith({ number });
69
+ }
70
+ }
71
+ Object.defineProperty(ViewpointSymbol, "CONFIGS", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: Object.freeze([
76
+ {
77
+ type: ConfigType.Number,
78
+ default: 0,
79
+ field: 'x',
80
+ description: 'X',
81
+ configurable: false,
82
+ },
83
+ {
84
+ type: ConfigType.Number,
85
+ default: 0,
86
+ field: 'y',
87
+ description: 'Y',
88
+ configurable: false,
89
+ },
90
+ {
91
+ type: ConfigType.Number,
92
+ default: 1,
93
+ field: 'number',
94
+ description: 'Number',
95
+ configurable: true,
96
+ },
97
+ ])
98
+ });
99
+ Object.defineProperty(ViewpointSymbol, "EXAMPLE_GRID", {
100
+ enumerable: true,
101
+ configurable: true,
102
+ writable: true,
103
+ value: Object.freeze(GridData.create(['bbbbb', 'wwwwb', 'bwwbb', 'bbwww']).addSymbol(new ViewpointSymbol(1, 1, 5)))
104
+ });
105
+ export default ViewpointSymbol;
106
+ export const instance = new ViewpointSymbol(0, 0, 1);
@@ -0,0 +1,26 @@
1
+ import { Color } from './primitives';
2
+ export default class TileData {
3
+ readonly exists: boolean;
4
+ readonly fixed: boolean;
5
+ readonly color: Color;
6
+ constructor(exists: boolean, fixed: boolean, color: Color);
7
+ /**
8
+ * Create a gray tile.
9
+ */
10
+ static empty(): TileData;
11
+ /**
12
+ * Create a non-existent tile.
13
+ */
14
+ static doesNotExist(): TileData;
15
+ copyWith({ exists, fixed, color, }: {
16
+ exists?: boolean;
17
+ fixed?: boolean;
18
+ color?: Color;
19
+ }): this;
20
+ withExists(exists: boolean): this;
21
+ withFixed(fixed: boolean): this;
22
+ withColor(color: Color): this;
23
+ get isFixed(): boolean;
24
+ equals(other: TileData): boolean;
25
+ static create(char: string): TileData;
26
+ }
@@ -0,0 +1,68 @@
1
+ import { Color } from './primitives';
2
+ export default class TileData {
3
+ constructor(exists, fixed, color) {
4
+ Object.defineProperty(this, "exists", {
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true,
8
+ value: exists
9
+ });
10
+ Object.defineProperty(this, "fixed", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: fixed
15
+ });
16
+ Object.defineProperty(this, "color", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: color
21
+ });
22
+ this.exists = exists;
23
+ this.fixed = fixed;
24
+ this.color = color;
25
+ }
26
+ /**
27
+ * Create a gray tile.
28
+ */
29
+ static empty() {
30
+ return new TileData(true, false, Color.Gray);
31
+ }
32
+ /**
33
+ * Create a non-existent tile.
34
+ */
35
+ static doesNotExist() {
36
+ return new TileData(false, false, Color.Gray);
37
+ }
38
+ copyWith({ exists, fixed, color, }) {
39
+ return new TileData(exists ?? this.exists, fixed ?? this.fixed, color ?? this.color);
40
+ }
41
+ withExists(exists) {
42
+ return this.copyWith({ exists });
43
+ }
44
+ withFixed(fixed) {
45
+ return this.copyWith({ fixed });
46
+ }
47
+ withColor(color) {
48
+ return this.copyWith({ color });
49
+ }
50
+ get isFixed() {
51
+ return this.fixed;
52
+ }
53
+ equals(other) {
54
+ return (this.exists === other.exists &&
55
+ this.fixed === other.fixed &&
56
+ this.color === other.color);
57
+ }
58
+ static create(char) {
59
+ const exists = char !== '.';
60
+ const fixed = char.toUpperCase() === char;
61
+ const color = char.toLowerCase() === 'n'
62
+ ? Color.Gray
63
+ : char.toLowerCase() === 'b'
64
+ ? Color.Dark
65
+ : Color.Light;
66
+ return new TileData(exists, fixed, color);
67
+ }
68
+ }
@@ -0,0 +1,25 @@
1
+ export default class TileConnections {
2
+ [y: number]: {
3
+ [x: number]: boolean;
4
+ };
5
+ constructor();
6
+ get topLeft(): boolean;
7
+ set topLeft(value: boolean);
8
+ get top(): boolean;
9
+ set top(value: boolean);
10
+ get topRight(): boolean;
11
+ set topRight(value: boolean);
12
+ get left(): boolean;
13
+ set left(value: boolean);
14
+ get center(): boolean;
15
+ set center(value: boolean);
16
+ get right(): boolean;
17
+ set right(value: boolean);
18
+ get bottomLeft(): boolean;
19
+ set bottomLeft(value: boolean);
20
+ get bottom(): boolean;
21
+ set bottom(value: boolean);
22
+ get bottomRight(): boolean;
23
+ set bottomRight(value: boolean);
24
+ equals(other: TileConnections): boolean;
25
+ }
@@ -0,0 +1,74 @@
1
+ export default class TileConnections {
2
+ constructor() {
3
+ for (let i = -1; i <= 1; i++) {
4
+ this[i] = {};
5
+ for (let j = -1; j <= 1; j++) {
6
+ this[i][j] = false;
7
+ }
8
+ }
9
+ }
10
+ get topLeft() {
11
+ return this[-1][-1];
12
+ }
13
+ set topLeft(value) {
14
+ this[-1][-1] = value;
15
+ }
16
+ get top() {
17
+ return this[-1][0];
18
+ }
19
+ set top(value) {
20
+ this[-1][0] = value;
21
+ }
22
+ get topRight() {
23
+ return this[-1][1];
24
+ }
25
+ set topRight(value) {
26
+ this[-1][1] = value;
27
+ }
28
+ get left() {
29
+ return this[0][-1];
30
+ }
31
+ set left(value) {
32
+ this[0][-1] = value;
33
+ }
34
+ get center() {
35
+ return this[0][0];
36
+ }
37
+ set center(value) {
38
+ this[0][0] = value;
39
+ }
40
+ get right() {
41
+ return this[0][1];
42
+ }
43
+ set right(value) {
44
+ this[0][1] = value;
45
+ }
46
+ get bottomLeft() {
47
+ return this[1][-1];
48
+ }
49
+ set bottomLeft(value) {
50
+ this[1][-1] = value;
51
+ }
52
+ get bottom() {
53
+ return this[1][0];
54
+ }
55
+ set bottom(value) {
56
+ this[1][0] = value;
57
+ }
58
+ get bottomRight() {
59
+ return this[1][1];
60
+ }
61
+ set bottomRight(value) {
62
+ this[1][1] = value;
63
+ }
64
+ equals(other) {
65
+ for (let i = -1; i <= 1; i++) {
66
+ for (let j = -1; j <= 1; j++) {
67
+ if (this[i][j] !== other[i][j]) {
68
+ return false;
69
+ }
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+ }
@@ -0,0 +1,5 @@
1
+ import GridData from './grid';
2
+ import { GridState, RuleState, State } from './primitives';
3
+ export declare function aggregateState(rules: RuleState[], grid: GridData, symbols: Map<string, State[]>): State;
4
+ export declare function applyFinalOverrides(grid: GridData, solution: GridData | null, state: GridState): GridState;
5
+ export default function validateGrid(grid: GridData, solution: GridData | null): GridState;
@@ -0,0 +1,131 @@
1
+ import { handlesFinalValidation } from './events/onFinalValidation';
2
+ import { handlesSymbolValidation } from './events/onSymbolValidation';
3
+ import { Color, State } from './primitives';
4
+ export function aggregateState(rules, grid, symbols) {
5
+ if (rules.some(s => s.state === State.Error))
6
+ return State.Error;
7
+ for (const [_, symbolList] of symbols) {
8
+ if (symbolList.some(s => s === State.Error))
9
+ return State.Error;
10
+ }
11
+ if (rules.some((s, idx) => s.state === State.Incomplete && grid.rules[idx].necessaryForCompletion))
12
+ return State.Incomplete;
13
+ for (const [key, symbolList] of symbols) {
14
+ if (symbolList.some((s, idx) => s === State.Incomplete &&
15
+ grid.symbols.get(key)[idx].necessaryForCompletion))
16
+ return State.Incomplete;
17
+ }
18
+ if (rules.length === 0 && symbols.size === 0)
19
+ return State.Incomplete;
20
+ return State.Satisfied;
21
+ }
22
+ export function applyFinalOverrides(grid, solution, state) {
23
+ grid.symbols.forEach(list => {
24
+ list.forEach(sym => {
25
+ if (handlesFinalValidation(sym)) {
26
+ state = sym.onFinalValidation(grid, solution, state);
27
+ }
28
+ });
29
+ });
30
+ grid.rules.forEach(rule => {
31
+ if (handlesFinalValidation(rule)) {
32
+ state = rule.onFinalValidation(grid, solution, state);
33
+ }
34
+ });
35
+ return state;
36
+ }
37
+ export default function validateGrid(grid, solution) {
38
+ let requireSolution = false;
39
+ // validate all rules with self-contained logic
40
+ const ruleStates = grid.rules.map(rule => {
41
+ if (rule.validateWithSolution)
42
+ requireSolution = true;
43
+ return rule.validateGrid(grid);
44
+ });
45
+ // validate all symbols with symbol overrides
46
+ const symbolOverrideStates = ruleStates.map(() => []);
47
+ const applySymbolOverrides = (grid, rules, symbol, validator) => {
48
+ const [rule, ...rest] = rules;
49
+ if (rule) {
50
+ const newValidator = (grid) => applySymbolOverrides(grid, rest, symbol, () => validator(grid));
51
+ if (!handlesSymbolValidation(rule))
52
+ return newValidator(grid);
53
+ const result = rule.onSymbolValidation(grid, symbol, newValidator);
54
+ if (result === undefined) {
55
+ return newValidator(grid);
56
+ }
57
+ const index = grid.rules.indexOf(rule);
58
+ symbolOverrideStates[index].push(result);
59
+ return result;
60
+ }
61
+ return validator(grid);
62
+ };
63
+ const symbolStates = new Map();
64
+ grid.symbols.forEach((symbolList, id) => symbolStates.set(id, symbolList.map(s => {
65
+ if (s.validateWithSolution)
66
+ requireSolution = true;
67
+ return applySymbolOverrides(grid, grid.rules, s, g => s.validateSymbol(g));
68
+ })));
69
+ // apply the result of symbol overrides to the rules that provided them
70
+ symbolOverrideStates.forEach((states, i) => {
71
+ if (ruleStates[i].state !== State.Incomplete)
72
+ return;
73
+ if (states.some(s => s === State.Error))
74
+ ruleStates[i] = { state: State.Error, positions: [] };
75
+ else if (states.length > 0 && states.every(s => s === State.Satisfied))
76
+ ruleStates[i] = { state: State.Satisfied };
77
+ });
78
+ let final = aggregateState(ruleStates, grid, symbolStates);
79
+ // in addition to satisfying all rules and symbols, a solution must also fill the grid completely
80
+ if (!requireSolution && final === State.Satisfied) {
81
+ final = grid.forEach(tile => tile.exists && tile.color === Color.Gray ? true : undefined)
82
+ ? State.Incomplete
83
+ : State.Satisfied;
84
+ }
85
+ // return early if there is no need to validate against a solution
86
+ if (final === State.Satisfied ||
87
+ !requireSolution ||
88
+ !solution ||
89
+ solution.width !== grid.width ||
90
+ solution.height !== grid.height) {
91
+ return applyFinalOverrides(grid, solution, {
92
+ final,
93
+ rules: ruleStates,
94
+ symbols: symbolStates,
95
+ });
96
+ }
97
+ // validate against the solution
98
+ for (let y = 0; y < grid.height; y++) {
99
+ for (let x = 0; x < grid.width; x++) {
100
+ if (grid.getTile(x, y).exists &&
101
+ grid.getTile(x, y).color !== solution.getTile(x, y).color) {
102
+ return applyFinalOverrides(grid, solution, {
103
+ final: State.Incomplete,
104
+ rules: ruleStates,
105
+ symbols: symbolStates,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ // mark all rules and symbols that are satisfied by the solution
111
+ grid.rules.forEach((rule, i) => {
112
+ if (rule.validateWithSolution) {
113
+ ruleStates[i] = { ...ruleStates[i], state: State.Satisfied };
114
+ }
115
+ });
116
+ grid.symbols.forEach((_, id) => {
117
+ const symbolList = symbolStates.get(id);
118
+ symbolList.forEach((_, i) => {
119
+ const symbol = grid.symbols.get(id)[i];
120
+ if (symbol.validateWithSolution) {
121
+ symbolList[i] = State.Satisfied;
122
+ }
123
+ });
124
+ });
125
+ const finalState = {
126
+ final: State.Satisfied,
127
+ rules: ruleStates,
128
+ symbols: symbolStates,
129
+ };
130
+ return applyFinalOverrides(grid, solution, finalState);
131
+ }
@@ -0,0 +1,96 @@
1
+ import { ConfigType, configEquals } from '../src/data/config';
2
+ import Configurable from '../src/data/configurable';
3
+ import { allEqual, array, directionToRotation, escape, maxBy, minBy, move, orientationToRotation, resize, unescape } from '../src/data/dataHelper';
4
+ import { isEventHandler } from '../src/data/events/eventHelper';
5
+ import { handlesFinalValidation } from '../src/data/events/onFinalValidation';
6
+ import { handlesGridChange } from '../src/data/events/onGridChange';
7
+ import { handlesGridResize } from '../src/data/events/onGridResize';
8
+ import { handlesSetGrid } from '../src/data/events/onSetGrid';
9
+ import { handlesSymbolValidation } from '../src/data/events/onSymbolValidation';
10
+ import GridData from '../src/data/grid';
11
+ import GridConnections from '../src/data/gridConnections';
12
+ import Instruction from '../src/data/instruction';
13
+ import { COMPARISONS, Color, Comparison, DIRECTIONS, Direction, Mode, ORIENTATIONS, Orientation, State, directionToggle, orientationToggle } from '../src/data/primitives';
14
+ import { MetadataSchema, PuzzleSchema } from '../src/data/puzzle';
15
+ import BanPatternRule from '../src/data/rules/banPatternRule';
16
+ import CellCountRule from '../src/data/rules/cellCountRule';
17
+ import CompletePatternRule from '../src/data/rules/completePatternRule';
18
+ import ConnectAllRule from '../src/data/rules/connectAllRule';
19
+ import CustomRule from '../src/data/rules/customRule';
20
+ import ForesightRule from '../src/data/rules/foresightRule';
21
+ import { allRules } from '../src/data/rules/index';
22
+ import { ControlLine, Row } from '../src/data/rules/musicControlLine';
23
+ import MusicGridRule from '../src/data/rules/musicGridRule';
24
+ import MysteryRule from '../src/data/rules/mysteryRule';
25
+ import OffByXRule from '../src/data/rules/offByXRule';
26
+ import RegionAreaRule from '../src/data/rules/regionAreaRule';
27
+ import RegionShapeRule from '../src/data/rules/regionShapeRule';
28
+ import Rule from '../src/data/rules/rule';
29
+ import SameShapeRule from '../src/data/rules/sameShapeRule';
30
+ import SymbolsPerRegionRule from '../src/data/rules/symbolsPerRegionRule';
31
+ import UndercluedRule from '../src/data/rules/undercluedRule';
32
+ import UniqueShapeRule from '../src/data/rules/uniqueShapeRule';
33
+ import { Serializer } from '../src/data/serializer/allSerializers';
34
+ import { Compressor } from '../src/data/serializer/compressor/allCompressors';
35
+ import CompressorBase from '../src/data/serializer/compressor/compressorBase';
36
+ import DeflateCompressor from '../src/data/serializer/compressor/deflateCompressor';
37
+ import GzipCompressor from '../src/data/serializer/compressor/gzipCompressor';
38
+ import StreamCompressor from '../src/data/serializer/compressor/streamCompressor';
39
+ import SerializerBase from '../src/data/serializer/serializerBase';
40
+ import SerializerV0 from '../src/data/serializer/serializer_v0';
41
+ import { getShapeVariants, normalizeShape, positionsToShape, shapeEquals, tilesToShape } from '../src/data/shapes';
42
+ import { allSolvers } from '../src/data/solver/allSolvers';
43
+ import BacktrackSolver from '../src/data/solver/backtrack/backtrackSolver';
44
+ import BTModule, { BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor } from '../src/data/solver/backtrack/data';
45
+ import BanPatternBTModule from '../src/data/solver/backtrack/rules/banPattern';
46
+ import CellCountBTModule from '../src/data/solver/backtrack/rules/cellCount';
47
+ import ConnectAllBTModule from '../src/data/solver/backtrack/rules/connectAll';
48
+ import RegionAreaBTModule from '../src/data/solver/backtrack/rules/regionArea';
49
+ import RegionShapeBTModule from '../src/data/solver/backtrack/rules/regionShape';
50
+ import SameShapeBTModule from '../src/data/solver/backtrack/rules/sameShape';
51
+ import SymbolsPerRegionBTModule from '../src/data/solver/backtrack/rules/symbolsPerRegion';
52
+ import UniqueShapeBTModule from '../src/data/solver/backtrack/rules/uniqueShape';
53
+ import AreaNumberBTModule from '../src/data/solver/backtrack/symbols/areaNumber';
54
+ import DartBTModule from '../src/data/solver/backtrack/symbols/dart';
55
+ import DirectionLinkerBTModule from '../src/data/solver/backtrack/symbols/directionLinker';
56
+ import GalaxyBTModule from '../src/data/solver/backtrack/symbols/galaxy';
57
+ import LetterBTModule from '../src/data/solver/backtrack/symbols/letter';
58
+ import LotusBTModule from '../src/data/solver/backtrack/symbols/lotus';
59
+ import MinesweeperBTModule from '../src/data/solver/backtrack/symbols/minesweeper';
60
+ import MyopiaBTModule from '../src/data/solver/backtrack/symbols/myopia';
61
+ import ViewpointBTModule from '../src/data/solver/backtrack/symbols/viewpoint';
62
+ import Solver from '../src/data/solver/solver';
63
+ import UndercluedSolver from '../src/data/solver/underclued/undercluedSolver';
64
+ import AreaNumberModule from '../src/data/solver/z3/modules/areaNumberModule';
65
+ import CellCountModule from '../src/data/solver/z3/modules/cellCountModule';
66
+ import ConnectAllModule from '../src/data/solver/z3/modules/connectAllModule';
67
+ import DartModule from '../src/data/solver/z3/modules/dartModule';
68
+ import { allZ3Modules } from '../src/data/solver/z3/modules/index';
69
+ import LetterModule from '../src/data/solver/z3/modules/letterModule';
70
+ import MyopiaModule from '../src/data/solver/z3/modules/myopiaModule';
71
+ import RegionAreaModule from '../src/data/solver/z3/modules/regionAreaModule';
72
+ import ViewpointModule from '../src/data/solver/z3/modules/viewpointModule';
73
+ import Z3Module from '../src/data/solver/z3/modules/z3Module';
74
+ import { convertDirection } from '../src/data/solver/z3/utils';
75
+ import Z3Solver from '../src/data/solver/z3/z3Solver';
76
+ import Z3SolverContext from '../src/data/solver/z3/z3SolverContext';
77
+ import AreaNumberSymbol from '../src/data/symbols/areaNumberSymbol';
78
+ import CustomIconSymbol from '../src/data/symbols/customIconSymbol';
79
+ import CustomSymbol from '../src/data/symbols/customSymbol';
80
+ import CustomTextSymbol from '../src/data/symbols/customTextSymbol';
81
+ import DartSymbol from '../src/data/symbols/dartSymbol';
82
+ import DirectionLinkerSymbol from '../src/data/symbols/directionLinkerSymbol';
83
+ import GalaxySymbol from '../src/data/symbols/galaxySymbol';
84
+ import { allSymbols } from '../src/data/symbols/index';
85
+ import LetterSymbol from '../src/data/symbols/letterSymbol';
86
+ import LotusSymbol from '../src/data/symbols/lotusSymbol';
87
+ import MinesweeperSymbol from '../src/data/symbols/minesweeperSymbol';
88
+ import MultiEntrySymbol from '../src/data/symbols/multiEntrySymbol';
89
+ import MyopiaSymbol from '../src/data/symbols/myopiaSymbol';
90
+ import NumberSymbol from '../src/data/symbols/numberSymbol';
91
+ import Symbol from '../src/data/symbols/symbol';
92
+ import ViewpointSymbol from '../src/data/symbols/viewpointSymbol';
93
+ import TileData from '../src/data/tile';
94
+ import TileConnections from '../src/data/tileConnections';
95
+ import validateGrid, { aggregateState, applyFinalOverrides } from '../src/data/validate';
96
+ export { ConfigType, configEquals, Configurable, allEqual, array, directionToRotation, escape, maxBy, minBy, move, orientationToRotation, resize, unescape, isEventHandler, handlesFinalValidation, handlesGridChange, handlesGridResize, handlesSetGrid, handlesSymbolValidation, GridData, GridConnections, Instruction, COMPARISONS, Color, Comparison, DIRECTIONS, Direction, Mode, ORIENTATIONS, Orientation, State, directionToggle, orientationToggle, MetadataSchema, PuzzleSchema, BanPatternRule, CellCountRule, CompletePatternRule, ConnectAllRule, CustomRule, ForesightRule, allRules, ControlLine, Row, MusicGridRule, MysteryRule, OffByXRule, RegionAreaRule, RegionShapeRule, Rule, SameShapeRule, SymbolsPerRegionRule, UndercluedRule, UniqueShapeRule, Serializer, Compressor, CompressorBase, DeflateCompressor, GzipCompressor, StreamCompressor, SerializerBase, SerializerV0, getShapeVariants, normalizeShape, positionsToShape, shapeEquals, tilesToShape, allSolvers, BacktrackSolver, BTModule, BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor, BanPatternBTModule, CellCountBTModule, ConnectAllBTModule, RegionAreaBTModule, RegionShapeBTModule, SameShapeBTModule, SymbolsPerRegionBTModule, UniqueShapeBTModule, AreaNumberBTModule, DartBTModule, DirectionLinkerBTModule, GalaxyBTModule, LetterBTModule, LotusBTModule, MinesweeperBTModule, MyopiaBTModule, ViewpointBTModule, Solver, UndercluedSolver, AreaNumberModule, CellCountModule, ConnectAllModule, DartModule, allZ3Modules, LetterModule, MyopiaModule, RegionAreaModule, ViewpointModule, Z3Module, convertDirection, Z3Solver, Z3SolverContext, AreaNumberSymbol, CustomIconSymbol, CustomSymbol, CustomTextSymbol, DartSymbol, DirectionLinkerSymbol, GalaxySymbol, allSymbols, LetterSymbol, LotusSymbol, MinesweeperSymbol, MultiEntrySymbol, MyopiaSymbol, NumberSymbol, Symbol, ViewpointSymbol, TileData, TileConnections, validateGrid, aggregateState, applyFinalOverrides, };