@logic-pad/core 0.26.0 → 0.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -31
- package/assets/logic-core.global.d.ts +3264 -3247
- package/package.json +4 -1
- package/dist/benchmark/helper.d.ts +0 -21
- package/dist/benchmark/helper.js +0 -34
- package/dist/benchmark/prepareBench.d.ts +0 -1
- package/dist/benchmark/prepareBench.js +0 -140
- package/dist/benchmark/runBench.d.ts +0 -1
- package/dist/benchmark/runBench.js +0 -206
- package/dist/src/data/config.d.ts +0 -119
- package/dist/src/data/config.js +0 -72
- package/dist/src/data/configurable.d.ts +0 -14
- package/dist/src/data/configurable.js +0 -26
- package/dist/src/data/dataHelper.d.ts +0 -92
- package/dist/src/data/dataHelper.js +0 -217
- package/dist/src/data/events/eventHelper.d.ts +0 -1
- package/dist/src/data/events/eventHelper.js +0 -6
- package/dist/src/data/events/onFinalValidation.d.ts +0 -14
- package/dist/src/data/events/onFinalValidation.js +0 -4
- package/dist/src/data/events/onGetTile.d.ts +0 -7
- package/dist/src/data/events/onGetTile.js +0 -4
- package/dist/src/data/events/onGridChange.d.ts +0 -6
- package/dist/src/data/events/onGridChange.js +0 -4
- package/dist/src/data/events/onGridResize.d.ts +0 -9
- package/dist/src/data/events/onGridResize.js +0 -4
- package/dist/src/data/events/onSetGrid.d.ts +0 -7
- package/dist/src/data/events/onSetGrid.js +0 -19
- package/dist/src/data/events/onSymbolDisplay.d.ts +0 -16
- package/dist/src/data/events/onSymbolDisplay.js +0 -4
- package/dist/src/data/events/onSymbolMerge.d.ts +0 -10
- package/dist/src/data/events/onSymbolMerge.js +0 -4
- package/dist/src/data/events/onSymbolValidation.d.ts +0 -18
- package/dist/src/data/events/onSymbolValidation.js +0 -4
- package/dist/src/data/grid.d.ts +0 -410
- package/dist/src/data/grid.js +0 -1106
- package/dist/src/data/gridConnections.d.ts +0 -25
- package/dist/src/data/gridConnections.js +0 -309
- package/dist/src/data/gridZones.d.ts +0 -26
- package/dist/src/data/gridZones.js +0 -117
- package/dist/src/data/instruction.d.ts +0 -26
- package/dist/src/data/instruction.js +0 -29
- package/dist/src/data/primitives.d.ts +0 -138
- package/dist/src/data/primitives.js +0 -177
- package/dist/src/data/puzzle.d.ts +0 -73
- package/dist/src/data/puzzle.js +0 -105
- package/dist/src/data/rules/banPatternRule.d.ts +0 -30
- package/dist/src/data/rules/banPatternRule.js +0 -125
- package/dist/src/data/rules/cellCountPerZoneRule.d.ts +0 -23
- package/dist/src/data/rules/cellCountPerZoneRule.js +0 -39
- package/dist/src/data/rules/cellCountRule.d.ts +0 -33
- package/dist/src/data/rules/cellCountRule.js +0 -138
- package/dist/src/data/rules/completePatternRule.d.ts +0 -24
- package/dist/src/data/rules/completePatternRule.js +0 -46
- package/dist/src/data/rules/connectAllRule.d.ts +0 -29
- package/dist/src/data/rules/connectAllRule.js +0 -88
- package/dist/src/data/rules/connectZonesRule.d.ts +0 -29
- package/dist/src/data/rules/connectZonesRule.js +0 -111
- package/dist/src/data/rules/containsShapeRule.d.ts +0 -34
- package/dist/src/data/rules/containsShapeRule.js +0 -125
- package/dist/src/data/rules/customRule.d.ts +0 -34
- package/dist/src/data/rules/customRule.js +0 -74
- package/dist/src/data/rules/differentCountPerZoneRule.d.ts +0 -30
- package/dist/src/data/rules/differentCountPerZoneRule.js +0 -96
- package/dist/src/data/rules/exactCountPerZoneRule.d.ts +0 -33
- package/dist/src/data/rules/exactCountPerZoneRule.js +0 -99
- package/dist/src/data/rules/foresightRule.d.ts +0 -36
- package/dist/src/data/rules/foresightRule.js +0 -107
- package/dist/src/data/rules/index.d.ts +0 -3
- package/dist/src/data/rules/index.js +0 -10
- package/dist/src/data/rules/lyingSymbolRule.d.ts +0 -31
- package/dist/src/data/rules/lyingSymbolRule.js +0 -207
- package/dist/src/data/rules/musicControlLine.d.ts +0 -82
- package/dist/src/data/rules/musicControlLine.js +0 -167
- package/dist/src/data/rules/musicGridRule.d.ts +0 -51
- package/dist/src/data/rules/musicGridRule.js +0 -212
- package/dist/src/data/rules/mysteryRule.d.ts +0 -39
- package/dist/src/data/rules/mysteryRule.js +0 -146
- package/dist/src/data/rules/noLoopsRule.d.ts +0 -29
- package/dist/src/data/rules/noLoopsRule.js +0 -218
- package/dist/src/data/rules/offByXRule.d.ts +0 -32
- package/dist/src/data/rules/offByXRule.js +0 -124
- package/dist/src/data/rules/perfectionRule.d.ts +0 -45
- package/dist/src/data/rules/perfectionRule.js +0 -158
- package/dist/src/data/rules/regionAreaRule.d.ts +0 -34
- package/dist/src/data/rules/regionAreaRule.js +0 -149
- package/dist/src/data/rules/regionShapeRule.d.ts +0 -22
- package/dist/src/data/rules/regionShapeRule.js +0 -58
- package/dist/src/data/rules/rule.d.ts +0 -18
- package/dist/src/data/rules/rule.js +0 -19
- package/dist/src/data/rules/rules.gen.d.ts +0 -23
- package/dist/src/data/rules/rules.gen.js +0 -27
- package/dist/src/data/rules/sameCountPerZoneRule.d.ts +0 -30
- package/dist/src/data/rules/sameCountPerZoneRule.js +0 -95
- package/dist/src/data/rules/sameShapeRule.d.ts +0 -28
- package/dist/src/data/rules/sameShapeRule.js +0 -68
- package/dist/src/data/rules/symbolsPerRegionRule.d.ts +0 -38
- package/dist/src/data/rules/symbolsPerRegionRule.js +0 -181
- package/dist/src/data/rules/undercluedRule.d.ts +0 -24
- package/dist/src/data/rules/undercluedRule.js +0 -53
- package/dist/src/data/rules/uniqueShapeRule.d.ts +0 -28
- package/dist/src/data/rules/uniqueShapeRule.js +0 -65
- package/dist/src/data/rules/wrapAroundRule.d.ts +0 -36
- package/dist/src/data/rules/wrapAroundRule.js +0 -241
- package/dist/src/data/serializer/allSerializers.d.ts +0 -32
- package/dist/src/data/serializer/allSerializers.js +0 -71
- package/dist/src/data/serializer/compressor/allCompressors.d.ts +0 -14
- package/dist/src/data/serializer/compressor/allCompressors.js +0 -43
- package/dist/src/data/serializer/compressor/checksumCompressor.d.ts +0 -6
- package/dist/src/data/serializer/compressor/checksumCompressor.js +0 -21
- package/dist/src/data/serializer/compressor/compressorBase.d.ts +0 -16
- package/dist/src/data/serializer/compressor/compressorBase.js +0 -2
- package/dist/src/data/serializer/compressor/deflateCompressor.d.ts +0 -7
- package/dist/src/data/serializer/compressor/deflateCompressor.js +0 -17
- package/dist/src/data/serializer/compressor/gzipCompressor.d.ts +0 -5
- package/dist/src/data/serializer/compressor/gzipCompressor.js +0 -9
- package/dist/src/data/serializer/compressor/streamCompressor.d.ts +0 -6
- package/dist/src/data/serializer/compressor/streamCompressor.js +0 -41
- package/dist/src/data/serializer/serializerBase.d.ts +0 -32
- package/dist/src/data/serializer/serializerBase.js +0 -2
- package/dist/src/data/serializer/serializer_checksum.d.ts +0 -35
- package/dist/src/data/serializer/serializer_checksum.js +0 -179
- package/dist/src/data/serializer/serializer_v0.d.ts +0 -55
- package/dist/src/data/serializer/serializer_v0.js +0 -484
- package/dist/src/data/shapes.d.ts +0 -19
- package/dist/src/data/shapes.js +0 -137
- package/dist/src/data/solver/allSolvers.d.ts +0 -3
- package/dist/src/data/solver/allSolvers.js +0 -13
- package/dist/src/data/solver/auto/autoSolver.d.ts +0 -18
- package/dist/src/data/solver/auto/autoSolver.js +0 -153
- package/dist/src/data/solver/backtrack/backtrackSolver.d.ts +0 -11
- package/dist/src/data/solver/backtrack/backtrackSolver.js +0 -52
- package/dist/src/data/solver/backtrack/backtrackWorker.d.ts +0 -1
- package/dist/src/data/solver/backtrack/backtrackWorker.js +0 -308
- package/dist/src/data/solver/backtrack/data.d.ts +0 -47
- package/dist/src/data/solver/backtrack/data.js +0 -151
- package/dist/src/data/solver/backtrack/rules/banPattern.d.ts +0 -9
- package/dist/src/data/solver/backtrack/rules/banPattern.js +0 -77
- package/dist/src/data/solver/backtrack/rules/cellCount.d.ts +0 -7
- package/dist/src/data/solver/backtrack/rules/cellCount.js +0 -25
- package/dist/src/data/solver/backtrack/rules/connectAll.d.ts +0 -7
- package/dist/src/data/solver/backtrack/rules/connectAll.js +0 -44
- package/dist/src/data/solver/backtrack/rules/regionArea.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/regionArea.js +0 -71
- package/dist/src/data/solver/backtrack/rules/regionShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/regionShape.js +0 -57
- package/dist/src/data/solver/backtrack/rules/sameShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/sameShape.js +0 -14
- package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.d.ts +0 -10
- package/dist/src/data/solver/backtrack/rules/symbolsPerRegion.js +0 -82
- package/dist/src/data/solver/backtrack/rules/uniqueShape.d.ts +0 -8
- package/dist/src/data/solver/backtrack/rules/uniqueShape.js +0 -14
- package/dist/src/data/solver/backtrack/symbols/areaNumber.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/areaNumber.js +0 -75
- package/dist/src/data/solver/backtrack/symbols/dart.d.ts +0 -8
- package/dist/src/data/solver/backtrack/symbols/dart.js +0 -45
- package/dist/src/data/solver/backtrack/symbols/directionLinker.d.ts +0 -11
- package/dist/src/data/solver/backtrack/symbols/directionLinker.js +0 -121
- package/dist/src/data/solver/backtrack/symbols/focus.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/focus.js +0 -48
- package/dist/src/data/solver/backtrack/symbols/galaxy.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/galaxy.js +0 -14
- package/dist/src/data/solver/backtrack/symbols/letter.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/letter.js +0 -93
- package/dist/src/data/solver/backtrack/symbols/lotus.d.ts +0 -11
- package/dist/src/data/solver/backtrack/symbols/lotus.js +0 -55
- package/dist/src/data/solver/backtrack/symbols/minesweeper.d.ts +0 -9
- package/dist/src/data/solver/backtrack/symbols/minesweeper.js +0 -44
- package/dist/src/data/solver/backtrack/symbols/myopia.d.ts +0 -7
- package/dist/src/data/solver/backtrack/symbols/myopia.js +0 -73
- package/dist/src/data/solver/backtrack/symbols/viewpoint.d.ts +0 -7
- package/dist/src/data/solver/backtrack/symbols/viewpoint.js +0 -51
- package/dist/src/data/solver/cspuz/cspuzSolver.d.ts +0 -13
- package/dist/src/data/solver/cspuz/cspuzSolver.js +0 -117
- package/dist/src/data/solver/cspuz/cspuzWorker.d.ts +0 -1
- package/dist/src/data/solver/cspuz/cspuzWorker.js +0 -82
- package/dist/src/data/solver/cspuz/jsonify.d.ts +0 -3
- package/dist/src/data/solver/cspuz/jsonify.js +0 -211
- package/dist/src/data/solver/eventIteratingSolver.d.ts +0 -8
- package/dist/src/data/solver/eventIteratingSolver.js +0 -54
- package/dist/src/data/solver/solver.d.ts +0 -77
- package/dist/src/data/solver/solver.js +0 -59
- package/dist/src/data/solver/universal/universalSolver.d.ts +0 -7
- package/dist/src/data/solver/universal/universalSolver.js +0 -13
- package/dist/src/data/solver/universal/universalWorker.d.ts +0 -1
- package/dist/src/data/solver/universal/universalWorker.js +0 -128
- package/dist/src/data/symbols/areaNumberSymbol.d.ts +0 -31
- package/dist/src/data/symbols/areaNumberSymbol.js +0 -80
- package/dist/src/data/symbols/customIconSymbol.d.ts +0 -35
- package/dist/src/data/symbols/customIconSymbol.js +0 -94
- package/dist/src/data/symbols/customSymbol.d.ts +0 -25
- package/dist/src/data/symbols/customSymbol.js +0 -45
- package/dist/src/data/symbols/customTextSymbol.d.ts +0 -35
- package/dist/src/data/symbols/customTextSymbol.js +0 -95
- package/dist/src/data/symbols/dartSymbol.d.ts +0 -36
- package/dist/src/data/symbols/dartSymbol.js +0 -96
- package/dist/src/data/symbols/directionLinkerSymbol.d.ts +0 -29
- package/dist/src/data/symbols/directionLinkerSymbol.js +0 -232
- package/dist/src/data/symbols/everyLetterSymbol.d.ts +0 -32
- package/dist/src/data/symbols/everyLetterSymbol.js +0 -119
- package/dist/src/data/symbols/focusSymbol.d.ts +0 -40
- package/dist/src/data/symbols/focusSymbol.js +0 -159
- package/dist/src/data/symbols/galaxySymbol.d.ts +0 -27
- package/dist/src/data/symbols/galaxySymbol.js +0 -61
- package/dist/src/data/symbols/hiddenSymbol.d.ts +0 -38
- package/dist/src/data/symbols/hiddenSymbol.js +0 -113
- package/dist/src/data/symbols/houseSymbol.d.ts +0 -33
- package/dist/src/data/symbols/houseSymbol.js +0 -104
- package/dist/src/data/symbols/index.d.ts +0 -3
- package/dist/src/data/symbols/index.js +0 -10
- package/dist/src/data/symbols/letterSymbol.d.ts +0 -32
- package/dist/src/data/symbols/letterSymbol.js +0 -118
- package/dist/src/data/symbols/lotusSymbol.d.ts +0 -30
- package/dist/src/data/symbols/lotusSymbol.js +0 -132
- package/dist/src/data/symbols/minesweeperSymbol.d.ts +0 -33
- package/dist/src/data/symbols/minesweeperSymbol.js +0 -106
- package/dist/src/data/symbols/myopiaSymbol.d.ts +0 -37
- package/dist/src/data/symbols/myopiaSymbol.js +0 -182
- package/dist/src/data/symbols/numberSymbol.d.ts +0 -19
- package/dist/src/data/symbols/numberSymbol.js +0 -32
- package/dist/src/data/symbols/symbol.d.ts +0 -29
- package/dist/src/data/symbols/symbol.js +0 -87
- package/dist/src/data/symbols/symbols.gen.d.ts +0 -14
- package/dist/src/data/symbols/symbols.gen.js +0 -18
- package/dist/src/data/symbols/viewpointSymbol.d.ts +0 -32
- package/dist/src/data/symbols/viewpointSymbol.js +0 -95
- package/dist/src/data/tile.d.ts +0 -26
- package/dist/src/data/tile.js +0 -56
- package/dist/src/data/tileConnections.d.ts +0 -25
- package/dist/src/data/tileConnections.js +0 -74
- package/dist/src/data/validate.d.ts +0 -5
- package/dist/src/data/validate.js +0 -131
- package/dist/src/data/validateAsync.d.ts +0 -15
- package/dist/src/data/validateAsync.js +0 -71
- package/dist/src/data/validateAsyncWorker.d.ts +0 -1
- package/dist/src/data/validateAsyncWorker.js +0 -9
- package/dist/src/index.d.ts +0 -108
- package/dist/src/index.js +0 -111
- package/dist/src/polyfill/streamPolyfill.d.ts +0 -2
- package/dist/src/polyfill/streamPolyfill.js +0 -1
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { ConfigType } from '../config.js';
|
|
2
|
-
import GridData from '../grid.js';
|
|
3
|
-
import { Color, State } from '../primitives.js';
|
|
4
|
-
import AreaNumberSymbol from '../symbols/areaNumberSymbol.js';
|
|
5
|
-
import NumberSymbol from '../symbols/numberSymbol.js';
|
|
6
|
-
import Rule from './rule.js';
|
|
7
|
-
export default class OffByXRule extends Rule {
|
|
8
|
-
number;
|
|
9
|
-
title = 'Off By X';
|
|
10
|
-
static CONFIGS = Object.freeze([
|
|
11
|
-
{
|
|
12
|
-
type: ConfigType.Number,
|
|
13
|
-
default: 1,
|
|
14
|
-
min: 1,
|
|
15
|
-
field: 'number',
|
|
16
|
-
description: 'Number',
|
|
17
|
-
configurable: true,
|
|
18
|
-
},
|
|
19
|
-
]);
|
|
20
|
-
static EXAMPLE_GRID = Object.freeze([
|
|
21
|
-
GridData.create(['bbbbb', 'bwbwb', 'bbwwb', 'bbbbb']).withSymbols([
|
|
22
|
-
new AreaNumberSymbol(1, 1, 2),
|
|
23
|
-
new AreaNumberSymbol(3, 2, 2),
|
|
24
|
-
]),
|
|
25
|
-
GridData.create(['bbbbb', 'bwbwb', 'bbbwb', 'bwwwb']).withSymbols([
|
|
26
|
-
new AreaNumberSymbol(1, 1, 3),
|
|
27
|
-
new AreaNumberSymbol(3, 3, 3),
|
|
28
|
-
]),
|
|
29
|
-
GridData.create(['bbbbw', 'bwbbw', 'bbbbw', 'bwwww']).withSymbols([
|
|
30
|
-
new AreaNumberSymbol(1, 1, 4),
|
|
31
|
-
new AreaNumberSymbol(4, 3, 4),
|
|
32
|
-
]),
|
|
33
|
-
GridData.create(['bbbbw', 'bwbbw', 'bbbww', 'wwwww']).withSymbols([
|
|
34
|
-
new AreaNumberSymbol(1, 1, 5),
|
|
35
|
-
new AreaNumberSymbol(4, 3, 5),
|
|
36
|
-
]),
|
|
37
|
-
GridData.create(['bbbww', 'bwbww', 'bbbww', 'wwwww']).withSymbols([
|
|
38
|
-
new AreaNumberSymbol(1, 1, 6),
|
|
39
|
-
new AreaNumberSymbol(4, 3, 6),
|
|
40
|
-
]),
|
|
41
|
-
GridData.create(['wbbww', 'bbwww', 'bbwww', 'wwwww']).withSymbols([
|
|
42
|
-
new AreaNumberSymbol(0, 0, 7),
|
|
43
|
-
new AreaNumberSymbol(4, 3, 7),
|
|
44
|
-
]),
|
|
45
|
-
GridData.create(['wbbww', 'bwwww', 'bwwww', 'wwwww']).withSymbols([
|
|
46
|
-
new AreaNumberSymbol(0, 0, 8),
|
|
47
|
-
new AreaNumberSymbol(4, 3, 8),
|
|
48
|
-
]),
|
|
49
|
-
GridData.create(['wbwww', 'bwwww', 'wwwww', 'wwwww']).withSymbols([
|
|
50
|
-
new AreaNumberSymbol(0, 0, 9),
|
|
51
|
-
new AreaNumberSymbol(4, 3, 9),
|
|
52
|
-
]),
|
|
53
|
-
]);
|
|
54
|
-
static SEARCH_VARIANTS = [new OffByXRule(1).searchVariant()];
|
|
55
|
-
/**
|
|
56
|
-
* **All numbers are off by <number>**
|
|
57
|
-
*
|
|
58
|
-
* @param number - The number that all cells are off by.
|
|
59
|
-
*/
|
|
60
|
-
constructor(number) {
|
|
61
|
-
super();
|
|
62
|
-
this.number = number;
|
|
63
|
-
this.number = number;
|
|
64
|
-
}
|
|
65
|
-
get id() {
|
|
66
|
-
return `off_by_x`;
|
|
67
|
-
}
|
|
68
|
-
get explanation() {
|
|
69
|
-
return `All numbers are off by ${this.number}`;
|
|
70
|
-
}
|
|
71
|
-
get configs() {
|
|
72
|
-
return OffByXRule.CONFIGS;
|
|
73
|
-
}
|
|
74
|
-
createExampleGrid() {
|
|
75
|
-
if (this.number < 1 || this.number >= OffByXRule.EXAMPLE_GRID.length) {
|
|
76
|
-
return GridData.create(['bbbbb', 'bbwbb', 'bbbbb', 'bbbbb']).addSymbol(new AreaNumberSymbol(2, 1, this.number + 1));
|
|
77
|
-
}
|
|
78
|
-
return OffByXRule.EXAMPLE_GRID[this.number - 1];
|
|
79
|
-
}
|
|
80
|
-
get searchVariants() {
|
|
81
|
-
return OffByXRule.SEARCH_VARIANTS;
|
|
82
|
-
}
|
|
83
|
-
validateGrid(grid) {
|
|
84
|
-
return {
|
|
85
|
-
state: grid.getTileCount(true, false, Color.Gray) === 0
|
|
86
|
-
? State.Satisfied
|
|
87
|
-
: State.Incomplete,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
onSymbolValidation(grid, symbol, _validator) {
|
|
91
|
-
if (symbol instanceof NumberSymbol) {
|
|
92
|
-
const counts = symbol.countTiles(grid);
|
|
93
|
-
if (counts === null)
|
|
94
|
-
return State.Error;
|
|
95
|
-
if (counts.completed > symbol.number + this.number ||
|
|
96
|
-
counts.possible < symbol.number - this.number ||
|
|
97
|
-
(counts.completed > symbol.number - this.number &&
|
|
98
|
-
counts.possible < symbol.number + this.number)) {
|
|
99
|
-
return State.Error;
|
|
100
|
-
}
|
|
101
|
-
else if ((counts.completed === symbol.number + this.number ||
|
|
102
|
-
counts.completed === symbol.number - this.number) &&
|
|
103
|
-
counts.completed === counts.possible) {
|
|
104
|
-
return State.Satisfied;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
return State.Incomplete;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
get isSingleton() {
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
copyWith({ number }) {
|
|
118
|
-
return new OffByXRule(number ?? this.number);
|
|
119
|
-
}
|
|
120
|
-
withNumber(number) {
|
|
121
|
-
return this.copyWith({ number });
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
export const instance = new OffByXRule(1);
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { AnyConfig } from '../config.js';
|
|
2
|
-
import GridData from '../grid.js';
|
|
3
|
-
import { GridState, RuleState, Mode } from '../primitives.js';
|
|
4
|
-
import Rule, { SearchVariant } from './rule.js';
|
|
5
|
-
import { SetGridHandler } from '../events/onSetGrid.js';
|
|
6
|
-
import { FinalValidationHandler } from '../events/onFinalValidation.js';
|
|
7
|
-
export default class PerfectionRule extends Rule implements SetGridHandler, FinalValidationHandler {
|
|
8
|
-
readonly editor: boolean;
|
|
9
|
-
readonly title = "Perfection";
|
|
10
|
-
get configExplanation(): string;
|
|
11
|
-
private static readonly EXAMPLE_GRID;
|
|
12
|
-
private static readonly SEARCH_VARIANTS;
|
|
13
|
-
/**
|
|
14
|
-
* **Quest for Perfection: cell colors are final**
|
|
15
|
-
*
|
|
16
|
-
* @param editor - whether to enable editor mode. This field is automatically set by the editor.
|
|
17
|
-
*/
|
|
18
|
-
constructor(editor?: boolean);
|
|
19
|
-
get id(): string;
|
|
20
|
-
get explanation(): string;
|
|
21
|
-
get configs(): readonly AnyConfig[] | null;
|
|
22
|
-
createExampleGrid(): GridData;
|
|
23
|
-
get searchVariants(): SearchVariant[];
|
|
24
|
-
get necessaryForCompletion(): boolean;
|
|
25
|
-
get isSingleton(): boolean;
|
|
26
|
-
modeVariant(mode: Mode): Rule | null;
|
|
27
|
-
validateGrid(grid: GridData): RuleState;
|
|
28
|
-
/**
|
|
29
|
-
* If the grid passes validation but is different from the solution, indicate the error in the final state.
|
|
30
|
-
*/
|
|
31
|
-
onFinalValidation(grid: GridData, solution: GridData | null, state: GridState): GridState;
|
|
32
|
-
private fixTiles;
|
|
33
|
-
private isValid;
|
|
34
|
-
private findSingleError;
|
|
35
|
-
/**
|
|
36
|
-
* Force all tiles to be fixed.
|
|
37
|
-
*
|
|
38
|
-
* If the grid is already wrong, prevent the player from changing it further.
|
|
39
|
-
*/
|
|
40
|
-
onSetGrid(oldGrid: GridData, newGrid: GridData, solution: GridData | null): GridData;
|
|
41
|
-
copyWith({ editor }: {
|
|
42
|
-
editor?: boolean;
|
|
43
|
-
}): this;
|
|
44
|
-
}
|
|
45
|
-
export declare const instance: PerfectionRule;
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import GridData from '../grid.js';
|
|
2
|
-
import { Color, State, Mode, } from '../primitives.js';
|
|
3
|
-
import Rule from './rule.js';
|
|
4
|
-
import CustomIconSymbol from '../symbols/customIconSymbol.js';
|
|
5
|
-
import validateGrid from '../validate.js';
|
|
6
|
-
export default class PerfectionRule extends Rule {
|
|
7
|
-
editor;
|
|
8
|
-
title = 'Perfection';
|
|
9
|
-
get configExplanation() {
|
|
10
|
-
return 'You should allow players to enable perfection mode themselves instead of enforcing this rule.';
|
|
11
|
-
}
|
|
12
|
-
static EXAMPLE_GRID = Object.freeze(GridData.create(['w']).addSymbol(new CustomIconSymbol('', GridData.create(['w']), 0, 0, 'MdStars')));
|
|
13
|
-
static SEARCH_VARIANTS = [
|
|
14
|
-
new PerfectionRule().searchVariant(),
|
|
15
|
-
];
|
|
16
|
-
/**
|
|
17
|
-
* **Quest for Perfection: cell colors are final**
|
|
18
|
-
*
|
|
19
|
-
* @param editor - whether to enable editor mode. This field is automatically set by the editor.
|
|
20
|
-
*/
|
|
21
|
-
constructor(editor = false) {
|
|
22
|
-
super();
|
|
23
|
-
this.editor = editor;
|
|
24
|
-
this.editor = editor;
|
|
25
|
-
}
|
|
26
|
-
get id() {
|
|
27
|
-
return `perfection`;
|
|
28
|
-
}
|
|
29
|
-
get explanation() {
|
|
30
|
-
return `*Quest for Perfection*: cell colors are final`;
|
|
31
|
-
}
|
|
32
|
-
get configs() {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
createExampleGrid() {
|
|
36
|
-
return PerfectionRule.EXAMPLE_GRID;
|
|
37
|
-
}
|
|
38
|
-
get searchVariants() {
|
|
39
|
-
return PerfectionRule.SEARCH_VARIANTS;
|
|
40
|
-
}
|
|
41
|
-
get necessaryForCompletion() {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
get isSingleton() {
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
modeVariant(mode) {
|
|
48
|
-
// only allow this rule in perfection mode
|
|
49
|
-
if (this.editor === (mode === Mode.Create)) {
|
|
50
|
-
return this;
|
|
51
|
-
}
|
|
52
|
-
else if (mode === Mode.Create) {
|
|
53
|
-
return this.copyWith({ editor: true });
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
return this.copyWith({ editor: false });
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
validateGrid(grid) {
|
|
60
|
-
if (grid.getTileCount(true, undefined, Color.Gray) > 0) {
|
|
61
|
-
return { state: State.Incomplete };
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
return { state: State.Satisfied };
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* If the grid passes validation but is different from the solution, indicate the error in the final state.
|
|
69
|
-
*/
|
|
70
|
-
onFinalValidation(grid, solution, state) {
|
|
71
|
-
if (state.final === State.Error)
|
|
72
|
-
return state;
|
|
73
|
-
if (solution === null)
|
|
74
|
-
return state;
|
|
75
|
-
const positions = [];
|
|
76
|
-
grid.tiles.forEach((row, y) => row.forEach((t, x) => {
|
|
77
|
-
if (t.exists &&
|
|
78
|
-
t.color !== Color.Gray &&
|
|
79
|
-
t.color !== solution.getTile(x, y).color) {
|
|
80
|
-
positions.push({ x, y });
|
|
81
|
-
}
|
|
82
|
-
}));
|
|
83
|
-
if (positions.length > 0) {
|
|
84
|
-
const ruleId = grid.rules.indexOf(this);
|
|
85
|
-
return {
|
|
86
|
-
final: State.Error,
|
|
87
|
-
rules: state.rules.map((r, idx) => {
|
|
88
|
-
if (idx === ruleId) {
|
|
89
|
-
return { state: State.Error, positions };
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
return r;
|
|
93
|
-
}
|
|
94
|
-
}),
|
|
95
|
-
symbols: state.symbols,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
return state;
|
|
99
|
-
}
|
|
100
|
-
fixTiles(grid, exclusions) {
|
|
101
|
-
if (grid.getTileCount(true, false, Color.Light) > 0 ||
|
|
102
|
-
grid.getTileCount(true, false, Color.Dark) > 0) {
|
|
103
|
-
return grid.withTiles(tiles => tiles.map((row, y) => row.map((t, x) => t.exists &&
|
|
104
|
-
t.color !== Color.Gray &&
|
|
105
|
-
!exclusions?.some(e => e.x === x && e.y === y)
|
|
106
|
-
? t.withFixed(true)
|
|
107
|
-
: t)));
|
|
108
|
-
}
|
|
109
|
-
return grid;
|
|
110
|
-
}
|
|
111
|
-
isValid(grid, solution) {
|
|
112
|
-
return validateGrid(grid, solution).final !== State.Error;
|
|
113
|
-
}
|
|
114
|
-
findSingleError(grid, solution) {
|
|
115
|
-
if (solution === null)
|
|
116
|
-
return [];
|
|
117
|
-
const positions = [];
|
|
118
|
-
// If a solution is available, we can compare against the solution and allow the user to modify the one single error.
|
|
119
|
-
grid.tiles.forEach((row, y) => row.forEach((t, x) => {
|
|
120
|
-
if (t.exists &&
|
|
121
|
-
t.color !== Color.Gray &&
|
|
122
|
-
t.color !== solution.getTile(x, y).color) {
|
|
123
|
-
positions.push({ x, y });
|
|
124
|
-
}
|
|
125
|
-
}));
|
|
126
|
-
if (positions.length > 1) {
|
|
127
|
-
const connected = grid.connections.getConnectedTiles(positions[0]);
|
|
128
|
-
if (!positions.every(p => connected.some(c => c.x === p.x && c.y === p.y))) {
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return positions;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Force all tiles to be fixed.
|
|
136
|
-
*
|
|
137
|
-
* If the grid is already wrong, prevent the player from changing it further.
|
|
138
|
-
*/
|
|
139
|
-
onSetGrid(oldGrid, newGrid, solution) {
|
|
140
|
-
if (this.editor)
|
|
141
|
-
return newGrid;
|
|
142
|
-
const oldGridIsValid = this.isValid(oldGrid, solution);
|
|
143
|
-
const newGridIsValid = this.isValid(newGrid, solution);
|
|
144
|
-
if (!oldGridIsValid && !newGridIsValid) {
|
|
145
|
-
const oldPositions = this.findSingleError(oldGrid, solution);
|
|
146
|
-
return this.fixTiles(oldGrid, oldPositions);
|
|
147
|
-
}
|
|
148
|
-
else if (!newGridIsValid) {
|
|
149
|
-
const positions = this.findSingleError(newGrid, solution);
|
|
150
|
-
return this.fixTiles(newGrid, positions);
|
|
151
|
-
}
|
|
152
|
-
return this.fixTiles(newGrid);
|
|
153
|
-
}
|
|
154
|
-
copyWith({ editor }) {
|
|
155
|
-
return new PerfectionRule(editor ?? this.editor);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
export const instance = new PerfectionRule();
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { AnyConfig } from '../config.js';
|
|
2
|
-
import GridData from '../grid.js';
|
|
3
|
-
import { Color, RuleState } from '../primitives.js';
|
|
4
|
-
import Rule, { SearchVariant } from './rule.js';
|
|
5
|
-
export default class RegionAreaRule extends Rule {
|
|
6
|
-
readonly color: Color;
|
|
7
|
-
readonly size: number;
|
|
8
|
-
readonly title = "Region Area Size";
|
|
9
|
-
private static readonly CONFIGS;
|
|
10
|
-
private static readonly EXAMPLE_GRID_DARK;
|
|
11
|
-
private static readonly EXAMPLE_GRID_LIGHT;
|
|
12
|
-
private static readonly EXAMPLE_GRID_GRAY;
|
|
13
|
-
private static readonly SEARCH_VARIANTS;
|
|
14
|
-
/**
|
|
15
|
-
* **All <color> regions have area <size>**
|
|
16
|
-
*
|
|
17
|
-
* @param color - The color of the regions.
|
|
18
|
-
* @param size - The area of the regions.
|
|
19
|
-
*/
|
|
20
|
-
constructor(color: Color, size: number);
|
|
21
|
-
get id(): string;
|
|
22
|
-
get explanation(): string;
|
|
23
|
-
get configs(): readonly AnyConfig[] | null;
|
|
24
|
-
createExampleGrid(): GridData;
|
|
25
|
-
get searchVariants(): SearchVariant[];
|
|
26
|
-
validateGrid(grid: GridData): RuleState;
|
|
27
|
-
copyWith({ color, size }: {
|
|
28
|
-
color?: Color;
|
|
29
|
-
size?: number;
|
|
30
|
-
}): this;
|
|
31
|
-
withColor(color: Color): this;
|
|
32
|
-
withSize(size: number): this;
|
|
33
|
-
}
|
|
34
|
-
export declare const instance: RegionAreaRule;
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { ConfigType } from '../config.js';
|
|
2
|
-
import GridData from '../grid.js';
|
|
3
|
-
import { array } from '../dataHelper.js';
|
|
4
|
-
import { Color, State } from '../primitives.js';
|
|
5
|
-
import TileData from '../tile.js';
|
|
6
|
-
import Rule from './rule.js';
|
|
7
|
-
export default class RegionAreaRule extends Rule {
|
|
8
|
-
color;
|
|
9
|
-
size;
|
|
10
|
-
title = 'Region Area Size';
|
|
11
|
-
static CONFIGS = Object.freeze([
|
|
12
|
-
{
|
|
13
|
-
type: ConfigType.Color,
|
|
14
|
-
default: Color.Dark,
|
|
15
|
-
allowGray: false,
|
|
16
|
-
field: 'color',
|
|
17
|
-
description: 'Color',
|
|
18
|
-
configurable: true,
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
type: ConfigType.Number,
|
|
22
|
-
default: 2,
|
|
23
|
-
min: 0,
|
|
24
|
-
field: 'size',
|
|
25
|
-
description: 'Region Size',
|
|
26
|
-
configurable: true,
|
|
27
|
-
},
|
|
28
|
-
]);
|
|
29
|
-
static EXAMPLE_GRID_DARK = Object.freeze([
|
|
30
|
-
GridData.create(['wwwww', 'wwwww', 'wwwww', 'wwwww']),
|
|
31
|
-
GridData.create(['bwwbw', 'wbwwb', 'bwbww', 'wbwwb']),
|
|
32
|
-
GridData.create(['bbwbb', 'wwbww', 'wwbww', 'wwwbb']),
|
|
33
|
-
GridData.create(['bbwww', 'bwbwb', 'wbbwb', 'wwwwb']),
|
|
34
|
-
GridData.create(['bwbbb', 'bbwwb', 'bwbbw', 'wwbbw']),
|
|
35
|
-
GridData.create(['bbbww', 'bbwbw', 'wwbbb', 'wwwbw']),
|
|
36
|
-
GridData.create(['bbbww', 'bbbwb', 'wwwbb', 'wwbbb']),
|
|
37
|
-
GridData.create(['bbbbb', 'bbwww', 'wwwbb', 'bbbbb']),
|
|
38
|
-
GridData.create(['bbbbw', 'bbbww', 'bwwww', 'wwwww']),
|
|
39
|
-
GridData.create(['wwwww', 'bbbbb', 'bbwbb', 'wwwww']),
|
|
40
|
-
GridData.create(['bbbbb', 'bbbww', 'bbwww', 'wwwww']),
|
|
41
|
-
]);
|
|
42
|
-
static EXAMPLE_GRID_LIGHT = Object.freeze(RegionAreaRule.EXAMPLE_GRID_DARK.map(grid => GridData.create(grid.width, grid.height, grid.tiles.map(row => row.map(tile => tile.withColor(tile.color === Color.Dark ? Color.Light : Color.Dark))))));
|
|
43
|
-
static EXAMPLE_GRID_GRAY = Object.freeze(RegionAreaRule.EXAMPLE_GRID_DARK.map(grid => GridData.create(grid.width, grid.height, grid.tiles.map((row, y) => row.map((tile, x) => tile.withColor(tile.color === Color.Dark
|
|
44
|
-
? Color.Gray
|
|
45
|
-
: x % 2 !== y % 2
|
|
46
|
-
? Color.Dark
|
|
47
|
-
: Color.Light))))));
|
|
48
|
-
static SEARCH_VARIANTS = [
|
|
49
|
-
new RegionAreaRule(Color.Dark, 2).searchVariant(),
|
|
50
|
-
new RegionAreaRule(Color.Light, 2).searchVariant(),
|
|
51
|
-
];
|
|
52
|
-
/**
|
|
53
|
-
* **All <color> regions have area <size>**
|
|
54
|
-
*
|
|
55
|
-
* @param color - The color of the regions.
|
|
56
|
-
* @param size - The area of the regions.
|
|
57
|
-
*/
|
|
58
|
-
constructor(color, size) {
|
|
59
|
-
super();
|
|
60
|
-
this.color = color;
|
|
61
|
-
this.size = size;
|
|
62
|
-
this.color = color;
|
|
63
|
-
this.size = size;
|
|
64
|
-
}
|
|
65
|
-
get id() {
|
|
66
|
-
return `region_area`;
|
|
67
|
-
}
|
|
68
|
-
get explanation() {
|
|
69
|
-
return `All ${this.color} regions have area ${this.size}`;
|
|
70
|
-
}
|
|
71
|
-
get configs() {
|
|
72
|
-
return RegionAreaRule.CONFIGS;
|
|
73
|
-
}
|
|
74
|
-
createExampleGrid() {
|
|
75
|
-
if (this.size < RegionAreaRule.EXAMPLE_GRID_DARK.length) {
|
|
76
|
-
switch (this.color) {
|
|
77
|
-
case Color.Dark:
|
|
78
|
-
return RegionAreaRule.EXAMPLE_GRID_DARK[this.size];
|
|
79
|
-
case Color.Light:
|
|
80
|
-
return RegionAreaRule.EXAMPLE_GRID_LIGHT[this.size];
|
|
81
|
-
case Color.Gray:
|
|
82
|
-
return RegionAreaRule.EXAMPLE_GRID_GRAY[this.size];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
let count = this.size;
|
|
87
|
-
const tiles = array(5, 4, (x, y) => {
|
|
88
|
-
count--;
|
|
89
|
-
return new TileData(true, false, count >= 0
|
|
90
|
-
? this.color
|
|
91
|
-
: this.color === Color.Gray
|
|
92
|
-
? x % 2 !== y % 2
|
|
93
|
-
? Color.Dark
|
|
94
|
-
: Color.Light
|
|
95
|
-
: this.color === Color.Light
|
|
96
|
-
? Color.Dark
|
|
97
|
-
: Color.Light);
|
|
98
|
-
});
|
|
99
|
-
return GridData.create(5, 4, tiles);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
get searchVariants() {
|
|
103
|
-
return RegionAreaRule.SEARCH_VARIANTS;
|
|
104
|
-
}
|
|
105
|
-
validateGrid(grid) {
|
|
106
|
-
const visited = array(grid.width, grid.height, (i, j) => !(grid.getTile(i, j).exists && grid.getTile(i, j).color === this.color));
|
|
107
|
-
let complete = true;
|
|
108
|
-
while (true) {
|
|
109
|
-
const seed = grid.find((_tile, x, y) => !visited[y][x]);
|
|
110
|
-
if (!seed)
|
|
111
|
-
break;
|
|
112
|
-
const completed = [];
|
|
113
|
-
const gray = [];
|
|
114
|
-
grid.iterateArea({ x: seed.x, y: seed.y }, tile => tile.color === this.color, (_, x, y) => {
|
|
115
|
-
completed.push({ x, y });
|
|
116
|
-
visited[y][x] = true;
|
|
117
|
-
});
|
|
118
|
-
if (this.color === Color.Gray) {
|
|
119
|
-
gray.push(...completed);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
grid.iterateArea({ x: seed.x, y: seed.y }, tile => tile.color === Color.Gray || tile.color === this.color, (_, x, y) => {
|
|
123
|
-
gray.push({ x, y });
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
if (completed.length > this.size) {
|
|
127
|
-
return { state: State.Error, positions: completed };
|
|
128
|
-
}
|
|
129
|
-
else if (gray.length < this.size) {
|
|
130
|
-
return { state: State.Error, positions: gray };
|
|
131
|
-
}
|
|
132
|
-
else if (completed.length !== this.size ||
|
|
133
|
-
completed.length !== gray.length) {
|
|
134
|
-
complete = false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return complete ? { state: State.Satisfied } : { state: State.Incomplete };
|
|
138
|
-
}
|
|
139
|
-
copyWith({ color, size }) {
|
|
140
|
-
return new RegionAreaRule(color ?? this.color, size ?? this.size);
|
|
141
|
-
}
|
|
142
|
-
withColor(color) {
|
|
143
|
-
return this.copyWith({ color });
|
|
144
|
-
}
|
|
145
|
-
withSize(size) {
|
|
146
|
-
return this.copyWith({ size });
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
export const instance = new RegionAreaRule(Color.Dark, 2);
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import GridData from '../grid.js';
|
|
2
|
-
import { Color, Position } from '../primitives.js';
|
|
3
|
-
import { Shape } from '../shapes.js';
|
|
4
|
-
import Rule from './rule.js';
|
|
5
|
-
export type ShapeRegions = {
|
|
6
|
-
regions: {
|
|
7
|
-
positions: Position[];
|
|
8
|
-
shape: Shape;
|
|
9
|
-
count: number;
|
|
10
|
-
}[];
|
|
11
|
-
complete: boolean;
|
|
12
|
-
};
|
|
13
|
-
export default abstract class RegionShapeRule extends Rule {
|
|
14
|
-
readonly color: Color;
|
|
15
|
-
/**
|
|
16
|
-
* @param color - The color of the regions to compare.
|
|
17
|
-
*/
|
|
18
|
-
constructor(color: Color);
|
|
19
|
-
protected getShapeRegions(grid: GridData): ShapeRegions;
|
|
20
|
-
withColor(color: Color): this;
|
|
21
|
-
}
|
|
22
|
-
export declare const instance: undefined;
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { array } from '../dataHelper.js';
|
|
2
|
-
import { Color } from '../primitives.js';
|
|
3
|
-
import { normalizeShape, positionsToShape, shapeEquals, } from '../shapes.js';
|
|
4
|
-
import Rule from './rule.js';
|
|
5
|
-
export default class RegionShapeRule extends Rule {
|
|
6
|
-
color;
|
|
7
|
-
/**
|
|
8
|
-
* @param color - The color of the regions to compare.
|
|
9
|
-
*/
|
|
10
|
-
constructor(color) {
|
|
11
|
-
super();
|
|
12
|
-
this.color = color;
|
|
13
|
-
this.color = color;
|
|
14
|
-
}
|
|
15
|
-
getShapeRegions(grid) {
|
|
16
|
-
let complete = true;
|
|
17
|
-
const visited = array(grid.width, grid.height, (i, j) => {
|
|
18
|
-
const tile = grid.getTile(i, j);
|
|
19
|
-
if (tile.exists && tile.color === Color.Gray)
|
|
20
|
-
complete = false;
|
|
21
|
-
return !(tile.exists && tile.color === this.color);
|
|
22
|
-
});
|
|
23
|
-
const regions = [];
|
|
24
|
-
while (true) {
|
|
25
|
-
const seed = grid.find((_tile, x, y) => !visited[y][x]);
|
|
26
|
-
if (!seed)
|
|
27
|
-
break;
|
|
28
|
-
const positions = [];
|
|
29
|
-
grid.iterateArea(seed, tile => tile.color === this.color, (_, x, y, logX, logY) => {
|
|
30
|
-
visited[y][x] = true;
|
|
31
|
-
positions.push({ x: logX, y: logY });
|
|
32
|
-
});
|
|
33
|
-
const incomplete = grid.iterateArea(seed, tile => tile.color === this.color || tile.color === Color.Gray, tile => {
|
|
34
|
-
if (tile.color === Color.Gray)
|
|
35
|
-
return true;
|
|
36
|
-
});
|
|
37
|
-
if (incomplete)
|
|
38
|
-
continue;
|
|
39
|
-
const shape = normalizeShape(positionsToShape(positions, this.color));
|
|
40
|
-
const existing = regions.find(island => shapeEquals(island.shape, shape));
|
|
41
|
-
if (existing) {
|
|
42
|
-
existing.count++;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
regions.push({
|
|
46
|
-
positions: positions.map(pos => grid.toArrayCoordinates(pos.x, pos.y)),
|
|
47
|
-
shape,
|
|
48
|
-
count: 1,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return { regions, complete };
|
|
53
|
-
}
|
|
54
|
-
withColor(color) {
|
|
55
|
-
return this.copyWith({ color });
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export const instance = undefined;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import GridData from '../grid.js';
|
|
2
|
-
import { Mode, RuleState } from '../primitives.js';
|
|
3
|
-
import Instruction from '../instruction.js';
|
|
4
|
-
export interface SearchVariant {
|
|
5
|
-
description: string;
|
|
6
|
-
rule: Rule;
|
|
7
|
-
}
|
|
8
|
-
export default abstract class Rule extends Instruction {
|
|
9
|
-
abstract validateGrid(grid: GridData): RuleState;
|
|
10
|
-
abstract get searchVariants(): SearchVariant[];
|
|
11
|
-
searchVariant(): SearchVariant;
|
|
12
|
-
modeVariant(_mode: Mode): Rule | null;
|
|
13
|
-
/**
|
|
14
|
-
* Whether only one instance of this rule is allowed in a grid.
|
|
15
|
-
*/
|
|
16
|
-
get isSingleton(): boolean;
|
|
17
|
-
}
|
|
18
|
-
export declare const instance: undefined;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import Instruction from '../instruction.js';
|
|
2
|
-
export default class Rule extends Instruction {
|
|
3
|
-
searchVariant() {
|
|
4
|
-
return {
|
|
5
|
-
description: this.explanation,
|
|
6
|
-
rule: this,
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
modeVariant(_mode) {
|
|
10
|
-
return this;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Whether only one instance of this rule is allowed in a grid.
|
|
14
|
-
*/
|
|
15
|
-
get isSingleton() {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export const instance = undefined;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export { instance as BanPatternRule } from './banPatternRule.js';
|
|
2
|
-
export { instance as CellCountRule } from './cellCountRule.js';
|
|
3
|
-
export { instance as CompletePatternRule } from './completePatternRule.js';
|
|
4
|
-
export { instance as ConnectAllRule } from './connectAllRule.js';
|
|
5
|
-
export { instance as ConnectZonesRule } from './connectZonesRule.js';
|
|
6
|
-
export { instance as ContainsShapeRule } from './containsShapeRule.js';
|
|
7
|
-
export { instance as CustomRule } from './customRule.js';
|
|
8
|
-
export { instance as DifferentCountPerZoneRule } from './differentCountPerZoneRule.js';
|
|
9
|
-
export { instance as ExactCountPerZoneRule } from './exactCountPerZoneRule.js';
|
|
10
|
-
export { instance as ForesightRule } from './foresightRule.js';
|
|
11
|
-
export { instance as LyingSymbolRule } from './lyingSymbolRule.js';
|
|
12
|
-
export { instance as MusicGridRule } from './musicGridRule.js';
|
|
13
|
-
export { instance as MysteryRule } from './mysteryRule.js';
|
|
14
|
-
export { instance as NoLoopsRule } from './noLoopsRule.js';
|
|
15
|
-
export { instance as OffByXRule } from './offByXRule.js';
|
|
16
|
-
export { instance as PerfectionRule } from './perfectionRule.js';
|
|
17
|
-
export { instance as RegionAreaRule } from './regionAreaRule.js';
|
|
18
|
-
export { instance as SameCountPerZoneRule } from './sameCountPerZoneRule.js';
|
|
19
|
-
export { instance as SameShapeRule } from './sameShapeRule.js';
|
|
20
|
-
export { instance as SymbolsPerRegionRule } from './symbolsPerRegionRule.js';
|
|
21
|
-
export { instance as UndercluedRule } from './undercluedRule.js';
|
|
22
|
-
export { instance as UniqueShapeRule } from './uniqueShapeRule.js';
|
|
23
|
-
export { instance as WrapAroundRule } from './wrapAroundRule.js';
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/* prettier-ignore-start */
|
|
2
|
-
/* eslint-disable */
|
|
3
|
-
// @ts-nocheck
|
|
4
|
-
// noinspection JSUnusedGlobalSymbols
|
|
5
|
-
export { instance as BanPatternRule } from './banPatternRule.js';
|
|
6
|
-
export { instance as CellCountRule } from './cellCountRule.js';
|
|
7
|
-
export { instance as CompletePatternRule } from './completePatternRule.js';
|
|
8
|
-
export { instance as ConnectAllRule } from './connectAllRule.js';
|
|
9
|
-
export { instance as ConnectZonesRule } from './connectZonesRule.js';
|
|
10
|
-
export { instance as ContainsShapeRule } from './containsShapeRule.js';
|
|
11
|
-
export { instance as CustomRule } from './customRule.js';
|
|
12
|
-
export { instance as DifferentCountPerZoneRule } from './differentCountPerZoneRule.js';
|
|
13
|
-
export { instance as ExactCountPerZoneRule } from './exactCountPerZoneRule.js';
|
|
14
|
-
export { instance as ForesightRule } from './foresightRule.js';
|
|
15
|
-
export { instance as LyingSymbolRule } from './lyingSymbolRule.js';
|
|
16
|
-
export { instance as MusicGridRule } from './musicGridRule.js';
|
|
17
|
-
export { instance as MysteryRule } from './mysteryRule.js';
|
|
18
|
-
export { instance as NoLoopsRule } from './noLoopsRule.js';
|
|
19
|
-
export { instance as OffByXRule } from './offByXRule.js';
|
|
20
|
-
export { instance as PerfectionRule } from './perfectionRule.js';
|
|
21
|
-
export { instance as RegionAreaRule } from './regionAreaRule.js';
|
|
22
|
-
export { instance as SameCountPerZoneRule } from './sameCountPerZoneRule.js';
|
|
23
|
-
export { instance as SameShapeRule } from './sameShapeRule.js';
|
|
24
|
-
export { instance as SymbolsPerRegionRule } from './symbolsPerRegionRule.js';
|
|
25
|
-
export { instance as UndercluedRule } from './undercluedRule.js';
|
|
26
|
-
export { instance as UniqueShapeRule } from './uniqueShapeRule.js';
|
|
27
|
-
export { instance as WrapAroundRule } from './wrapAroundRule.js';
|