@logic-pad/core 0.25.3 → 0.26.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 (59) hide show
  1. package/assets/logic-core.global.d.ts +16 -104
  2. package/dist/src/data/rules/offByXRule.js +2 -0
  3. package/dist/src/data/solver/allSolvers.js +0 -2
  4. package/dist/src/data/solver/auto/autoSolver.d.ts +2 -1
  5. package/dist/src/data/solver/auto/autoSolver.js +13 -17
  6. package/dist/src/data/solver/backtrack/backtrackSolver.d.ts +3 -1
  7. package/dist/src/data/solver/backtrack/backtrackSolver.js +2 -2
  8. package/dist/src/data/solver/backtrack/backtrackWorker.js +2 -2
  9. package/dist/src/data/solver/backtrack/data.d.ts +1 -0
  10. package/dist/src/data/solver/backtrack/data.js +43 -0
  11. package/dist/src/data/solver/backtrack/symbols/areaNumber.js +4 -1
  12. package/dist/src/data/solver/backtrack/symbols/letter.js +4 -1
  13. package/dist/src/data/solver/cspuz/cspuzSolver.d.ts +2 -1
  14. package/dist/src/data/solver/cspuz/cspuzSolver.js +46 -19
  15. package/dist/src/data/solver/solver.d.ts +2 -1
  16. package/dist/src/data/solver/solver.js +8 -7
  17. package/dist/src/data/solver/universal/universalSolver.d.ts +0 -1
  18. package/dist/src/data/solver/universal/universalSolver.js +0 -7
  19. package/dist/src/data/symbols/areaNumberSymbol.d.ts +1 -1
  20. package/dist/src/data/symbols/areaNumberSymbol.js +2 -0
  21. package/dist/src/data/symbols/everyLetterSymbol.js +2 -0
  22. package/dist/src/data/symbols/houseSymbol.d.ts +1 -1
  23. package/dist/src/data/symbols/houseSymbol.js +2 -0
  24. package/dist/src/data/symbols/letterSymbol.js +2 -0
  25. package/dist/src/data/symbols/numberSymbol.d.ts +1 -1
  26. package/dist/src/data/symbols/numberSymbol.js +4 -1
  27. package/dist/src/data/symbols/symbol.d.ts +5 -0
  28. package/dist/src/data/symbols/symbol.js +32 -0
  29. package/dist/src/index.d.ts +2 -15
  30. package/dist/src/index.js +2 -15
  31. package/package.json +1 -3
  32. package/dist/src/data/solver/z3/modules/areaNumberModule.d.ts +0 -9
  33. package/dist/src/data/solver/z3/modules/areaNumberModule.js +0 -27
  34. package/dist/src/data/solver/z3/modules/cellCountModule.d.ts +0 -9
  35. package/dist/src/data/solver/z3/modules/cellCountModule.js +0 -51
  36. package/dist/src/data/solver/z3/modules/connectAllModule.d.ts +0 -9
  37. package/dist/src/data/solver/z3/modules/connectAllModule.js +0 -24
  38. package/dist/src/data/solver/z3/modules/dartModule.d.ts +0 -9
  39. package/dist/src/data/solver/z3/modules/dartModule.js +0 -61
  40. package/dist/src/data/solver/z3/modules/index.d.ts +0 -3
  41. package/dist/src/data/solver/z3/modules/index.js +0 -10
  42. package/dist/src/data/solver/z3/modules/letterModule.d.ts +0 -9
  43. package/dist/src/data/solver/z3/modules/letterModule.js +0 -33
  44. package/dist/src/data/solver/z3/modules/modules.gen.d.ts +0 -8
  45. package/dist/src/data/solver/z3/modules/modules.gen.js +0 -12
  46. package/dist/src/data/solver/z3/modules/myopiaModule.d.ts +0 -9
  47. package/dist/src/data/solver/z3/modules/myopiaModule.js +0 -56
  48. package/dist/src/data/solver/z3/modules/regionAreaModule.d.ts +0 -9
  49. package/dist/src/data/solver/z3/modules/regionAreaModule.js +0 -40
  50. package/dist/src/data/solver/z3/modules/viewpointModule.d.ts +0 -9
  51. package/dist/src/data/solver/z3/modules/viewpointModule.js +0 -29
  52. package/dist/src/data/solver/z3/modules/z3Module.d.ts +0 -7
  53. package/dist/src/data/solver/z3/modules/z3Module.js +0 -3
  54. package/dist/src/data/solver/z3/utils.d.ts +0 -2
  55. package/dist/src/data/solver/z3/utils.js +0 -26
  56. package/dist/src/data/solver/z3/z3Solver.d.ts +0 -12
  57. package/dist/src/data/solver/z3/z3Solver.js +0 -123
  58. package/dist/src/data/solver/z3/z3SolverContext.d.ts +0 -13
  59. package/dist/src/data/solver/z3/z3SolverContext.js +0 -40
