cubing 0.40.0 → 0.41.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.
- package/dist/esm/bluetooth/index.js +7 -7
- package/dist/esm/bluetooth/index.js.map +2 -2
- package/dist/esm/{chunk-2UHC65GH.js → chunk-2MAPPPWG.js} +5 -5
- package/dist/esm/chunk-2MAPPPWG.js.map +7 -0
- package/dist/esm/{chunk-ZILJKTYP.js → chunk-BTVDGT5H.js} +17 -17
- package/dist/esm/{chunk-JXW26CFJ.js → chunk-DNOZJX34.js} +3 -3
- package/dist/esm/{chunk-F6V2QBMP.js → chunk-F72PPD54.js} +72 -64
- package/dist/esm/chunk-F72PPD54.js.map +7 -0
- package/dist/esm/{chunk-TKIXG2EX.js → chunk-LWPMAFQX.js} +8 -8
- package/dist/esm/chunk-LWPMAFQX.js.map +7 -0
- package/dist/esm/{chunk-TBVTYIMY.js → chunk-QFJEREMI.js} +3 -3
- package/dist/esm/chunk-QFJEREMI.js.map +7 -0
- package/dist/esm/{chunk-IZJ3YK5S.js → chunk-RYRRMKVS.js} +14 -13
- package/dist/esm/chunk-RYRRMKVS.js.map +7 -0
- package/dist/esm/{chunk-NBVZ7LEM.js → chunk-SNYTAYI2.js} +95 -105
- package/dist/esm/chunk-SNYTAYI2.js.map +7 -0
- package/dist/esm/{chunk-NZAWY3EU.js → chunk-UOO5TXR6.js} +29 -29
- package/dist/esm/chunk-UOO5TXR6.js.map +7 -0
- package/dist/esm/{chunk-45VMKYXT.js → chunk-VRFVPBCT.js} +3 -5
- package/dist/esm/chunk-VRFVPBCT.js.map +7 -0
- package/dist/esm/inside-DLVM67HZ.js +17 -0
- package/dist/esm/kpuzzle/index.js +3 -3
- package/dist/esm/notation/index.js +3 -3
- package/dist/esm/protocol/index.js +3 -3
- package/dist/esm/puzzle-geometry/index.js +43 -26
- package/dist/esm/puzzle-geometry/index.js.map +2 -2
- package/dist/esm/puzzles/index.js +3 -3
- package/dist/esm/{puzzles-dynamic-side-events-DHAI7HWB.js → puzzles-dynamic-side-events-42Q52YAB.js} +157 -85
- package/dist/esm/puzzles-dynamic-side-events-42Q52YAB.js.map +7 -0
- package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js → puzzles-dynamic-unofficial-PCHNKY4Y.js} +13 -13
- package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js.map → puzzles-dynamic-unofficial-PCHNKY4Y.js.map} +2 -2
- package/dist/esm/scramble/index.js +7 -7
- package/dist/esm/search/index.js +7 -7
- package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js → search-dynamic-sgs-side-events-7RLPMUUQ.js} +5 -5
- package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js → search-dynamic-sgs-unofficial-IXO75L3Y.js} +5 -5
- package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js → search-dynamic-solve-4x4x4-IP6UC7HF.js} +5 -5
- package/dist/esm/search-worker-entry.js.js +1 -1
- package/dist/esm/twisty/index.js +28 -22
- package/dist/esm/twisty/index.js.map +2 -2
- package/dist/esm/{twisty-dynamic-3d-EI5ZUVCP.js → twisty-dynamic-3d-6SRUMP27.js} +13 -13
- package/dist/esm/twisty-dynamic-3d-6SRUMP27.js.map +7 -0
- package/dist/esm/{twsearch-ZALDQ4TE.js → twsearch-D6TM63UU.js} +8 -8
- package/dist/esm/twsearch-D6TM63UU.js.map +7 -0
- package/dist/types/{KState-33ce1f57.d.ts → KPattern-85fd8579.d.ts} +33 -29
- package/dist/types/{TwizzleLink-19143923.d.ts → TwizzleLink-7d147be8.d.ts} +7 -7
- package/dist/types/bluetooth/index.d.ts +6 -6
- package/dist/types/{bluetooth-puzzle-29072a56.d.ts → bluetooth-puzzle-da601f13.d.ts} +3 -3
- package/dist/types/kpuzzle/index.d.ts +1 -1
- package/dist/types/notation/index.d.ts +2 -2
- package/dist/types/{outside-b7760f77.d.ts → outside-51ce651a.d.ts} +8 -8
- package/dist/types/protocol/index.d.ts +4 -4
- package/dist/types/puzzle-geometry/index.d.ts +2 -2
- package/dist/types/puzzles/index.d.ts +3 -3
- package/dist/types/scramble/index.d.ts +2 -2
- package/dist/types/search/index.d.ts +3 -3
- package/dist/types/stream/index.d.ts +2 -2
- package/dist/types/twisty/index.d.ts +7 -7
- package/package.json +1 -1
- package/dist/esm/chunk-2UHC65GH.js.map +0 -7
- package/dist/esm/chunk-45VMKYXT.js.map +0 -7
- package/dist/esm/chunk-F6V2QBMP.js.map +0 -7
- package/dist/esm/chunk-IZJ3YK5S.js.map +0 -7
- package/dist/esm/chunk-NBVZ7LEM.js.map +0 -7
- package/dist/esm/chunk-NZAWY3EU.js.map +0 -7
- package/dist/esm/chunk-TBVTYIMY.js.map +0 -7
- package/dist/esm/chunk-TKIXG2EX.js.map +0 -7
- package/dist/esm/inside-BGMQCQ2A.js +0 -17
- package/dist/esm/puzzles-dynamic-side-events-DHAI7HWB.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-EI5ZUVCP.js.map +0 -7
- package/dist/esm/twsearch-ZALDQ4TE.js.map +0 -7
- /package/dist/esm/{chunk-ZILJKTYP.js.map → chunk-BTVDGT5H.js.map} +0 -0
- /package/dist/esm/{chunk-JXW26CFJ.js.map → chunk-DNOZJX34.js.map} +0 -0
- /package/dist/esm/{inside-BGMQCQ2A.js.map → inside-DLVM67HZ.js.map} +0 -0
- /package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js.map → search-dynamic-sgs-side-events-7RLPMUUQ.js.map} +0 -0
- /package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js.map → search-dynamic-sgs-unofficial-IXO75L3Y.js.map} +0 -0
- /package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js.map → search-dynamic-solve-4x4x4-IP6UC7HF.js.map} +0 -0
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
experimental3x3x3KPuzzle,
|
|
12
12
|
from,
|
|
13
13
|
getCached
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-SNYTAYI2.js";
|
|
15
15
|
import {
|
|
16
16
|
KPuzzle
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-F72PPD54.js";
|
|
18
18
|
import {
|
|
19
19
|
Move,
|
|
20
20
|
QuantumMove
|
|
@@ -69,12 +69,12 @@ var cube2x2x2 = {
|
|
|
69
69
|
fullName: "2\xD72\xD72 Cube",
|
|
70
70
|
kpuzzle: getCached(
|
|
71
71
|
async () => new KPuzzle(
|
|
72
|
-
(await import("./puzzles-dynamic-side-events-
|
|
72
|
+
(await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2JSON
|
|
73
73
|
)
|
|
74
74
|
),
|
|
75
|
-
svg: async () => (await import("./puzzles-dynamic-side-events-
|
|
75
|
+
svg: async () => (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2SVG,
|
|
76
76
|
llSVG: getCached(
|
|
77
|
-
async () => (await import("./puzzles-dynamic-side-events-
|
|
77
|
+
async () => (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2LLSVG
|
|
78
78
|
),
|
|
79
79
|
pg: getCached(async () => {
|
|
80
80
|
return asyncGetPuzzleGeometry("2x2x2");
|
|
@@ -343,11 +343,11 @@ var clock = {
|
|
|
343
343
|
// Patent application year: https://www.jaapsch.net/puzzles/patents/us4869506.pdf
|
|
344
344
|
kpuzzle: getCached(
|
|
345
345
|
async () => new KPuzzle(
|
|
346
|
-
(await import("./puzzles-dynamic-side-events-
|
|
346
|
+
(await import("./puzzles-dynamic-side-events-42Q52YAB.js")).clockJSON
|
|
347
347
|
)
|
|
348
348
|
),
|
|
349
349
|
svg: getCached(async () => {
|
|
350
|
-
return (await import("./puzzles-dynamic-side-events-
|
|
350
|
+
return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).clockSVG;
|
|
351
351
|
})
|
|
352
352
|
};
|
|
353
353
|
|
|
@@ -457,7 +457,7 @@ var FTOPuzzleLoader = class extends PGPuzzleLoader {
|
|
|
457
457
|
});
|
|
458
458
|
this.stickerings = ftoStickerings;
|
|
459
459
|
this.svg = getCached(async () => {
|
|
460
|
-
return (await import("./puzzles-dynamic-unofficial-
|
|
460
|
+
return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).ftoSVG;
|
|
461
461
|
});
|
|
462
462
|
}
|
|
463
463
|
stickeringMask(stickering) {
|
|
@@ -513,7 +513,7 @@ var PyraminxPuzzleLoader = class extends PGPuzzleLoader {
|
|
|
513
513
|
inventedBy: ["Uwe Meffert"]
|
|
514
514
|
});
|
|
515
515
|
this.svg = getCached(async () => {
|
|
516
|
-
return (await import("./puzzles-dynamic-side-events-
|
|
516
|
+
return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).pyraminxSVG;
|
|
517
517
|
});
|
|
518
518
|
}
|
|
519
519
|
};
|
|
@@ -528,11 +528,11 @@ var square1 = {
|
|
|
528
528
|
// Czech patent application year: http://spisy.upv.cz/Patents/FullDocuments/277/277266.pdf
|
|
529
529
|
kpuzzle: getCached(
|
|
530
530
|
async () => new KPuzzle(
|
|
531
|
-
(await import("./puzzles-dynamic-side-events-
|
|
531
|
+
(await import("./puzzles-dynamic-side-events-42Q52YAB.js")).sq1HyperOrbitJSON
|
|
532
532
|
)
|
|
533
533
|
),
|
|
534
534
|
svg: getCached(async () => {
|
|
535
|
-
return (await import("./puzzles-dynamic-side-events-
|
|
535
|
+
return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).sq1HyperOrbitSVG;
|
|
536
536
|
})
|
|
537
537
|
};
|
|
538
538
|
|
|
@@ -552,7 +552,7 @@ var kilominx = {
|
|
|
552
552
|
includeEdgeOrbits: false
|
|
553
553
|
}),
|
|
554
554
|
svg: getCached(async () => {
|
|
555
|
-
return (await import("./puzzles-dynamic-unofficial-
|
|
555
|
+
return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).kilominxSVG;
|
|
556
556
|
})
|
|
557
557
|
};
|
|
558
558
|
|
|
@@ -566,11 +566,11 @@ var rediCube = {
|
|
|
566
566
|
inventionYear: 2009,
|
|
567
567
|
kpuzzle: getCached(
|
|
568
568
|
async () => new KPuzzle(
|
|
569
|
-
(await import("./puzzles-dynamic-unofficial-
|
|
569
|
+
(await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).rediCubeJSON
|
|
570
570
|
)
|
|
571
571
|
),
|
|
572
572
|
svg: async () => {
|
|
573
|
-
return (await import("./puzzles-dynamic-unofficial-
|
|
573
|
+
return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).rediCubeSVG;
|
|
574
574
|
}
|
|
575
575
|
};
|
|
576
576
|
|
|
@@ -591,11 +591,11 @@ var melindas2x2x2x2 = {
|
|
|
591
591
|
// inventionYear: 20__, // TODO
|
|
592
592
|
kpuzzle: getCached(
|
|
593
593
|
async () => new KPuzzle(
|
|
594
|
-
(await import("./puzzles-dynamic-side-events-
|
|
594
|
+
(await import("./puzzles-dynamic-side-events-42Q52YAB.js")).melindas2x2x2x2OrbitJSON
|
|
595
595
|
)
|
|
596
596
|
),
|
|
597
597
|
svg: getCached(async () => {
|
|
598
|
-
return (await import("./puzzles-dynamic-side-events-
|
|
598
|
+
return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).melindas2x2x2x2OrbitSVG;
|
|
599
599
|
})
|
|
600
600
|
};
|
|
601
601
|
|
|
@@ -660,4 +660,4 @@ export {
|
|
|
660
660
|
cube3x3x3,
|
|
661
661
|
puzzles
|
|
662
662
|
};
|
|
663
|
-
//# sourceMappingURL=chunk-
|
|
663
|
+
//# sourceMappingURL=chunk-BTVDGT5H.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
from
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SNYTAYI2.js";
|
|
4
4
|
|
|
5
5
|
// src/cubing/twisty/debug.ts
|
|
6
6
|
var twistyDebugGlobals = {
|
|
@@ -541,7 +541,7 @@ var StatsPanel = class {
|
|
|
541
541
|
// src/cubing/twisty/heavy-code-imports/3d.ts
|
|
542
542
|
var cachedConstructorProxy = null;
|
|
543
543
|
async function proxy3D() {
|
|
544
|
-
return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-
|
|
544
|
+
return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-6SRUMP27.js"));
|
|
545
545
|
}
|
|
546
546
|
var THREEJS = from(
|
|
547
547
|
async () => (await proxy3D()).T3I
|
|
@@ -1175,4 +1175,4 @@ export {
|
|
|
1175
1175
|
proxy3D,
|
|
1176
1176
|
THREEJS
|
|
1177
1177
|
};
|
|
1178
|
-
//# sourceMappingURL=chunk-
|
|
1178
|
+
//# sourceMappingURL=chunk-DNOZJX34.js.map
|
|
@@ -8,39 +8,38 @@ import {
|
|
|
8
8
|
// src/cubing/kpuzzle/combine.ts
|
|
9
9
|
function combineTransformationData(definition, transformationData1, transformationData2) {
|
|
10
10
|
const newTransformationData = {};
|
|
11
|
-
for (const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const orbit2 = transformationData2[orbitName];
|
|
11
|
+
for (const orbitDefinition of definition.orbits) {
|
|
12
|
+
const orbit1 = transformationData1[orbitDefinition.orbitName];
|
|
13
|
+
const orbit2 = transformationData2[orbitDefinition.orbitName];
|
|
15
14
|
if (isOrbitTransformationDataIdentityUncached(
|
|
16
15
|
orbitDefinition.numOrientations,
|
|
17
16
|
orbit2
|
|
18
17
|
)) {
|
|
19
|
-
newTransformationData[orbitName] = orbit1;
|
|
18
|
+
newTransformationData[orbitDefinition.orbitName] = orbit1;
|
|
20
19
|
} else if (isOrbitTransformationDataIdentityUncached(
|
|
21
20
|
orbitDefinition.numOrientations,
|
|
22
21
|
orbit1
|
|
23
22
|
)) {
|
|
24
|
-
newTransformationData[orbitName] = orbit2;
|
|
23
|
+
newTransformationData[orbitDefinition.orbitName] = orbit2;
|
|
25
24
|
} else {
|
|
26
25
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
27
26
|
if (orbitDefinition.numOrientations === 1) {
|
|
28
27
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
29
28
|
newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];
|
|
30
29
|
}
|
|
31
|
-
newTransformationData[orbitName] = {
|
|
30
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
32
31
|
permutation: newPerm,
|
|
33
|
-
|
|
32
|
+
orientationDelta: orbit1.orientationDelta
|
|
34
33
|
};
|
|
35
34
|
} else {
|
|
36
35
|
const newOri = new Array(orbitDefinition.numPieces);
|
|
37
36
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
38
|
-
newOri[idx] = (orbit1.
|
|
37
|
+
newOri[idx] = (orbit1.orientationDelta[orbit2.permutation[idx]] + orbit2.orientationDelta[idx]) % orbitDefinition.numOrientations;
|
|
39
38
|
newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];
|
|
40
39
|
}
|
|
41
|
-
newTransformationData[orbitName] = {
|
|
40
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
42
41
|
permutation: newPerm,
|
|
43
|
-
|
|
42
|
+
orientationDelta: newOri
|
|
44
43
|
};
|
|
45
44
|
}
|
|
46
45
|
}
|
|
@@ -49,15 +48,14 @@ function combineTransformationData(definition, transformationData1, transformati
|
|
|
49
48
|
}
|
|
50
49
|
function applyTransformationDataToStateData(definition, stateData, transformationData) {
|
|
51
50
|
const newStateData = {};
|
|
52
|
-
for (const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const transformationOrbit = transformationData[orbitName];
|
|
51
|
+
for (const orbitDefinition of definition.orbits) {
|
|
52
|
+
const stateOrbit = stateData[orbitDefinition.orbitName];
|
|
53
|
+
const transformationOrbit = transformationData[orbitDefinition.orbitName];
|
|
56
54
|
if (isOrbitTransformationDataIdentityUncached(
|
|
57
55
|
orbitDefinition.numOrientations,
|
|
58
56
|
transformationOrbit
|
|
59
57
|
)) {
|
|
60
|
-
newStateData[orbitName] = stateOrbit;
|
|
58
|
+
newStateData[orbitDefinition.orbitName] = stateOrbit;
|
|
61
59
|
} else {
|
|
62
60
|
const newPieces = new Array(orbitDefinition.numPieces);
|
|
63
61
|
if (orbitDefinition.numOrientations === 1) {
|
|
@@ -69,7 +67,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
|
|
|
69
67
|
orientation: stateOrbit.orientation
|
|
70
68
|
// copy all 0
|
|
71
69
|
};
|
|
72
|
-
newStateData[orbitName] = newOrbitData;
|
|
70
|
+
newStateData[orbitDefinition.orbitName] = newOrbitData;
|
|
73
71
|
} else {
|
|
74
72
|
const newOrientation = new Array(orbitDefinition.numPieces);
|
|
75
73
|
const newOrientationMod = stateOrbit.orientationMod ? new Array(orbitDefinition.numPieces) : void 0;
|
|
@@ -81,7 +79,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
|
|
|
81
79
|
newOrientationMod[idx] = orientationMod;
|
|
82
80
|
mod = orientationMod || orbitDefinition.numOrientations;
|
|
83
81
|
}
|
|
84
|
-
newOrientation[idx] = (stateOrbit.orientation[transformationIdx] + transformationOrbit.
|
|
82
|
+
newOrientation[idx] = (stateOrbit.orientation[transformationIdx] + transformationOrbit.orientationDelta[idx]) % mod;
|
|
85
83
|
newPieces[idx] = stateOrbit.pieces[transformationIdx];
|
|
86
84
|
}
|
|
87
85
|
const newOrbitData = {
|
|
@@ -91,7 +89,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
|
|
|
91
89
|
if (newOrientationMod) {
|
|
92
90
|
newOrbitData.orientationMod = newOrientationMod;
|
|
93
91
|
}
|
|
94
|
-
newStateData[orbitName] = newOrbitData;
|
|
92
|
+
newStateData[orbitDefinition.orbitName] = newOrbitData;
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
}
|
|
@@ -114,7 +112,7 @@ function constructIdentityOrbitTransformation(numPieces) {
|
|
|
114
112
|
}
|
|
115
113
|
const orbitTransformation = {
|
|
116
114
|
permutation: newPermutation,
|
|
117
|
-
|
|
115
|
+
orientationDelta: newOrientation
|
|
118
116
|
};
|
|
119
117
|
if (FREEZE) {
|
|
120
118
|
Object.freeze(newPermutation);
|
|
@@ -126,12 +124,8 @@ function constructIdentityOrbitTransformation(numPieces) {
|
|
|
126
124
|
}
|
|
127
125
|
function constructIdentityTransformationDataUncached(definition) {
|
|
128
126
|
const transformation = {};
|
|
129
|
-
for (const
|
|
130
|
-
|
|
131
|
-
)) {
|
|
132
|
-
transformation[orbitName] = constructIdentityOrbitTransformation(
|
|
133
|
-
orbitDefinition.numPieces
|
|
134
|
-
);
|
|
127
|
+
for (const orbitDefinition of definition.orbits) {
|
|
128
|
+
transformation[orbitDefinition.orbitName] = constructIdentityOrbitTransformation(orbitDefinition.numPieces);
|
|
135
129
|
}
|
|
136
130
|
if (FREEZE) {
|
|
137
131
|
Object.freeze(transformation);
|
|
@@ -142,7 +136,7 @@ function moveToTransformationUncached(kpuzzle, move) {
|
|
|
142
136
|
const quantumKey = move.quantum.toString();
|
|
143
137
|
let quantumMoveDefinition = kpuzzle.definition.moves[quantumKey];
|
|
144
138
|
if (!quantumMoveDefinition) {
|
|
145
|
-
const derivedFrom = kpuzzle.definition.
|
|
139
|
+
const derivedFrom = kpuzzle.definition.derivedMoves?.[quantumKey];
|
|
146
140
|
if (derivedFrom) {
|
|
147
141
|
quantumMoveDefinition = kpuzzle.algToTransformation(derivedFrom).transformationData;
|
|
148
142
|
}
|
|
@@ -165,8 +159,8 @@ function moveToTransformationUncached(kpuzzle, move) {
|
|
|
165
159
|
throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);
|
|
166
160
|
}
|
|
167
161
|
|
|
168
|
-
// src/cubing/kpuzzle/
|
|
169
|
-
var
|
|
162
|
+
// src/cubing/kpuzzle/KPattern.ts
|
|
163
|
+
var KPattern = class _KPattern {
|
|
170
164
|
constructor(kpuzzle, stateData) {
|
|
171
165
|
this.kpuzzle = kpuzzle;
|
|
172
166
|
this.stateData = stateData;
|
|
@@ -180,10 +174,10 @@ var KState = class _KState {
|
|
|
180
174
|
static fromTransformation(transformation) {
|
|
181
175
|
const newStateData = applyTransformationDataToStateData(
|
|
182
176
|
transformation.kpuzzle.definition,
|
|
183
|
-
transformation.kpuzzle.definition.
|
|
177
|
+
transformation.kpuzzle.definition.defaultPattern,
|
|
184
178
|
transformation.transformationData
|
|
185
179
|
);
|
|
186
|
-
return new
|
|
180
|
+
return new _KPattern(transformation.kpuzzle, newStateData);
|
|
187
181
|
}
|
|
188
182
|
// Convenience function
|
|
189
183
|
/** @deprecated */
|
|
@@ -192,14 +186,14 @@ var KState = class _KState {
|
|
|
192
186
|
}
|
|
193
187
|
applyTransformation(transformation) {
|
|
194
188
|
if (transformation.isIdentityTransformation()) {
|
|
195
|
-
return new
|
|
189
|
+
return new _KPattern(this.kpuzzle, this.stateData);
|
|
196
190
|
}
|
|
197
191
|
const newStateData = applyTransformationDataToStateData(
|
|
198
192
|
this.kpuzzle.definition,
|
|
199
193
|
this.stateData,
|
|
200
194
|
transformation.transformationData
|
|
201
195
|
);
|
|
202
|
-
return new
|
|
196
|
+
return new _KPattern(this.kpuzzle, newStateData);
|
|
203
197
|
}
|
|
204
198
|
applyMove(move) {
|
|
205
199
|
return this.applyTransformation(this.kpuzzle.moveToTransformation(move));
|
|
@@ -216,7 +210,7 @@ var KState = class _KState {
|
|
|
216
210
|
for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {
|
|
217
211
|
const transformationOrbit = {
|
|
218
212
|
permutation: stateOrbitData.pieces,
|
|
219
|
-
|
|
213
|
+
orientationDelta: stateOrbitData.orientation
|
|
220
214
|
};
|
|
221
215
|
transformationData[orbitName] = transformationOrbit;
|
|
222
216
|
}
|
|
@@ -225,7 +219,7 @@ var KState = class _KState {
|
|
|
225
219
|
experimentalIsSolved(options) {
|
|
226
220
|
if (!this.kpuzzle.definition.experimentalIsStateSolved) {
|
|
227
221
|
throw new Error(
|
|
228
|
-
"`
|
|
222
|
+
"`KPattern.experimentalIsSolved()` is not supported for this puzzle at the moment."
|
|
229
223
|
);
|
|
230
224
|
}
|
|
231
225
|
return this.kpuzzle.definition.experimentalIsStateSolved(this, options);
|
|
@@ -310,8 +304,8 @@ var KTransformation = class _KTransformation {
|
|
|
310
304
|
return this.applyTransformation(this.kpuzzle.algToTransformation(alg));
|
|
311
305
|
}
|
|
312
306
|
// Convenience. Useful for chaining.
|
|
313
|
-
|
|
314
|
-
return
|
|
307
|
+
toKPattern() {
|
|
308
|
+
return KPattern.fromTransformation(this);
|
|
315
309
|
}
|
|
316
310
|
repetitionOrder() {
|
|
317
311
|
return transformationRepetitionOrder(this.kpuzzle.definition, this);
|
|
@@ -330,6 +324,9 @@ var KTransformation = class _KTransformation {
|
|
|
330
324
|
|
|
331
325
|
// src/cubing/kpuzzle/calculate.ts
|
|
332
326
|
function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransformationData) {
|
|
327
|
+
if (!orbitTransformationData.permutation) {
|
|
328
|
+
console.log(orbitTransformationData);
|
|
329
|
+
}
|
|
333
330
|
const { permutation } = orbitTransformationData;
|
|
334
331
|
const numPieces = permutation.length;
|
|
335
332
|
for (let idx = 0; idx < numPieces; idx++) {
|
|
@@ -338,7 +335,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
|
|
|
338
335
|
}
|
|
339
336
|
}
|
|
340
337
|
if (numOrientations > 1) {
|
|
341
|
-
const { orientation } = orbitTransformationData;
|
|
338
|
+
const { orientationDelta: orientation } = orbitTransformationData;
|
|
342
339
|
for (let idx = 0; idx < numPieces; idx++) {
|
|
343
340
|
if (orientation[idx] !== 0) {
|
|
344
341
|
return false;
|
|
@@ -349,7 +346,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
|
|
|
349
346
|
}
|
|
350
347
|
function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformationData1, orbitTransformationData2, options = {}) {
|
|
351
348
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
352
|
-
if (!options?.ignoreOrientation && orbitTransformationData1.
|
|
349
|
+
if (!options?.ignoreOrientation && orbitTransformationData1.orientationDelta[idx] !== orbitTransformationData2.orientationDelta[idx]) {
|
|
353
350
|
return false;
|
|
354
351
|
}
|
|
355
352
|
if (!options?.ignorePermutation && orbitTransformationData1.permutation[idx] !== orbitTransformationData2.permutation[idx]) {
|
|
@@ -359,13 +356,11 @@ function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformation
|
|
|
359
356
|
return true;
|
|
360
357
|
}
|
|
361
358
|
function isTransformationDataIdentical(kpuzzle, transformationData1, transformationData2) {
|
|
362
|
-
for (const
|
|
363
|
-
kpuzzle.definition.orbits
|
|
364
|
-
)) {
|
|
359
|
+
for (const orbitDefinition of kpuzzle.definition.orbits) {
|
|
365
360
|
if (!isOrbitTransformationDataIdentical(
|
|
366
361
|
orbitDefinition,
|
|
367
|
-
transformationData1[orbitName],
|
|
368
|
-
transformationData2[orbitName]
|
|
362
|
+
transformationData1[orbitDefinition.orbitName],
|
|
363
|
+
transformationData2[orbitDefinition.orbitName]
|
|
369
364
|
)) {
|
|
370
365
|
return false;
|
|
371
366
|
}
|
|
@@ -374,22 +369,21 @@ function isTransformationDataIdentical(kpuzzle, transformationData1, transformat
|
|
|
374
369
|
}
|
|
375
370
|
function invertTransformation(kpuzzle, transformationData) {
|
|
376
371
|
const newTransformationData = {};
|
|
377
|
-
for (const
|
|
378
|
-
const
|
|
379
|
-
const orbitTransformationData = transformationData[orbitName];
|
|
372
|
+
for (const orbitDefinition of kpuzzle.definition.orbits) {
|
|
373
|
+
const orbitTransformationData = transformationData[orbitDefinition.orbitName];
|
|
380
374
|
if (isOrbitTransformationDataIdentityUncached(
|
|
381
375
|
orbitDefinition.numOrientations,
|
|
382
376
|
orbitTransformationData
|
|
383
377
|
)) {
|
|
384
|
-
newTransformationData[orbitName] = orbitTransformationData;
|
|
378
|
+
newTransformationData[orbitDefinition.orbitName] = orbitTransformationData;
|
|
385
379
|
} else if (orbitDefinition.numOrientations === 1) {
|
|
386
380
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
387
381
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
388
382
|
newPerm[orbitTransformationData.permutation[idx]] = idx;
|
|
389
383
|
}
|
|
390
|
-
newTransformationData[orbitName] = {
|
|
384
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
391
385
|
permutation: newPerm,
|
|
392
|
-
|
|
386
|
+
orientationDelta: orbitTransformationData.orientationDelta
|
|
393
387
|
};
|
|
394
388
|
} else {
|
|
395
389
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
@@ -397,11 +391,11 @@ function invertTransformation(kpuzzle, transformationData) {
|
|
|
397
391
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
398
392
|
const fromIdx = orbitTransformationData.permutation[idx];
|
|
399
393
|
newPerm[fromIdx] = idx;
|
|
400
|
-
newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.
|
|
394
|
+
newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.orientationDelta[idx] + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
|
|
401
395
|
}
|
|
402
|
-
newTransformationData[orbitName] = {
|
|
396
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
403
397
|
permutation: newPerm,
|
|
404
|
-
|
|
398
|
+
orientationDelta: newOri
|
|
405
399
|
};
|
|
406
400
|
}
|
|
407
401
|
}
|
|
@@ -504,9 +498,8 @@ function gcd(a, b) {
|
|
|
504
498
|
}
|
|
505
499
|
function transformationRepetitionOrder(definition, transformation) {
|
|
506
500
|
let order = 1;
|
|
507
|
-
for (const
|
|
508
|
-
const
|
|
509
|
-
const transformationOrbit = transformation.transformationData[orbitName];
|
|
501
|
+
for (const orbitDefinition of definition.orbits) {
|
|
502
|
+
const transformationOrbit = transformation.transformationData[orbitDefinition.orbitName];
|
|
510
503
|
const orbitPieces = new Array(orbitDefinition.numPieces);
|
|
511
504
|
for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {
|
|
512
505
|
if (!orbitPieces[startIdx]) {
|
|
@@ -515,7 +508,7 @@ function transformationRepetitionOrder(definition, transformation) {
|
|
|
515
508
|
let cycleLength = 0;
|
|
516
509
|
for (; ; ) {
|
|
517
510
|
orbitPieces[currentIdx] = true;
|
|
518
|
-
orientationSum = orientationSum + transformationOrbit.
|
|
511
|
+
orientationSum = orientationSum + transformationOrbit.orientationDelta[currentIdx];
|
|
519
512
|
cycleLength = cycleLength + 1;
|
|
520
513
|
currentIdx = transformationOrbit.permutation[currentIdx];
|
|
521
514
|
if (currentIdx === startIdx) {
|
|
@@ -539,6 +532,23 @@ var KPuzzle = class {
|
|
|
539
532
|
this.#moveToTransformationDataCache = /* @__PURE__ */ new Map();
|
|
540
533
|
this.experimentalPGNotation = options?.experimentalPGNotation;
|
|
541
534
|
}
|
|
535
|
+
#indexedOrbits;
|
|
536
|
+
// Note: this function is needed much more rarely than you might think. Most
|
|
537
|
+
// operations related to orbits require iterating through all of them, for
|
|
538
|
+
// which the following is better:
|
|
539
|
+
//
|
|
540
|
+
// for (const orbitDefinition of kpuzzle.definition.orbits) { // …
|
|
541
|
+
// }
|
|
542
|
+
lookupOrbitDefinition(orbitName) {
|
|
543
|
+
this.#indexedOrbits || (this.#indexedOrbits = (() => {
|
|
544
|
+
const indexedOrbits = {};
|
|
545
|
+
for (const orbitDefinition of this.definition.orbits) {
|
|
546
|
+
indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;
|
|
547
|
+
}
|
|
548
|
+
return indexedOrbits;
|
|
549
|
+
})());
|
|
550
|
+
return this.#indexedOrbits[orbitName];
|
|
551
|
+
}
|
|
542
552
|
name() {
|
|
543
553
|
return this.definition.name;
|
|
544
554
|
}
|
|
@@ -586,17 +596,15 @@ var KPuzzle = class {
|
|
|
586
596
|
}
|
|
587
597
|
}
|
|
588
598
|
startState() {
|
|
589
|
-
return new
|
|
599
|
+
return new KPattern(this, this.definition.defaultPattern);
|
|
590
600
|
}
|
|
591
601
|
#cachedCanConvertStateToUniqueTransformation;
|
|
592
602
|
// TODO: Handle incomplete start state data
|
|
593
603
|
canConvertStateToUniqueTransformation() {
|
|
594
604
|
return this.#cachedCanConvertStateToUniqueTransformation ?? (this.#cachedCanConvertStateToUniqueTransformation = (() => {
|
|
595
|
-
for (const
|
|
596
|
-
this.definition.orbits
|
|
597
|
-
)) {
|
|
605
|
+
for (const orbitDefinition of this.definition.orbits) {
|
|
598
606
|
const pieces = new Array(orbitDefinition.numPieces).fill(false);
|
|
599
|
-
for (const piece of this.definition.
|
|
607
|
+
for (const piece of this.definition.defaultPattern[orbitDefinition.orbitName].pieces) {
|
|
600
608
|
pieces[piece] = true;
|
|
601
609
|
}
|
|
602
610
|
for (const piece of pieces) {
|
|
@@ -611,8 +619,8 @@ var KPuzzle = class {
|
|
|
611
619
|
};
|
|
612
620
|
|
|
613
621
|
export {
|
|
614
|
-
|
|
622
|
+
KPattern,
|
|
615
623
|
KTransformation,
|
|
616
624
|
KPuzzle
|
|
617
625
|
};
|
|
618
|
-
//# sourceMappingURL=chunk-
|
|
626
|
+
//# sourceMappingURL=chunk-F72PPD54.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cubing/kpuzzle/combine.ts", "../../src/cubing/kpuzzle/construct.ts", "../../src/cubing/kpuzzle/KPattern.ts", "../../src/cubing/kpuzzle/KTransformation.ts", "../../src/cubing/kpuzzle/calculate.ts", "../../src/cubing/kpuzzle/KPuzzle.ts"],
|
|
4
|
+
"sourcesContent": ["import { isOrbitTransformationDataIdentityUncached } from \"./calculate\";\nimport type {\n KPuzzleDefinition,\n KPatternData,\n KPatternOrbitData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\n\nexport function combineTransformationData(\n definition: KPuzzleDefinition,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): KTransformationData {\n const newTransformationData = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n const orbit1 = transformationData1[orbitDefinition.orbitName];\n const orbit2 = transformationData2[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit2,\n )\n ) {\n // common case for big cubes\n newTransformationData[orbitDefinition.orbitName] = orbit1;\n } else if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit1,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] = orbit2;\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbit1.orientationDelta,\n };\n } else {\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newOri[idx] =\n (orbit1.orientationDelta[orbit2.permutation[idx]] +\n orbit2.orientationDelta[idx]) %\n orbitDefinition.numOrientations;\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n }\n return newTransformationData;\n}\n\nexport function applyTransformationDataToStateData(\n definition: KPuzzleDefinition,\n stateData: KPatternData,\n transformationData: KTransformationData,\n): KPatternData {\n const newStateData = {} as KPatternData;\n for (const orbitDefinition of definition.orbits) {\n const stateOrbit = stateData[orbitDefinition.orbitName];\n const transformationOrbit = transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n transformationOrbit,\n )\n ) {\n // common case for big cubes\n newStateData[orbitDefinition.orbitName] = stateOrbit;\n } else {\n const newPieces = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPieces[idx] =\n stateOrbit.pieces[transformationOrbit.permutation[idx]];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: stateOrbit.orientation, // copy all 0\n };\n newStateData[orbitDefinition.orbitName] = newOrbitData;\n } else {\n const newOrientation = new Array(orbitDefinition.numPieces);\n const newOrientationMod: number[] | undefined =\n stateOrbit.orientationMod\n ? new Array(orbitDefinition.numPieces)\n : undefined;\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const transformationIdx = transformationOrbit.permutation[idx];\n let mod = orbitDefinition.numOrientations;\n if (stateOrbit.orientationMod) {\n const orientationMod = stateOrbit.orientationMod[transformationIdx];\n newOrientationMod![idx] = orientationMod;\n mod = orientationMod || orbitDefinition.numOrientations;\n }\n newOrientation[idx] =\n (stateOrbit.orientation[transformationIdx] +\n transformationOrbit.orientationDelta[idx]) %\n mod; // We don't have to use `modIntoRange` (assuming input is well-formed), because we're adding.\n newPieces[idx] = stateOrbit.pieces[transformationIdx];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: newOrientation,\n };\n if (newOrientationMod) {\n newOrbitData.orientationMod = newOrientationMod;\n }\n newStateData[orbitDefinition.orbitName] = newOrbitData;\n }\n }\n }\n return newStateData;\n}\n", "import type { Move } from \"../alg\";\nimport { repeatTransformationUncached } from \"./calculate\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleDefinition,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\n\nconst FREEZE: boolean = false;\n\nconst identityOrbitCache = new Map<number, KTransformationOrbitData>();\nfunction constructIdentityOrbitTransformation(\n numPieces: number,\n): KTransformationOrbitData {\n const cached = identityOrbitCache.get(numPieces);\n if (cached) {\n return cached;\n }\n\n const newPermutation = new Array(numPieces);\n const newOrientation = new Array(numPieces);\n for (let i = 0; i < numPieces; i++) {\n newPermutation[i] = i;\n newOrientation[i] = 0;\n }\n const orbitTransformation = {\n permutation: newPermutation,\n orientationDelta: newOrientation,\n };\n if (FREEZE) {\n Object.freeze(newPermutation); // TODO\n Object.freeze(newOrientation); // TODO\n Object.freeze(orbitTransformation); // TODO\n }\n identityOrbitCache.set(numPieces, orbitTransformation);\n return orbitTransformation;\n}\n\nexport function constructIdentityTransformationDataUncached(\n definition: KPuzzleDefinition,\n): KTransformationData {\n const transformation = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n transformation[orbitDefinition.orbitName] =\n constructIdentityOrbitTransformation(orbitDefinition.numPieces);\n }\n if (FREEZE) {\n Object.freeze(transformation); // TODO\n }\n return transformation;\n}\n\nexport function moveToTransformationUncached(\n kpuzzle: KPuzzle,\n move: Move,\n): KTransformationData {\n const quantumKey = move.quantum.toString();\n let quantumMoveDefinition = kpuzzle.definition.moves[quantumKey] as\n | KTransformationData\n | undefined;\n\n if (!quantumMoveDefinition) {\n const derivedFrom = kpuzzle.definition.derivedMoves?.[quantumKey];\n\n if (derivedFrom) {\n // TODO: avoid the round trip?\n quantumMoveDefinition =\n kpuzzle.algToTransformation(derivedFrom).transformationData;\n }\n }\n\n if (quantumMoveDefinition) {\n return repeatTransformationUncached(\n kpuzzle,\n quantumMoveDefinition,\n move.amount,\n );\n }\n\n // Handle e.g. `y2` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const moveDefinition = kpuzzle.definition.moves[move.toString()];\n if (moveDefinition) {\n return moveDefinition;\n }\n\n // Handle e.g. `y2'` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const inverseMoveDefinition =\n kpuzzle.definition.moves[move.invert().toString()];\n if (inverseMoveDefinition) {\n return repeatTransformationUncached(kpuzzle, inverseMoveDefinition, -1);\n }\n\n throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);\n}\n", "import type { KPuzzle } from \"./KPuzzle\";\nimport type { Alg, Move } from \"../alg\";\nimport { applyTransformationDataToStateData } from \"./combine\";\nimport type { KTransformationSource } from \"./KPuzzle\";\nimport type {\n KPatternData,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport class KPattern {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly stateData: KPatternData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n stateData: this.stateData,\n };\n }\n\n static fromTransformation(transformation: KTransformation): KPattern {\n const newStateData = applyTransformationDataToStateData(\n transformation.kpuzzle.definition,\n transformation.kpuzzle.definition.defaultPattern,\n transformation.transformationData,\n );\n return new KPattern(transformation.kpuzzle, newStateData);\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KPattern {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(transformation: KTransformation): KPattern {\n if (transformation.isIdentityTransformation()) {\n return new KPattern(this.kpuzzle, this.stateData);\n }\n const newStateData = applyTransformationDataToStateData(\n this.kpuzzle.definition,\n this.stateData,\n transformation.transformationData,\n );\n return new KPattern(this.kpuzzle, newStateData);\n }\n\n applyMove(move: Move | string): KPattern {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KPattern {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n /** @deprecated */\n experimentalToTransformation(): KTransformation | null {\n if (!this.kpuzzle.canConvertStateToUniqueTransformation()) {\n return null;\n }\n const transformationData: KTransformationData = {};\n for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {\n const transformationOrbit: KTransformationOrbitData = {\n permutation: stateOrbitData.pieces,\n orientationDelta: stateOrbitData.orientation,\n };\n transformationData[orbitName] = transformationOrbit;\n }\n return new KTransformation(this.kpuzzle, transformationData);\n }\n\n experimentalIsSolved(options: {\n ignorePuzzleOrientation: boolean;\n ignoreCenterOrientation: boolean;\n }): boolean {\n if (!this.kpuzzle.definition.experimentalIsStateSolved) {\n throw new Error(\n \"`KPattern.experimentalIsSolved()` is not supported for this puzzle at the moment.\",\n );\n }\n return this.kpuzzle.definition.experimentalIsStateSolved(this, options);\n }\n}\n", "import type { Alg, Move } from \"../alg\";\nimport {\n invertTransformation,\n isTransformationDataIdentical,\n repeatTransformationUncached,\n transformationRepetitionOrder,\n} from \"./calculate\";\nimport { combineTransformationData } from \"./combine\";\nimport { constructIdentityTransformationDataUncached } from \"./construct\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type { KTransformationData } from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\n\nexport class KTransformation {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly transformationData: KTransformationData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n transformationData: this.transformationData,\n };\n }\n\n invert(): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n invertTransformation(this.kpuzzle, this.transformationData),\n );\n }\n\n // For optimizations, we want to make it cheap to rely on optimizations when a\n // transformation is an identity. Here, we try to make it cheaper by:\n // - only calculating when needed, and\n // - caching the result.\n #cachedIsIdentity: boolean | undefined; // TODO: is `null` worse here?\n isIdentityTransformation(): boolean {\n return (this.#cachedIsIdentity ??= this.isIdentical(\n this.kpuzzle.identityTransformation(),\n ));\n }\n\n /** @deprecated */\n static experimentalConstructIdentity(kpuzzle: KPuzzle) {\n const transformation = new KTransformation(\n kpuzzle,\n constructIdentityTransformationDataUncached(kpuzzle.definition),\n );\n transformation.#cachedIsIdentity = true;\n return transformation;\n }\n\n isIdentical(t2: KTransformation): boolean {\n return isTransformationDataIdentical(\n this.kpuzzle,\n this.transformationData,\n t2.transformationData,\n );\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KTransformation {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(t2: KTransformation): KTransformation {\n if (this.kpuzzle !== t2.kpuzzle) {\n throw new Error(\n `Tried to apply a transformation for a KPuzzle (${t2.kpuzzle.name()}) to a different KPuzzle (${this.kpuzzle.name()}).`,\n );\n }\n\n if (this.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, t2.transformationData);\n }\n if (t2.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, this.transformationData);\n }\n\n return new KTransformation(\n this.kpuzzle,\n combineTransformationData(\n this.kpuzzle.definition,\n this.transformationData,\n t2.transformationData,\n ),\n );\n }\n\n applyMove(move: Move | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n // Convenience. Useful for chaining.\n toKPattern(): KPattern {\n return KPattern.fromTransformation(this);\n }\n\n repetitionOrder(): number {\n return transformationRepetitionOrder(this.kpuzzle.definition, this);\n }\n\n selfMultiply(amount: number): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n repeatTransformationUncached(\n this.kpuzzle,\n this.transformationData,\n amount,\n ),\n );\n }\n}\n", "import {\n Alg,\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n TraversalDownUp,\n} from \"../alg\";\nimport { functionFromTraversal } from \"../alg\";\nimport { combineTransformationData } from \"./combine\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleOrbitDefinition,\n KTransformationOrbitData,\n KTransformationData,\n KPuzzleDefinition,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport function isOrbitTransformationDataIdentityUncached(\n numOrientations: number,\n orbitTransformationData: KTransformationOrbitData,\n): boolean {\n // TODO\n // if (o === lasto) {\n // return true;\n // }\n if (!orbitTransformationData.permutation) {\n console.log(orbitTransformationData);\n }\n const { permutation } = orbitTransformationData;\n const numPieces = permutation.length;\n for (let idx = 0; idx < numPieces; idx++) {\n if (permutation[idx] !== idx) {\n return false;\n }\n }\n if (numOrientations > 1) {\n const { orientationDelta: orientation } = orbitTransformationData;\n for (let idx = 0; idx < numPieces; idx++) {\n if (orientation[idx] !== 0) {\n return false;\n }\n }\n }\n // lasto = o; // TODO\n return true;\n}\n\nexport function isOrbitTransformationDataIdentical(\n orbitDefinition: KPuzzleOrbitDefinition,\n orbitTransformationData1: KTransformationOrbitData,\n orbitTransformationData2: KTransformationOrbitData,\n options: {\n ignoreOrientation?: boolean;\n ignorePermutation?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignoreOrientation &&\n orbitTransformationData1.orientationDelta[idx] !==\n orbitTransformationData2.orientationDelta[idx]\n ) {\n return false;\n }\n if (\n !options?.ignorePermutation &&\n orbitTransformationData1.permutation[idx] !==\n orbitTransformationData2.permutation[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isTransformationDataIdentical(\n kpuzzle: KPuzzle,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): boolean {\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n if (\n !isOrbitTransformationDataIdentical(\n orbitDefinition,\n transformationData1[orbitDefinition.orbitName],\n transformationData2[orbitDefinition.orbitName],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function invertTransformation(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n): KTransformationData {\n const newTransformationData: KTransformationData = {};\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n const orbitTransformationData =\n transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbitTransformationData,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] =\n orbitTransformationData;\n } else if (orbitDefinition.numOrientations === 1) {\n const newPerm = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[orbitTransformationData.permutation[idx]] = idx;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbitTransformationData.orientationDelta,\n };\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const fromIdx = orbitTransformationData.permutation[idx];\n newPerm[fromIdx] = idx;\n newOri[fromIdx] =\n (orbitDefinition.numOrientations -\n orbitTransformationData.orientationDelta[idx] +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n return newTransformationData;\n}\n\nexport function repeatTransformationUncached(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n amount: number,\n): KTransformationData {\n // This is used for move construction, so we optimize for the quantum move case.\n if (amount === 1) {\n return transformationData;\n }\n if (amount < 0) {\n return repeatTransformationUncached(\n kpuzzle,\n invertTransformation(kpuzzle, transformationData),\n -amount,\n );\n }\n if (amount === 0) {\n // TODO\n const { transformationData } = kpuzzle.identityTransformation();\n return transformationData;\n }\n let halfish = transformationData;\n if (amount !== 2) {\n halfish = repeatTransformationUncached(\n kpuzzle,\n transformationData,\n Math.floor(amount / 2),\n );\n }\n const twiceHalfish = combineTransformationData(\n kpuzzle.definition,\n halfish,\n halfish,\n );\n if (amount % 2 === 0) {\n return twiceHalfish;\n } else {\n return combineTransformationData(\n kpuzzle.definition,\n transformationData,\n twiceHalfish,\n );\n }\n}\n\nclass AlgToTransformationTraversal extends TraversalDownUp<\n KPuzzle,\n KTransformation\n> {\n traverseAlg(alg: Alg, kpuzzle: KPuzzle): KTransformation {\n let transformation: KTransformation | null = null;\n for (const algNode of alg.childAlgNodes()) {\n if (transformation) {\n transformation = transformation.applyTransformation(\n this.traverseAlgNode(algNode, kpuzzle),\n );\n } else {\n transformation = this.traverseAlgNode(algNode, kpuzzle);\n }\n }\n return transformation ?? kpuzzle.identityTransformation();\n }\n traverseGrouping(grouping: Grouping, kpuzzle: KPuzzle): KTransformation {\n const algTransformation = this.traverseAlg(grouping.alg, kpuzzle);\n return new KTransformation(\n kpuzzle,\n repeatTransformationUncached(\n kpuzzle,\n algTransformation.transformationData,\n grouping.amount,\n ),\n );\n }\n traverseMove(move: Move, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.moveToTransformation(move);\n }\n traverseCommutator(\n commutator: Commutator,\n kpuzzle: KPuzzle,\n ): KTransformation {\n const aTransformation = this.traverseAlg(commutator.A, kpuzzle);\n const bTransformation = this.traverseAlg(commutator.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert())\n .applyTransformation(bTransformation.invert());\n }\n traverseConjugate(conjugate: Conjugate, kpuzzle: KPuzzle): KTransformation {\n const aTransformation = this.traverseAlg(conjugate.A, kpuzzle);\n const bTransformation = this.traverseAlg(conjugate.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert());\n }\n traversePause(_: Pause, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseNewline(_: Newline, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseLineComment(_: LineComment, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n}\n\nexport const algToTransformation = functionFromTraversal(\n AlgToTransformationTraversal,\n);\n\nexport function canConvertStateToUniqueTransformationUncached(\n definition: KPuzzleDefinition,\n): boolean {\n for (const orbitDefinition of definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction gcd(a: number, b: number): number {\n if (b) {\n return gcd(b, a % b);\n }\n return a;\n}\n\n/* calculate the order of a particular transformation. */\nexport function transformationRepetitionOrder(\n definition: KPuzzleDefinition,\n transformation: KTransformation,\n): number {\n let order: number = 1;\n for (const orbitDefinition of definition.orbits) {\n const transformationOrbit =\n transformation.transformationData[orbitDefinition.orbitName];\n const orbitPieces = new Array(orbitDefinition.numPieces);\n for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {\n if (!orbitPieces[startIdx]) {\n let currentIdx = startIdx;\n let orientationSum = 0;\n let cycleLength = 0;\n for (;;) {\n orbitPieces[currentIdx] = true;\n orientationSum =\n orientationSum + transformationOrbit.orientationDelta[currentIdx];\n cycleLength = cycleLength + 1;\n currentIdx = transformationOrbit.permutation[currentIdx];\n if (currentIdx === startIdx) {\n break;\n }\n }\n if (orientationSum !== 0) {\n cycleLength =\n (cycleLength * orbitDefinition.numOrientations) /\n gcd(orbitDefinition.numOrientations, Math.abs(orientationSum));\n }\n order = (order * cycleLength) / gcd(order, cycleLength);\n }\n }\n }\n return order;\n}\n", "import { Alg, Move } from \"../alg\";\nimport type { PGNotation } from \"../puzzle-geometry/PuzzleGeometry\";\nimport { algToTransformation } from \"./calculate\";\nimport { moveToTransformationUncached } from \"./construct\";\nimport type {\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport type KTransformationSource = Alg | Move | string | KTransformation;\n\nexport class KPuzzle {\n private experimentalPGNotation: PGNotation | undefined;\n constructor(\n public readonly definition: KPuzzleDefinition,\n options?: {\n experimentalPGNotation?: PGNotation;\n },\n ) {\n this.experimentalPGNotation = options?.experimentalPGNotation;\n }\n\n #indexedOrbits: Record<string, KPuzzleOrbitDefinition> | undefined;\n // Note: this function is needed much more rarely than you might think. Most\n // operations related to orbits require iterating through all of them, for\n // which the following is better:\n //\n // for (const orbitDefinition of kpuzzle.definition.orbits) { // \u2026\n // }\n lookupOrbitDefinition(orbitName: string): KPuzzleOrbitDefinition {\n this.#indexedOrbits ||= (() => {\n const indexedOrbits: Record<string, KPuzzleOrbitDefinition> = {};\n for (const orbitDefinition of this.definition.orbits) {\n indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;\n }\n return indexedOrbits;\n })();\n return this.#indexedOrbits[orbitName];\n }\n\n name(): string {\n return this.definition.name; // TODO\n }\n\n identityTransformation(): KTransformation {\n return KTransformation.experimentalConstructIdentity(this);\n }\n\n #moveToTransformationDataCache = new Map<string, KTransformationData>();\n moveToTransformation(move: Move | string): KTransformation {\n if (typeof move === \"string\") {\n move = new Move(move);\n }\n const cacheKey = move.toString();\n const cachedTransformationData: KTransformationData | undefined =\n this.#moveToTransformationDataCache.get(cacheKey);\n if (cachedTransformationData) {\n return new KTransformation(this, cachedTransformationData);\n }\n\n if (this.experimentalPGNotation) {\n const transformationData = this.experimentalPGNotation.lookupMove(move);\n if (!transformationData) {\n throw new Error(`could not map to internal move: ${move}`);\n }\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n const transformationData = moveToTransformationUncached(this, move);\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n algToTransformation(alg: Alg | string): KTransformation {\n if (typeof alg === \"string\") {\n alg = new Alg(alg);\n }\n return algToTransformation(alg, this);\n }\n\n /** @deprecated */\n toTransformation(source: KTransformationSource): KTransformation {\n if (typeof source === \"string\") {\n return this.algToTransformation(source);\n } else if ((source as Alg | null)?.is?.(Alg)) {\n return this.algToTransformation(source as Alg);\n } else if ((source as Move | null)?.is?.(Move)) {\n return this.moveToTransformation(source as Move);\n } else {\n return source as KTransformation;\n }\n }\n\n startState(): KPattern {\n return new KPattern(this, this.definition.defaultPattern);\n }\n\n #cachedCanConvertStateToUniqueTransformation: boolean | undefined;\n // TODO: Handle incomplete start state data\n canConvertStateToUniqueTransformation(): boolean {\n return (this.#cachedCanConvertStateToUniqueTransformation ??=\n ((): boolean => {\n for (const orbitDefinition of this.definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n })());\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["transformationData", "transformationData"]
|
|
7
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
puzzles
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BTVDGT5H.js";
|
|
4
4
|
import {
|
|
5
5
|
from
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SNYTAYI2.js";
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
} from "./chunk-
|
|
8
|
+
KPattern
|
|
9
|
+
} from "./chunk-F72PPD54.js";
|
|
10
10
|
import {
|
|
11
11
|
Alg,
|
|
12
12
|
AlgBuilder,
|
|
@@ -142,7 +142,7 @@ function toMin2PhaseState(state) {
|
|
|
142
142
|
|
|
143
143
|
// src/cubing/search/inside/solve/puzzles/3x3x3/filter.ts
|
|
144
144
|
function isEquivalentTranformationIgnoringCENTERS(t1, t2) {
|
|
145
|
-
const t1NoCenterOri = new
|
|
145
|
+
const t1NoCenterOri = new KPattern(t1.kpuzzle, {
|
|
146
146
|
EDGES: t1.stateData.EDGES,
|
|
147
147
|
CORNERS: t1.stateData.CORNERS,
|
|
148
148
|
CENTERS: {
|
|
@@ -150,7 +150,7 @@ function isEquivalentTranformationIgnoringCENTERS(t1, t2) {
|
|
|
150
150
|
orientation: new Array(6).fill(0)
|
|
151
151
|
}
|
|
152
152
|
}).experimentalToTransformation();
|
|
153
|
-
const t2NoCenterOri = new
|
|
153
|
+
const t2NoCenterOri = new KPattern(t2.kpuzzle, {
|
|
154
154
|
EDGES: t2.stateData.EDGES,
|
|
155
155
|
CORNERS: t2.stateData.CORNERS,
|
|
156
156
|
CENTERS: {
|
|
@@ -166,7 +166,7 @@ function passesFilter(kpuzzle, state) {
|
|
|
166
166
|
}
|
|
167
167
|
for (const face of "ULFRBD") {
|
|
168
168
|
for (let amount = 1; amount < 4; amount++) {
|
|
169
|
-
const transformation = kpuzzle.moveToTransformation(new Move(face, amount)).
|
|
169
|
+
const transformation = kpuzzle.moveToTransformation(new Move(face, amount)).toKPattern();
|
|
170
170
|
if (isEquivalentTranformationIgnoringCENTERS(transformation, state)) {
|
|
171
171
|
return false;
|
|
172
172
|
}
|
|
@@ -612,4 +612,4 @@ export {
|
|
|
612
612
|
random333OrientedScramble,
|
|
613
613
|
random333FewestMovesScramble
|
|
614
614
|
};
|
|
615
|
-
//# sourceMappingURL=chunk-
|
|
615
|
+
//# sourceMappingURL=chunk-LWPMAFQX.js.map
|