@@ -23,7 +23,7 @@ export default class HouseSymbol extends NumberSymbol {
23
23
  countTiles(grid: GridData): {
24
24
  completed: number;
25
25
  possible: number;
26
- };
26
+ } | null;
27
27
  copyWith({ x, y, number, }: {
28
28
  x?: number;
29
29
  y?: number;
@@ -65,6 +65,8 @@ export default class HouseSymbol extends NumberSymbol {
65
65
  return HouseSymbol.EXAMPLE_GRID;
66
66
  }
67
67
  countTiles(grid) {
68
+ if (!this.validateSubtilePlacement(grid))
69
+ return null;
68
70
  const thisX = Math.floor(this.x);
69
71
  const thisY = Math.floor(this.y);
70
72
  const visited = array(grid.width, grid.height, () => false);
@@ -67,6 +67,8 @@ export default class LetterSymbol extends Symbol {
67
67
  return LetterSymbol.EXAMPLE_GRID;
68
68
  }
69
69
  validateSymbol(grid) {
70
+ if (!this.validateSubtilePlacement(grid))
71
+ return State.Error;
70
72
  const thisX = Math.floor(this.x);
71
73
  const thisY = Math.floor(this.y);
72
74
  let complete = true;
@@ -12,7 +12,7 @@ export default abstract class NumberSymbol extends Symbol {
12
12
  abstract countTiles(grid: GridData): {
13
13
  completed: number;
14
14
  possible: number;
15
- };
15
+ } | null;
16
16
  validateSymbol(grid: GridData): State;
17
17
  withNumber(number: number): this;
18
18
  }
@@ -15,7 +15,10 @@ export default class NumberSymbol extends Symbol {
15
15
  this.number = number;
16
16
  }
17
17
  validateSymbol(grid) {
18
- const { completed, possible } = this.countTiles(grid);
18
+ const countResult = this.countTiles(grid);
19
+ if (countResult === null)
20
+ return State.Error;
21
+ const { completed, possible } = countResult;
19
22
  if (completed > this.number || possible < this.number)
20
23
  return State.Error;
21
24
  if (completed === this.number && possible === this.number)
@@ -20,5 +20,10 @@ export default abstract class Symbol extends Instruction implements GridResizeHa
20
20
  withX(x: number): this;
21
21
  withY(y: number): this;
22
22
  withPosition(x: number, y: number): this;
23
+ /**
24
+ * For symbols that can be placed between tiles, this method implements the default validation logic,
25
+ * which requires all tiles touching the symbol to be either gray or of the same color.
26
+ */
27
+ protected validateSubtilePlacement(grid: GridData): boolean;
23
28
  }
24
29
  export declare const instance: undefined;
@@ -1,4 +1,5 @@
1
1
  import Instruction from '../instruction.js';
2
+ import { Color } from '../primitives.js';
2
3
  export default class Symbol extends Instruction {
3
4
  x;
4
5
  y;
@@ -51,5 +52,36 @@ export default class Symbol extends Instruction {
51
52
  withPosition(x, y) {
52
53
  return this.copyWith({ x, y });
53
54
  }
55
+ /**
56
+ * For symbols that can be placed between tiles, this method implements the default validation logic,
57
+ * which requires all tiles touching the symbol to be either gray or of the same color.
58
+ */
59
+ validateSubtilePlacement(grid) {
60
+ if (this.placementStep >= 1)
61
+ return true;
62
+ const minX = Math.floor(this.x);
63
+ const minY = Math.floor(this.y);
64
+ if (minX === this.x && minY === this.y)
65
+ return true;
66
+ const maxX = Math.ceil(this.x);
67
+ const maxY = Math.ceil(this.y);
68
+ let color = Color.Gray;
69
+ for (let i = 0; i < 4; i++) {
70
+ const x = i % 2 === 0 ? minX : maxX;
71
+ const y = i < 2 ? minY : maxY;
72
+ const tile = grid.getTile(x, y);
73
+ if (!tile.exists)
74
+ return false;
75
+ if (tile.color !== Color.Gray) {
76
+ if (color === Color.Gray) {
77
+ color = tile.color;
78
+ }
79
+ else if (color !== tile.color) {
80
+ return false;
81
+ }
82
+ }
83
+ }
84
+ return true;
85
+ }
54
86
  }
55
87
  export const instance = undefined;
@@ -58,7 +58,7 @@ import { getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid
58
58
  import { allSolvers } from './data/solver/allSolvers.js';
59
59
  import AutoSolver from './data/solver/auto/autoSolver.js';
60
60
  import BacktrackSolver from './data/solver/backtrack/backtrackSolver.js';
61
- import BTModule, { BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor } from './data/solver/backtrack/data.js';
61
+ import BTModule, { BTGridData, BTTile, IntArray2D, checkSubtilePlacement, colorToBTTile, createOneTileResult, getOppositeColor } from './data/solver/backtrack/data.js';
62
62
  import BanPatternBTModule from './data/solver/backtrack/rules/banPattern.js';
63
63
  import CellCountBTModule from './data/solver/backtrack/rules/cellCount.js';
64
64
  import ConnectAllBTModule from './data/solver/backtrack/rules/connectAll.js';
@@ -82,19 +82,6 @@ import { gridToJson } from './data/solver/cspuz/jsonify.js';
82
82
  import EventIteratingSolver from './data/solver/eventIteratingSolver.js';
83
83
  import Solver from './data/solver/solver.js';
84
84
  import UniversalSolver from './data/solver/universal/universalSolver.js';
85
- import AreaNumberModule from './data/solver/z3/modules/areaNumberModule.js';
86
- import CellCountModule from './data/solver/z3/modules/cellCountModule.js';
87
- import ConnectAllModule from './data/solver/z3/modules/connectAllModule.js';
88
- import DartModule from './data/solver/z3/modules/dartModule.js';
89
- import { allZ3Modules } from './data/solver/z3/modules/index.js';
90
- import LetterModule from './data/solver/z3/modules/letterModule.js';
91
- import MyopiaModule from './data/solver/z3/modules/myopiaModule.js';
92
- import RegionAreaModule from './data/solver/z3/modules/regionAreaModule.js';
93
- import ViewpointModule from './data/solver/z3/modules/viewpointModule.js';
94
- import Z3Module from './data/solver/z3/modules/z3Module.js';
95
- import { convertDirection } from './data/solver/z3/utils.js';
96
- import Z3Solver from './data/solver/z3/z3Solver.js';
97
- import Z3SolverContext from './data/solver/z3/z3SolverContext.js';
98
85
  import AreaNumberSymbol from './data/symbols/areaNumberSymbol.js';
99
86
  import CustomIconSymbol from './data/symbols/customIconSymbol.js';
100
87
  import CustomSymbol from './data/symbols/customSymbol.js';
@@ -118,4 +105,4 @@ import TileData from './data/tile.js';
118
105
  import TileConnections from './data/tileConnections.js';
119
106
  import validateGrid, { aggregateState, applyFinalOverrides } from './data/validate.js';
120
107
  import { GridValidator } from './data/validateAsync.js';
121
- export { ConfigType, configEquals, Configurable, CachedAccess, allEqual, array, directionToRotation, escape, isSameEdge, maxBy, minBy, move, orientationToRotation, resize, unescape, isEventHandler, handlesFinalValidation, handlesGetTile, handlesGridChange, handlesGridResize, handlesSetGrid, invokeSetGrid, handlesSymbolDisplay, handlesSymbolMerge, handlesSymbolValidation, GridData, NEIGHBOR_OFFSETS, NEIGHBOR_OFFSETS_8, GridConnections, GridZones, Instruction, COMPARISONS, Color, Comparison, DIRECTIONS, DRUM_SAMPLES, Direction, INSTRUMENTS, Instrument, MajorRule, Mode, ORIENTATIONS, Orientation, PuzzleType, State, WRAPPINGS, Wrapping, directionToggle, isDrumSample, orientationToggle, MetadataSchema, PuzzleSchema, getPuzzleTypes, puzzleEquals, validatePuzzleChecklist, BanPatternRule, CellCountPerZoneRule, CellCountRule, CompletePatternRule, ConnectAllRule, ConnectZonesRule, ContainsShapeRule, CustomRule, DifferentCountPerZoneRule, ExactCountPerZoneRule, ForesightRule, allRules, LyingSymbolRule, ControlLine, Row, MusicGridRule, MysteryRule, NoLoopsRule, OffByXRule, PerfectionRule, RegionAreaRule, RegionShapeRule, Rule, SameCountPerZoneRule, SameShapeRule, SymbolsPerRegionRule, UndercluedRule, UniqueShapeRule, WrapAroundRule, Serializer, Compressor, ChecksumCompressor, CompressorBase, DeflateCompressor, GzipCompressor, StreamCompressor, SerializerBase, SerializerChecksum, SerializerV0, OFFSETS, orientationChars, getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid, shapeEquals, tilesToShape, allSolvers, AutoSolver, BacktrackSolver, BTModule, BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor, BanPatternBTModule, CellCountBTModule, ConnectAllBTModule, RegionAreaBTModule, RegionShapeBTModule, SameShapeBTModule, SymbolsPerRegionBTModule, UniqueShapeBTModule, AreaNumberBTModule, DartBTModule, DirectionLinkerBTModule, FocusBTModule, GalaxyBTModule, LetterBTModule, LotusBTModule, MinesweeperBTModule, MyopiaBTModule, ViewpointBTModule, CspuzSolver, gridToJson, EventIteratingSolver, Solver, UniversalSolver, AreaNumberModule, CellCountModule, ConnectAllModule, DartModule, allZ3Modules, LetterModule, MyopiaModule, RegionAreaModule, ViewpointModule, Z3Module, convertDirection, Z3Solver, Z3SolverContext, AreaNumberSymbol, CustomIconSymbol, CustomSymbol, CustomTextSymbol, DartSymbol, DirectionLinkerSymbol, EveryLetterSymbol, FocusSymbol, GalaxySymbol, HiddenSymbol, HouseSymbol, allSymbols, LetterSymbol, LotusSymbol, MinesweeperSymbol, MyopiaSymbol, NumberSymbol, Symbol, ViewpointSymbol, TileData, TileConnections, validateGrid, aggregateState, applyFinalOverrides, GridValidator, };
108
+ export { ConfigType, configEquals, Configurable, CachedAccess, allEqual, array, directionToRotation, escape, isSameEdge, maxBy, minBy, move, orientationToRotation, resize, unescape, isEventHandler, handlesFinalValidation, handlesGetTile, handlesGridChange, handlesGridResize, handlesSetGrid, invokeSetGrid, handlesSymbolDisplay, handlesSymbolMerge, handlesSymbolValidation, GridData, NEIGHBOR_OFFSETS, NEIGHBOR_OFFSETS_8, GridConnections, GridZones, Instruction, COMPARISONS, Color, Comparison, DIRECTIONS, DRUM_SAMPLES, Direction, INSTRUMENTS, Instrument, MajorRule, Mode, ORIENTATIONS, Orientation, PuzzleType, State, WRAPPINGS, Wrapping, directionToggle, isDrumSample, orientationToggle, MetadataSchema, PuzzleSchema, getPuzzleTypes, puzzleEquals, validatePuzzleChecklist, BanPatternRule, CellCountPerZoneRule, CellCountRule, CompletePatternRule, ConnectAllRule, ConnectZonesRule, ContainsShapeRule, CustomRule, DifferentCountPerZoneRule, ExactCountPerZoneRule, ForesightRule, allRules, LyingSymbolRule, ControlLine, Row, MusicGridRule, MysteryRule, NoLoopsRule, OffByXRule, PerfectionRule, RegionAreaRule, RegionShapeRule, Rule, SameCountPerZoneRule, SameShapeRule, SymbolsPerRegionRule, UndercluedRule, UniqueShapeRule, WrapAroundRule, Serializer, Compressor, ChecksumCompressor, CompressorBase, DeflateCompressor, GzipCompressor, StreamCompressor, SerializerBase, SerializerChecksum, SerializerV0, OFFSETS, orientationChars, getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid, shapeEquals, tilesToShape, allSolvers, AutoSolver, BacktrackSolver, BTModule, BTGridData, BTTile, IntArray2D, checkSubtilePlacement, colorToBTTile, createOneTileResult, getOppositeColor, BanPatternBTModule, CellCountBTModule, ConnectAllBTModule, RegionAreaBTModule, RegionShapeBTModule, SameShapeBTModule, SymbolsPerRegionBTModule, UniqueShapeBTModule, AreaNumberBTModule, DartBTModule, DirectionLinkerBTModule, FocusBTModule, GalaxyBTModule, LetterBTModule, LotusBTModule, MinesweeperBTModule, MyopiaBTModule, ViewpointBTModule, CspuzSolver, gridToJson, EventIteratingSolver, Solver, UniversalSolver, AreaNumberSymbol, CustomIconSymbol, CustomSymbol, CustomTextSymbol, DartSymbol, DirectionLinkerSymbol, EveryLetterSymbol, FocusSymbol, GalaxySymbol, HiddenSymbol, HouseSymbol, allSymbols, LetterSymbol, LotusSymbol, MinesweeperSymbol, MyopiaSymbol, NumberSymbol, Symbol, ViewpointSymbol, TileData, TileConnections, validateGrid, aggregateState, applyFinalOverrides, GridValidator, };
package/dist/src/index.js CHANGED
@@ -61,7 +61,7 @@ import { getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid
61
61
  import { allSolvers } from './data/solver/allSolvers.js';
62
62
  import AutoSolver from './data/solver/auto/autoSolver.js';
63
63
  import BacktrackSolver from './data/solver/backtrack/backtrackSolver.js';
64
- import BTModule, { BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor } from './data/solver/backtrack/data.js';
64
+ import BTModule, { BTGridData, BTTile, IntArray2D, checkSubtilePlacement, colorToBTTile, createOneTileResult, getOppositeColor } from './data/solver/backtrack/data.js';
65
65
  import BanPatternBTModule from './data/solver/backtrack/rules/banPattern.js';
66
66
  import CellCountBTModule from './data/solver/backtrack/rules/cellCount.js';
67
67
  import ConnectAllBTModule from './data/solver/backtrack/rules/connectAll.js';
@@ -85,19 +85,6 @@ import { gridToJson } from './data/solver/cspuz/jsonify.js';
85
85
  import EventIteratingSolver from './data/solver/eventIteratingSolver.js';
86
86
  import Solver from './data/solver/solver.js';
87
87
  import UniversalSolver from './data/solver/universal/universalSolver.js';
88
- import AreaNumberModule from './data/solver/z3/modules/areaNumberModule.js';
89
- import CellCountModule from './data/solver/z3/modules/cellCountModule.js';
90
- import ConnectAllModule from './data/solver/z3/modules/connectAllModule.js';
91
- import DartModule from './data/solver/z3/modules/dartModule.js';
92
- import { allZ3Modules } from './data/solver/z3/modules/index.js';
93
- import LetterModule from './data/solver/z3/modules/letterModule.js';
94
- import MyopiaModule from './data/solver/z3/modules/myopiaModule.js';
95
- import RegionAreaModule from './data/solver/z3/modules/regionAreaModule.js';
96
- import ViewpointModule from './data/solver/z3/modules/viewpointModule.js';
97
- import Z3Module from './data/solver/z3/modules/z3Module.js';
98
- import { convertDirection } from './data/solver/z3/utils.js';
99
- import Z3Solver from './data/solver/z3/z3Solver.js';
100
- import Z3SolverContext from './data/solver/z3/z3SolverContext.js';
101
88
  import AreaNumberSymbol from './data/symbols/areaNumberSymbol.js';
102
89
  import CustomIconSymbol from './data/symbols/customIconSymbol.js';
103
90
  import CustomSymbol from './data/symbols/customSymbol.js';
@@ -121,4 +108,4 @@ import TileData from './data/tile.js';
121
108
  import TileConnections from './data/tileConnections.js';
122
109
  import validateGrid, { aggregateState, applyFinalOverrides } from './data/validate.js';
123
110
  import { GridValidator } from './data/validateAsync.js';
124
- export { ConfigType, configEquals, Configurable, CachedAccess, allEqual, array, directionToRotation, escape, isSameEdge, maxBy, minBy, move, orientationToRotation, resize, unescape, isEventHandler, handlesFinalValidation, handlesGetTile, handlesGridChange, handlesGridResize, handlesSetGrid, invokeSetGrid, handlesSymbolDisplay, handlesSymbolMerge, handlesSymbolValidation, GridData, NEIGHBOR_OFFSETS, NEIGHBOR_OFFSETS_8, GridConnections, GridZones, Instruction, COMPARISONS, Color, Comparison, DIRECTIONS, DRUM_SAMPLES, Direction, INSTRUMENTS, Instrument, MajorRule, Mode, ORIENTATIONS, Orientation, PuzzleType, State, WRAPPINGS, Wrapping, directionToggle, isDrumSample, orientationToggle, MetadataSchema, PuzzleSchema, getPuzzleTypes, puzzleEquals, validatePuzzleChecklist, BanPatternRule, CellCountPerZoneRule, CellCountRule, CompletePatternRule, ConnectAllRule, ConnectZonesRule, ContainsShapeRule, CustomRule, DifferentCountPerZoneRule, ExactCountPerZoneRule, ForesightRule, allRules, LyingSymbolRule, ControlLine, Row, MusicGridRule, MysteryRule, NoLoopsRule, OffByXRule, PerfectionRule, RegionAreaRule, RegionShapeRule, Rule, SameCountPerZoneRule, SameShapeRule, SymbolsPerRegionRule, UndercluedRule, UniqueShapeRule, WrapAroundRule, Serializer, Compressor, ChecksumCompressor, CompressorBase, DeflateCompressor, GzipCompressor, StreamCompressor, SerializerBase, SerializerChecksum, SerializerV0, OFFSETS, orientationChars, getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid, shapeEquals, tilesToShape, allSolvers, AutoSolver, BacktrackSolver, BTModule, BTGridData, BTTile, IntArray2D, colorToBTTile, createOneTileResult, getOppositeColor, BanPatternBTModule, CellCountBTModule, ConnectAllBTModule, RegionAreaBTModule, RegionShapeBTModule, SameShapeBTModule, SymbolsPerRegionBTModule, UniqueShapeBTModule, AreaNumberBTModule, DartBTModule, DirectionLinkerBTModule, FocusBTModule, GalaxyBTModule, LetterBTModule, LotusBTModule, MinesweeperBTModule, MyopiaBTModule, ViewpointBTModule, CspuzSolver, gridToJson, EventIteratingSolver, Solver, UniversalSolver, AreaNumberModule, CellCountModule, ConnectAllModule, DartModule, allZ3Modules, LetterModule, MyopiaModule, RegionAreaModule, ViewpointModule, Z3Module, convertDirection, Z3Solver, Z3SolverContext, AreaNumberSymbol, CustomIconSymbol, CustomSymbol, CustomTextSymbol, DartSymbol, DirectionLinkerSymbol, EveryLetterSymbol, FocusSymbol, GalaxySymbol, HiddenSymbol, HouseSymbol, allSymbols, LetterSymbol, LotusSymbol, MinesweeperSymbol, MyopiaSymbol, NumberSymbol, Symbol, ViewpointSymbol, TileData, TileConnections, validateGrid, aggregateState, applyFinalOverrides, GridValidator, };
111
+ export { ConfigType, configEquals, Configurable, CachedAccess, allEqual, array, directionToRotation, escape, isSameEdge, maxBy, minBy, move, orientationToRotation, resize, unescape, isEventHandler, handlesFinalValidation, handlesGetTile, handlesGridChange, handlesGridResize, handlesSetGrid, invokeSetGrid, handlesSymbolDisplay, handlesSymbolMerge, handlesSymbolValidation, GridData, NEIGHBOR_OFFSETS, NEIGHBOR_OFFSETS_8, GridConnections, GridZones, Instruction, COMPARISONS, Color, Comparison, DIRECTIONS, DRUM_SAMPLES, Direction, INSTRUMENTS, Instrument, MajorRule, Mode, ORIENTATIONS, Orientation, PuzzleType, State, WRAPPINGS, Wrapping, directionToggle, isDrumSample, orientationToggle, MetadataSchema, PuzzleSchema, getPuzzleTypes, puzzleEquals, validatePuzzleChecklist, BanPatternRule, CellCountPerZoneRule, CellCountRule, CompletePatternRule, ConnectAllRule, ConnectZonesRule, ContainsShapeRule, CustomRule, DifferentCountPerZoneRule, ExactCountPerZoneRule, ForesightRule, allRules, LyingSymbolRule, ControlLine, Row, MusicGridRule, MysteryRule, NoLoopsRule, OffByXRule, PerfectionRule, RegionAreaRule, RegionShapeRule, Rule, SameCountPerZoneRule, SameShapeRule, SymbolsPerRegionRule, UndercluedRule, UniqueShapeRule, WrapAroundRule, Serializer, Compressor, ChecksumCompressor, CompressorBase, DeflateCompressor, GzipCompressor, StreamCompressor, SerializerBase, SerializerChecksum, SerializerV0, OFFSETS, orientationChars, getShapeVariants, normalizeShape, positionsToShape, sanitizePatternGrid, shapeEquals, tilesToShape, allSolvers, AutoSolver, BacktrackSolver, BTModule, BTGridData, BTTile, IntArray2D, checkSubtilePlacement, colorToBTTile, createOneTileResult, getOppositeColor, BanPatternBTModule, CellCountBTModule, ConnectAllBTModule, RegionAreaBTModule, RegionShapeBTModule, SameShapeBTModule, SymbolsPerRegionBTModule, UniqueShapeBTModule, AreaNumberBTModule, DartBTModule, DirectionLinkerBTModule, FocusBTModule, GalaxyBTModule, LetterBTModule, LotusBTModule, MinesweeperBTModule, MyopiaBTModule, ViewpointBTModule, CspuzSolver, gridToJson, EventIteratingSolver, Solver, UniversalSolver, AreaNumberSymbol, CustomIconSymbol, CustomSymbol, CustomTextSymbol, DartSymbol, DirectionLinkerSymbol, EveryLetterSymbol, FocusSymbol, GalaxySymbol, HiddenSymbol, HouseSymbol, allSymbols, LetterSymbol, LotusSymbol, MinesweeperSymbol, MyopiaSymbol, NumberSymbol, Symbol, ViewpointSymbol, TileData, TileConnections, validateGrid, aggregateState, applyFinalOverrides, GridValidator, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logic-pad/core",
3
- "version": "0.25.3",
3
+ "version": "0.26.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -54,10 +54,8 @@
54
54
  "dependencies": {
55
55
  "compression-streams-polyfill": "^0.1.7",
56
56
  "event-iterator": "^2.0.0",
57
- "grilops": "^0.1.2",
58
57
  "lodash": "^4.17.21",
59
58
  "logic-pad-solver-core": "^0.1.2",
60
- "z3-solver": "^4.13.0",
61
59
  "zod": "^4.0.17"
62
60
  },
63
61
  "devDependencies": {
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class AreaNumberModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: AreaNumberModule;
@@ -1,27 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as areaNumberInstance, } from '../../../symbols/areaNumberSymbol.js';
3
- import { Point } from 'grilops';
4
- export default class AreaNumberModule extends Z3Module {
5
- id = areaNumberInstance.id;
6
- encode(grid, ctx) {
7
- const symbols = grid.symbols.get(this.id);
8
- // optimizations
9
- if (!symbols || symbols.length === 0) {
10
- return;
11
- }
12
- for (const symbol of symbols) {
13
- if (symbol.number < 1) {
14
- ctx.solver.add(ctx.ctx.Bool.val(false));
15
- return;
16
- }
17
- }
18
- // encode for real
19
- const rc = ctx.regionConstrainer;
20
- for (const symbol of symbols) {
21
- const x = Math.floor(symbol.x);
22
- const y = Math.floor(symbol.y);
23
- ctx.solver.add(rc.regionSizeGrid.get(new Point(y, x)).eq(Math.round(symbol.number)));
24
- }
25
- }
26
- }
27
- export const instance = new AreaNumberModule();
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class CellCountModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: CellCountModule;
@@ -1,51 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { Point } from 'grilops';
3
- import { instance as cellCountInstance, } from '../../../rules/cellCountRule.js';
4
- import { Color } from '../../../primitives.js';
5
- export default class CellCountModule extends Z3Module {
6
- id = cellCountInstance.id;
7
- encode(grid, ctx) {
8
- const rules = grid.rules.filter(rule => rule.id === this.id);
9
- // optimizations
10
- if (rules.length === 0) {
11
- return;
12
- }
13
- const colorMap = new Map();
14
- for (const rule of rules) {
15
- if (colorMap.has(rule.color)) {
16
- if (colorMap.get(rule.color) !== rule.count) {
17
- ctx.solver.add(ctx.ctx.Bool.val(false));
18
- return;
19
- }
20
- }
21
- else {
22
- colorMap.set(rule.color, rule.count);
23
- }
24
- }
25
- for (const [color, count] of colorMap.entries()) {
26
- const { min, max } = grid.getColorCount(color);
27
- if (min > count || max < count) {
28
- ctx.solver.add(ctx.ctx.Bool.val(false));
29
- return;
30
- }
31
- }
32
- if (colorMap.has(Color.Light) && colorMap.has(Color.Dark)) {
33
- if (colorMap.get(Color.Light) + colorMap.get(Color.Dark) !==
34
- grid.getTileCount(true)) {
35
- ctx.solver.add(ctx.ctx.Bool.val(false));
36
- return;
37
- }
38
- }
39
- // encode for real
40
- for (const [color, count] of colorMap.entries()) {
41
- const sumTerms = [];
42
- grid.forEach((tile, x, y) => {
43
- if (tile.exists) {
44
- sumTerms.push(ctx.ctx.If(ctx.grid.cellAt(new Point(y, x)).eq(ctx.symbolSet.indices[color]), 1, 0));
45
- }
46
- });
47
- ctx.solver.add(ctx.ctx.Sum(sumTerms[0], ...sumTerms.slice(1)).eq(count));
48
- }
49
- }
50
- }
51
- export const instance = new CellCountModule();
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class ConnectAllModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: ConnectAllModule;
@@ -1,24 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as connectAllInstance, } from '../../../rules/connectAllRule.js';
3
- export default class ConnectAllModule extends Z3Module {
4
- id = connectAllInstance.id;
5
- encode(grid, ctx) {
6
- const rules = grid.rules.filter(rule => rule.id === this.id);
7
- // optimizations to try to simplify the encoding
8
- if (rules.length === 0) {
9
- return;
10
- }
11
- // encode for real
12
- const rc = ctx.regionConstrainer;
13
- for (const color of new Set(rules.map(rule => rule.color))) {
14
- const sumTerms = [];
15
- for (const [p, cell] of ctx.grid.grid.entries()) {
16
- sumTerms.push(ctx.ctx.If(cell
17
- .eq(ctx.symbolSet.indices[color])
18
- .and(rc.parentGrid.get(p).eq(1)), 1, 0));
19
- }
20
- ctx.solver.add(ctx.ctx.Sum(sumTerms[0], ...sumTerms.slice(1)).eq(1));
21
- }
22
- }
23
- }
24
- export const instance = new ConnectAllModule();
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class DartModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: DartModule;
@@ -1,61 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as dartInstance, } from '../../../symbols/dartSymbol.js';
3
- import { Point, reduceCells } from 'grilops';
4
- import { Color } from '../../../primitives.js';
5
- import { move } from '../../../dataHelper.js';
6
- import { convertDirection } from '../utils.js';
7
- export default class DartModule extends Z3Module {
8
- id = dartInstance.id;
9
- encode(grid, ctx) {
10
- const symbols = grid.symbols.get(this.id);
11
- // optimizations
12
- if (!symbols || symbols.length === 0) {
13
- return;
14
- }
15
- for (const symbol of symbols) {
16
- const x = Math.floor(symbol.x);
17
- const y = Math.floor(symbol.y);
18
- const startPos = move({ x, y }, symbol.orientation);
19
- const tile = grid.getTile(x, y);
20
- if (tile.fixed) {
21
- let min = 0;
22
- let unknown = 0;
23
- grid.iterateDirectionAll(startPos, symbol.orientation, () => true, cell => {
24
- if (!cell.exists)
25
- return;
26
- if (cell.fixed &&
27
- cell.color !== tile.color &&
28
- cell.color !== Color.Gray)
29
- min++;
30
- if (!cell.fixed)
31
- unknown++;
32
- });
33
- if (min > symbol.number || min + unknown < symbol.number) {
34
- ctx.solver.add(ctx.ctx.Bool.val(false));
35
- return;
36
- }
37
- }
38
- else {
39
- let count = 0;
40
- grid.iterateDirectionAll(startPos, symbol.orientation, () => true, cell => {
41
- if (!cell.exists)
42
- return;
43
- count++;
44
- });
45
- if (count < symbol.number) {
46
- ctx.solver.add(ctx.ctx.Bool.val(false));
47
- return;
48
- }
49
- }
50
- }
51
- // encode for real
52
- for (const symbol of symbols) {
53
- const x = Math.floor(symbol.x);
54
- const y = Math.floor(symbol.y);
55
- const startPos = move({ x, y }, symbol.orientation);
56
- const origin = ctx.grid.cellAt(new Point(y, x));
57
- ctx.solver.add(reduceCells(ctx.grid.ctx, ctx.grid, new Point(startPos.y, startPos.x), convertDirection(symbol.orientation), ctx.ctx.Int.val(0), (acc, cell) => ctx.ctx.If(ctx.ctx.Or(cell.eq(origin), cell.eq(ctx.symbolSet.indices.empty)), acc, acc.add(1))).eq(symbol.number));
58
- }
59
- }
60
- }
61
- export const instance = new DartModule();
@@ -1,3 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- declare const allZ3Modules: Map<string, Z3Module>;
3
- export { allZ3Modules };
@@ -1,10 +0,0 @@
1
- import * as modules from './modules.gen.js';
2
- const allZ3Modules = new Map();
3
- function register(prototype) {
4
- allZ3Modules.set(prototype.id, prototype);
5
- }
6
- Object.values(modules).forEach(module => {
7
- if (module)
8
- register(module);
9
- });
10
- export { allZ3Modules };
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class LetterModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: LetterModule;
@@ -1,33 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as letterInstance, } from '../../../symbols/letterSymbol.js';
3
- import { Point } from 'grilops';
4
- export default class LetterModule extends Z3Module {
5
- id = letterInstance.id;
6
- encode(grid, ctx) {
7
- const symbols = grid.symbols.get(this.id);
8
- if (!symbols || symbols.length === 0) {
9
- return;
10
- }
11
- const rc = ctx.regionConstrainer;
12
- const letterMap = new Map();
13
- for (const symbol of symbols) {
14
- const x = Math.floor(symbol.x);
15
- const y = Math.floor(symbol.y);
16
- if (letterMap.has(symbol.letter)) {
17
- ctx.solver.add(letterMap
18
- .get(symbol.letter)
19
- .eq(rc.regionIdGrid.get(new Point(y, x))));
20
- }
21
- else {
22
- letterMap.set(symbol.letter, rc.regionIdGrid.get(new Point(y, x)));
23
- }
24
- }
25
- const letters = Array.from(letterMap.values());
26
- for (let i = 0; i < letters.length - 1; i++) {
27
- for (let j = i + 1; j < letters.length; j++) {
28
- ctx.solver.add(letters[i].neq(letters[j]));
29
- }
30
- }
31
- }
32
- }
33
- export const instance = new LetterModule();
@@ -1,8 +0,0 @@
1
- export { instance as AreaNumberModule } from './areaNumberModule.js';
2
- export { instance as CellCountModule } from './cellCountModule.js';
3
- export { instance as ConnectAllModule } from './connectAllModule.js';
4
- export { instance as DartModule } from './dartModule.js';
5
- export { instance as LetterModule } from './letterModule.js';
6
- export { instance as MyopiaModule } from './myopiaModule.js';
7
- export { instance as RegionAreaModule } from './regionAreaModule.js';
8
- export { instance as ViewpointModule } from './viewpointModule.js';
@@ -1,12 +0,0 @@
1
- /* prettier-ignore-start */
2
- /* eslint-disable */
3
- // @ts-nocheck
4
- // noinspection JSUnusedGlobalSymbols
5
- export { instance as AreaNumberModule } from './areaNumberModule.js';
6
- export { instance as CellCountModule } from './cellCountModule.js';
7
- export { instance as ConnectAllModule } from './connectAllModule.js';
8
- export { instance as DartModule } from './dartModule.js';
9
- export { instance as LetterModule } from './letterModule.js';
10
- export { instance as MyopiaModule } from './myopiaModule.js';
11
- export { instance as RegionAreaModule } from './regionAreaModule.js';
12
- export { instance as ViewpointModule } from './viewpointModule.js';
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class MyopiaModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: MyopiaModule;
@@ -1,56 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as myopiaInstance, } from '../../../symbols/myopiaSymbol.js';
3
- import { Point, reduceCells } from 'grilops';
4
- import { DIRECTIONS, ORIENTATIONS } from '../../../primitives.js';
5
- import { convertDirection } from '../utils.js';
6
- import { move } from '../../../dataHelper.js';
7
- export default class MyopiaModule extends Z3Module {
8
- id = myopiaInstance.id;
9
- encode(grid, ctx) {
10
- const symbols = grid.symbols.get(this.id);
11
- // optimizations
12
- if (!symbols || symbols.length === 0) {
13
- return;
14
- }
15
- // encode for real
16
- for (const symbol of symbols) {
17
- const x = Math.floor(symbol.x);
18
- const y = Math.floor(symbol.y);
19
- const startPos = new Point(y, x);
20
- const origin = ctx.grid.cellAt(new Point(y, x));
21
- const pointedTerms = [];
22
- const otherTerms = [];
23
- ORIENTATIONS.filter(d => symbol.directions[d]).forEach(direction => {
24
- pointedTerms.push(reduceCells(ctx.grid.ctx, ctx.grid, startPos, convertDirection(direction), ctx.ctx.Int.val(0), (acc, cell, p) => {
25
- const nextPos = move({ x: p.x, y: p.y }, direction);
26
- if (grid.isPositionValid(nextPos.x, nextPos.y)) {
27
- return ctx.ctx.If(cell.eq(origin), acc.add(1), acc);
28
- }
29
- else {
30
- return ctx.ctx.If(cell.eq(origin), acc.add(Number.MAX_SAFE_INTEGER), acc);
31
- }
32
- }, (_, cell) => cell.neq(origin)));
33
- });
34
- (symbol.diagonals ? ORIENTATIONS : DIRECTIONS)
35
- .filter(d => !symbol.directions[d])
36
- .forEach(direction => {
37
- otherTerms.push(reduceCells(ctx.grid.ctx, ctx.grid, startPos, convertDirection(direction), ctx.ctx.Int.val(0), (acc, cell, p) => {
38
- const nextPos = move({ x: p.x, y: p.y }, direction);
39
- if (grid.isPositionValid(nextPos.x, nextPos.y)) {
40
- return ctx.ctx.If(cell.eq(origin), acc.add(1), acc);
41
- }
42
- else {
43
- return ctx.ctx.If(cell.eq(origin), acc.add(Number.MAX_SAFE_INTEGER), acc);
44
- }
45
- }, (_, cell) => cell.neq(origin)));
46
- });
47
- for (let i = 1; i < pointedTerms.length; i++) {
48
- ctx.solver.add(pointedTerms[i].eq(pointedTerms[0]));
49
- }
50
- for (const otherTerm of otherTerms) {
51
- ctx.solver.add(otherTerm.gt(pointedTerms[0]));
52
- }
53
- }
54
- }
55
- }
56
- export const instance = new MyopiaModule();
@@ -1,9 +0,0 @@
1
- import { Solver, Optimize } from 'z3-solver';
2
- import GridData from '../../../grid.js';
3
- import Z3SolverContext from '../z3SolverContext.js';
4
- import Z3Module from './z3Module.js';
5
- export default class RegionAreaModule extends Z3Module {
6
- readonly id: string;
7
- encode<Name extends string>(grid: GridData, ctx: Z3SolverContext<Name, Solver<Name> | Optimize<Name>>): void;
8
- }
9
- export declare const instance: RegionAreaModule;
@@ -1,40 +0,0 @@
1
- import Z3Module from './z3Module.js';
2
- import { instance as regionAreaInstance, } from '../../../rules/regionAreaRule.js';
3
- export default class RegionAreaModule extends Z3Module {
4
- id = regionAreaInstance.id;
5
- encode(grid, ctx) {
6
- const rules = grid.rules.filter(rule => rule.id === this.id);
7
- // optimizations
8
- if (rules.length === 0) {
9
- return;
10
- }
11
- const colorMap = new Map();
12
- for (const rule of rules) {
13
- if (colorMap.has(rule.color)) {
14
- if (colorMap.get(rule.color) !== rule.size) {
15
- ctx.solver.add(ctx.ctx.Bool.val(false));
16
- return;
17
- }
18
- }
19
- else {
20
- colorMap.set(rule.color, rule.size);
21
- }
22
- }
23
- for (const [color, count] of colorMap.entries()) {
24
- if (count < 0 || count > grid.getColorCount(color).max) {
25
- ctx.solver.add(ctx.ctx.Bool.val(false));
26
- return;
27
- }
28
- }
29
- // encode for real
30
- const rc = ctx.regionConstrainer;
31
- for (const [color, count] of colorMap.entries()) {
32
- for (const [p, cell] of ctx.grid.grid.entries()) {
33
- ctx.solver.add(cell
34
- .eq(ctx.symbolSet.indices[color])
35
- .implies(rc.regionSizeGrid.get(p).eq(count)));
36
- }
37
- }
38
- }
39
- }
40
- export const instance = new RegionAreaModule();