cubegin 0.0.1
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/CHANGELOG.md +17 -0
- package/LICENSE +674 -0
- package/NOTICE +11 -0
- package/README.md +49 -0
- package/dist/scramble-core/src/batch.mjs +18 -0
- package/dist/scramble-core/src/generator.d.mts +35 -0
- package/dist/scramble-core/src/generator.mjs +136 -0
- package/dist/scramble-core/src/generators/clock.d.mts +11 -0
- package/dist/scramble-core/src/generators/clock.mjs +32 -0
- package/dist/scramble-core/src/generators/cube-random-turns.d.mts +11 -0
- package/dist/scramble-core/src/generators/cube-random-turns.mjs +54 -0
- package/dist/scramble-core/src/generators/four-by-four.d.mts +14 -0
- package/dist/scramble-core/src/generators/four-by-four.mjs +43 -0
- package/dist/scramble-core/src/generators/megaminx.d.mts +11 -0
- package/dist/scramble-core/src/generators/megaminx.mjs +18 -0
- package/dist/scramble-core/src/generators/pyraminx.d.mts +11 -0
- package/dist/scramble-core/src/generators/pyraminx.mjs +17 -0
- package/dist/scramble-core/src/generators/skewb.d.mts +11 -0
- package/dist/scramble-core/src/generators/skewb.mjs +17 -0
- package/dist/scramble-core/src/generators/square1.d.mts +11 -0
- package/dist/scramble-core/src/generators/square1.mjs +28 -0
- package/dist/scramble-core/src/generators/three-by-three.d.mts +25 -0
- package/dist/scramble-core/src/generators/three-by-three.mjs +85 -0
- package/dist/scramble-core/src/generators/two-by-two.d.mts +11 -0
- package/dist/scramble-core/src/generators/two-by-two.mjs +17 -0
- package/dist/scramble-core/src/random-source.d.mts +7 -0
- package/dist/scramble-core/src/random-source.mjs +8 -0
- package/dist/scramble-core/src/solvers/min2phase/coord-cube.mjs +10 -0
- package/dist/scramble-core/src/solvers/min2phase/cubie-cube.mjs +246 -0
- package/dist/scramble-core/src/solvers/min2phase/engine.mjs +1281 -0
- package/dist/scramble-core/src/solvers/min2phase/search-wca.mjs +21 -0
- package/dist/scramble-core/src/solvers/min2phase/search.mjs +25 -0
- package/dist/scramble-core/src/solvers/min2phase/tools.mjs +169 -0
- package/dist/scramble-core/src/solvers/min2phase/util.mjs +30 -0
- package/dist/scramble-core/src/solvers/pyraminx-solver.d.mts +17 -0
- package/dist/scramble-core/src/solvers/pyraminx-solver.mjs +350 -0
- package/dist/scramble-core/src/solvers/skewb-solver.d.mts +15 -0
- package/dist/scramble-core/src/solvers/skewb-solver.mjs +399 -0
- package/dist/scramble-core/src/solvers/sq12phase/full-cube.mjs +212 -0
- package/dist/scramble-core/src/solvers/sq12phase/search.mjs +520 -0
- package/dist/scramble-core/src/solvers/sq12phase/shape.mjs +214 -0
- package/dist/scramble-core/src/solvers/sq12phase/square.mjs +135 -0
- package/dist/scramble-core/src/solvers/threephase/center.mjs +798 -0
- package/dist/scramble-core/src/solvers/threephase/edge.mjs +632 -0
- package/dist/scramble-core/src/solvers/threephase/full-cube.mjs +554 -0
- package/dist/scramble-core/src/solvers/threephase/search.mjs +262 -0
- package/dist/scramble-core/src/solvers/threephase/tables.mjs +201 -0
- package/dist/scramble-core/src/solvers/two-by-two-solver.d.mts +15 -0
- package/dist/scramble-core/src/solvers/two-by-two-solver.mjs +298 -0
- package/dist/scramble-core.d.mts +15 -0
- package/dist/scramble-core.mjs +15 -0
- package/dist/scramble-image/src/color.d.mts +12 -0
- package/dist/scramble-image/src/color.mjs +11 -0
- package/dist/scramble-image/src/render.d.mts +10 -0
- package/dist/scramble-image/src/render.mjs +71 -0
- package/dist/scramble-image/src/renderers/clock.d.mts +6 -0
- package/dist/scramble-image/src/renderers/clock.mjs +145 -0
- package/dist/scramble-image/src/renderers/cube-isometric.d.mts +8 -0
- package/dist/scramble-image/src/renderers/cube-isometric.mjs +204 -0
- package/dist/scramble-image/src/renderers/cube-net.d.mts +8 -0
- package/dist/scramble-image/src/renderers/cube-net.mjs +52 -0
- package/dist/scramble-image/src/renderers/megaminx-isometric.d.mts +9 -0
- package/dist/scramble-image/src/renderers/megaminx-isometric.mjs +320 -0
- package/dist/scramble-image/src/renderers/megaminx.d.mts +9 -0
- package/dist/scramble-image/src/renderers/megaminx.mjs +173 -0
- package/dist/scramble-image/src/renderers/pyraminx-isometric.d.mts +9 -0
- package/dist/scramble-image/src/renderers/pyraminx-isometric.mjs +185 -0
- package/dist/scramble-image/src/renderers/pyraminx.d.mts +9 -0
- package/dist/scramble-image/src/renderers/pyraminx.mjs +111 -0
- package/dist/scramble-image/src/renderers/skewb-isometric.d.mts +9 -0
- package/dist/scramble-image/src/renderers/skewb-isometric.mjs +233 -0
- package/dist/scramble-image/src/renderers/skewb.d.mts +9 -0
- package/dist/scramble-image/src/renderers/skewb.mjs +187 -0
- package/dist/scramble-image/src/renderers/square1.d.mts +10 -0
- package/dist/scramble-image/src/renderers/square1.mjs +253 -0
- package/dist/scramble-image/src/svg/svg-document.d.mts +6 -0
- package/dist/scramble-image/src/svg/svg-document.mjs +7 -0
- package/dist/scramble-image/src/svg/svg-elements.d.mts +15 -0
- package/dist/scramble-image/src/svg/svg-elements.mjs +25 -0
- package/dist/scramble-image/src/svg/svg-serialize.mjs +29 -0
- package/dist/scramble-image.d.mts +15 -0
- package/dist/scramble-image.mjs +15 -0
- package/dist/scramble-puzzle/src/algorithm.d.mts +8 -0
- package/dist/scramble-puzzle/src/algorithm.mjs +16 -0
- package/dist/scramble-puzzle/src/algorithm2.mjs +16 -0
- package/dist/scramble-puzzle/src/clock/clock-definition.d.mts +8 -0
- package/dist/scramble-puzzle/src/clock/clock-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/clock/clock-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/clock/clock-parser.d.mts +18 -0
- package/dist/scramble-puzzle/src/clock/clock-parser.mjs +35 -0
- package/dist/scramble-puzzle/src/clock/clock-parser2.mjs +35 -0
- package/dist/scramble-puzzle/src/clock/clock-state.d.mts +8 -0
- package/dist/scramble-puzzle/src/clock/clock-state.mjs +212 -0
- package/dist/scramble-puzzle/src/clock/clock-state2.d.mts +13 -0
- package/dist/scramble-puzzle/src/clock/clock-state2.mjs +212 -0
- package/dist/scramble-puzzle/src/cube/cube-definition.d.mts +9 -0
- package/dist/scramble-puzzle/src/cube/cube-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/cube/cube-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/cube/cube-move.d.mts +4 -0
- package/dist/scramble-puzzle/src/cube/cube-move2.d.mts +17 -0
- package/dist/scramble-puzzle/src/cube/cube-parser.d.mts +7 -0
- package/dist/scramble-puzzle/src/cube/cube-parser.mjs +60 -0
- package/dist/scramble-puzzle/src/cube/cube-parser2.mjs +60 -0
- package/dist/scramble-puzzle/src/cube/cube-state.d.mts +12 -0
- package/dist/scramble-puzzle/src/cube/cube-state.mjs +187 -0
- package/dist/scramble-puzzle/src/cube/cube-state2.d.mts +15 -0
- package/dist/scramble-puzzle/src/cube/cube-state2.mjs +187 -0
- package/dist/scramble-puzzle/src/errors.d.mts +15 -0
- package/dist/scramble-puzzle/src/errors.mjs +24 -0
- package/dist/scramble-puzzle/src/errors2.mjs +30 -0
- package/dist/scramble-puzzle/src/events.d.mts +5 -0
- package/dist/scramble-puzzle/src/events.mjs +90 -0
- package/dist/scramble-puzzle/src/events2.d.mts +98 -0
- package/dist/scramble-puzzle/src/events2.mjs +109 -0
- package/dist/scramble-puzzle/src/index.mjs +22 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-definition.d.mts +8 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-parser.d.mts +5 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-parser.mjs +57 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.d.mts +20 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.mjs +57 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-state.d.mts +9 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-state.mjs +112 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-state2.d.mts +14 -0
- package/dist/scramble-puzzle/src/megaminx/megaminx-state2.mjs +112 -0
- package/dist/scramble-puzzle/src/puzzle-definition.d.mts +19 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.d.mts +8 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.d.mts +5 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.mjs +34 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.d.mts +21 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.mjs +34 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.d.mts +11 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.mjs +90 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.d.mts +14 -0
- package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.mjs +90 -0
- package/dist/scramble-puzzle/src/registry.d.mts +11 -0
- package/dist/scramble-puzzle/src/registry.mjs +13 -0
- package/dist/scramble-puzzle/src/skewb/skewb-definition.d.mts +8 -0
- package/dist/scramble-puzzle/src/skewb/skewb-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/skewb/skewb-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/skewb/skewb-parser.d.mts +5 -0
- package/dist/scramble-puzzle/src/skewb/skewb-parser.mjs +33 -0
- package/dist/scramble-puzzle/src/skewb/skewb-parser2.d.mts +14 -0
- package/dist/scramble-puzzle/src/skewb/skewb-parser2.mjs +33 -0
- package/dist/scramble-puzzle/src/skewb/skewb-state.d.mts +11 -0
- package/dist/scramble-puzzle/src/skewb/skewb-state.mjs +75 -0
- package/dist/scramble-puzzle/src/skewb/skewb-state2.d.mts +14 -0
- package/dist/scramble-puzzle/src/skewb/skewb-state2.mjs +75 -0
- package/dist/scramble-puzzle/src/square1/square1-definition.d.mts +8 -0
- package/dist/scramble-puzzle/src/square1/square1-definition.mjs +18 -0
- package/dist/scramble-puzzle/src/square1/square1-definition2.mjs +18 -0
- package/dist/scramble-puzzle/src/square1/square1-parser.d.mts +17 -0
- package/dist/scramble-puzzle/src/square1/square1-parser.mjs +43 -0
- package/dist/scramble-puzzle/src/square1/square1-parser2.mjs +47 -0
- package/dist/scramble-puzzle/src/square1/square1-state.d.mts +9 -0
- package/dist/scramble-puzzle/src/square1/square1-state.mjs +115 -0
- package/dist/scramble-puzzle/src/square1/square1-state2.d.mts +21 -0
- package/dist/scramble-puzzle/src/square1/square1-state2.mjs +115 -0
- package/dist/scramble-puzzle.d.mts +25 -0
- package/dist/scramble-puzzle.mjs +23 -0
- package/package.json +37 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { InvalidMoveError } from "../errors2.mjs";
|
|
2
|
+
//#region .build/vendor/scramble-puzzle/src/cube/cube-state.ts
|
|
3
|
+
const CUBE_FACES = [
|
|
4
|
+
"R",
|
|
5
|
+
"U",
|
|
6
|
+
"F",
|
|
7
|
+
"L",
|
|
8
|
+
"D",
|
|
9
|
+
"B"
|
|
10
|
+
];
|
|
11
|
+
const faceIndex = (face) => CUBE_FACES.indexOf(face);
|
|
12
|
+
const isCubeFace = (face) => typeof face === "string" && CUBE_FACES.includes(face);
|
|
13
|
+
const isMoveAmount = (amount) => amount === 1 || amount === 2 || amount === 3;
|
|
14
|
+
const oppositeFace = (face) => CUBE_FACES[(faceIndex(face) + 3) % CUBE_FACES.length];
|
|
15
|
+
const cloneCubeImage = (image) => image.map((face) => face.map((row) => [...row]));
|
|
16
|
+
const freezeCubeImage = (image) => {
|
|
17
|
+
const frozenFaces = image.map((face) => {
|
|
18
|
+
const frozenRows = face.map((row) => Object.freeze([...row]));
|
|
19
|
+
return Object.freeze(frozenRows);
|
|
20
|
+
});
|
|
21
|
+
return Object.freeze(frozenFaces);
|
|
22
|
+
};
|
|
23
|
+
const createCubeState = (size, image) => Object.freeze({
|
|
24
|
+
size,
|
|
25
|
+
image: freezeCubeImage(image)
|
|
26
|
+
});
|
|
27
|
+
const swap = (image, first, second, third, fourth, direction) => {
|
|
28
|
+
const [firstFace, firstRow, firstColumn] = first;
|
|
29
|
+
const [secondFace, secondRow, secondColumn] = second;
|
|
30
|
+
const [thirdFace, thirdRow, thirdColumn] = third;
|
|
31
|
+
const [fourthFace, fourthRow, fourthColumn] = fourth;
|
|
32
|
+
if (direction === 1) {
|
|
33
|
+
const firstSticker = image[firstFace][firstRow][firstColumn];
|
|
34
|
+
image[firstFace][firstRow][firstColumn] = image[secondFace][secondRow][secondColumn];
|
|
35
|
+
image[secondFace][secondRow][secondColumn] = image[thirdFace][thirdRow][thirdColumn];
|
|
36
|
+
image[thirdFace][thirdRow][thirdColumn] = image[fourthFace][fourthRow][fourthColumn];
|
|
37
|
+
image[fourthFace][fourthRow][fourthColumn] = firstSticker;
|
|
38
|
+
} else {
|
|
39
|
+
const fourthSticker = image[fourthFace][fourthRow][fourthColumn];
|
|
40
|
+
image[fourthFace][fourthRow][fourthColumn] = image[thirdFace][thirdRow][thirdColumn];
|
|
41
|
+
image[thirdFace][thirdRow][thirdColumn] = image[secondFace][secondRow][secondColumn];
|
|
42
|
+
image[secondFace][secondRow][secondColumn] = image[firstFace][firstRow][firstColumn];
|
|
43
|
+
image[firstFace][firstRow][firstColumn] = fourthSticker;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const rotateFace = (image, face, direction) => {
|
|
47
|
+
const size = image[0].length;
|
|
48
|
+
const facePosition = faceIndex(face);
|
|
49
|
+
const rowLimit = Math.floor((size + 1) / 2);
|
|
50
|
+
const columnLimit = Math.floor(size / 2);
|
|
51
|
+
for (let row = 0; row < rowLimit; row += 1) for (let column = 0; column < columnLimit; column += 1) {
|
|
52
|
+
const cycle = [
|
|
53
|
+
[
|
|
54
|
+
facePosition,
|
|
55
|
+
row,
|
|
56
|
+
column
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
facePosition,
|
|
60
|
+
column,
|
|
61
|
+
size - 1 - row
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
facePosition,
|
|
65
|
+
size - 1 - row,
|
|
66
|
+
size - 1 - column
|
|
67
|
+
],
|
|
68
|
+
[
|
|
69
|
+
facePosition,
|
|
70
|
+
size - 1 - column,
|
|
71
|
+
row
|
|
72
|
+
]
|
|
73
|
+
];
|
|
74
|
+
if (direction === 1) swap(image, cycle[0], cycle[1], cycle[2], cycle[3], 1);
|
|
75
|
+
else swap(image, cycle[0], cycle[1], cycle[2], cycle[3], 3);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const slice = (face, sliceIndex, image) => {
|
|
79
|
+
const size = image[0].length;
|
|
80
|
+
let sliceFace = face;
|
|
81
|
+
let stateSliceIndex = sliceIndex;
|
|
82
|
+
let direction = 1;
|
|
83
|
+
if (face !== "L" && face !== "D" && face !== "B") {
|
|
84
|
+
sliceFace = oppositeFace(face);
|
|
85
|
+
stateSliceIndex = size - 1 - sliceIndex;
|
|
86
|
+
direction = 3;
|
|
87
|
+
}
|
|
88
|
+
for (let position = 0; position < size; position += 1) if (sliceFace === "L") swap(image, [
|
|
89
|
+
faceIndex("U"),
|
|
90
|
+
position,
|
|
91
|
+
stateSliceIndex
|
|
92
|
+
], [
|
|
93
|
+
faceIndex("B"),
|
|
94
|
+
size - 1 - position,
|
|
95
|
+
size - 1 - stateSliceIndex
|
|
96
|
+
], [
|
|
97
|
+
faceIndex("D"),
|
|
98
|
+
position,
|
|
99
|
+
stateSliceIndex
|
|
100
|
+
], [
|
|
101
|
+
faceIndex("F"),
|
|
102
|
+
position,
|
|
103
|
+
stateSliceIndex
|
|
104
|
+
], direction);
|
|
105
|
+
else if (sliceFace === "D") swap(image, [
|
|
106
|
+
faceIndex("L"),
|
|
107
|
+
size - 1 - stateSliceIndex,
|
|
108
|
+
position
|
|
109
|
+
], [
|
|
110
|
+
faceIndex("B"),
|
|
111
|
+
size - 1 - stateSliceIndex,
|
|
112
|
+
position
|
|
113
|
+
], [
|
|
114
|
+
faceIndex("R"),
|
|
115
|
+
size - 1 - stateSliceIndex,
|
|
116
|
+
position
|
|
117
|
+
], [
|
|
118
|
+
faceIndex("F"),
|
|
119
|
+
size - 1 - stateSliceIndex,
|
|
120
|
+
position
|
|
121
|
+
], direction);
|
|
122
|
+
else swap(image, [
|
|
123
|
+
faceIndex("U"),
|
|
124
|
+
stateSliceIndex,
|
|
125
|
+
position
|
|
126
|
+
], [
|
|
127
|
+
faceIndex("R"),
|
|
128
|
+
position,
|
|
129
|
+
size - 1 - stateSliceIndex
|
|
130
|
+
], [
|
|
131
|
+
faceIndex("D"),
|
|
132
|
+
size - 1 - stateSliceIndex,
|
|
133
|
+
size - 1 - position
|
|
134
|
+
], [
|
|
135
|
+
faceIndex("L"),
|
|
136
|
+
size - 1 - position,
|
|
137
|
+
stateSliceIndex
|
|
138
|
+
], direction);
|
|
139
|
+
if (sliceIndex === 0) rotateFace(image, face, 3);
|
|
140
|
+
else if (sliceIndex === size - 1) rotateFace(image, oppositeFace(face), 1);
|
|
141
|
+
};
|
|
142
|
+
const moveSuffix = (amount) => {
|
|
143
|
+
if (amount === 2) return "2";
|
|
144
|
+
if (amount === 3) return "'";
|
|
145
|
+
return "";
|
|
146
|
+
};
|
|
147
|
+
const MALFORMED_MOVE = "<malformed>";
|
|
148
|
+
const rotationName = (face) => {
|
|
149
|
+
if (face === "R") return "x";
|
|
150
|
+
if (face === "U") return "y";
|
|
151
|
+
if (face === "F") return "z";
|
|
152
|
+
return face;
|
|
153
|
+
};
|
|
154
|
+
const moveToString = (move) => {
|
|
155
|
+
if (move.isRotation) return `${rotationName(move.face)}${moveSuffix(move.amount)}`;
|
|
156
|
+
if (move.width === 1) return `${move.face}${moveSuffix(move.amount)}`;
|
|
157
|
+
if (move.width === 2) return `${move.face}w${moveSuffix(move.amount)}`;
|
|
158
|
+
return `${move.width}${move.face}w${moveSuffix(move.amount)}`;
|
|
159
|
+
};
|
|
160
|
+
const validateMove = (state, move) => {
|
|
161
|
+
if (typeof move !== "object" || move === null || !isCubeFace(move.face) || !isMoveAmount(move.amount) || typeof move.isRotation !== "boolean") throw new InvalidMoveError(MALFORMED_MOVE, "cube");
|
|
162
|
+
if (move.isRotation) {
|
|
163
|
+
if (move.width !== Number.POSITIVE_INFINITY || move.face !== "R" && move.face !== "U" && move.face !== "F") throw new InvalidMoveError(MALFORMED_MOVE, "cube");
|
|
164
|
+
return move;
|
|
165
|
+
}
|
|
166
|
+
if (!Number.isSafeInteger(move.width)) throw new InvalidMoveError(MALFORMED_MOVE, "cube");
|
|
167
|
+
if (move.width < 1 || move.width > state.size) throw new InvalidMoveError(moveToString(move), "cube");
|
|
168
|
+
return move;
|
|
169
|
+
};
|
|
170
|
+
const createSolvedCubeState = (size) => {
|
|
171
|
+
if (!Number.isSafeInteger(size) || size < 1) throw new RangeError(`cube size must be a positive integer: ${size}`);
|
|
172
|
+
return createCubeState(size, CUBE_FACES.map((face) => Array.from({ length: size }, () => Array(size).fill(face))));
|
|
173
|
+
};
|
|
174
|
+
const applyCubeMove = (state, move) => {
|
|
175
|
+
const validMove = validateMove(state, move);
|
|
176
|
+
const nextImage = cloneCubeImage(state.image);
|
|
177
|
+
const width = validMove.isRotation ? state.size : validMove.width;
|
|
178
|
+
for (let turn = 0; turn < validMove.amount; turn += 1) for (let sliceIndex = 0; sliceIndex < width; sliceIndex += 1) slice(validMove.face, sliceIndex, nextImage);
|
|
179
|
+
return createCubeState(state.size, nextImage);
|
|
180
|
+
};
|
|
181
|
+
const areCubeStatesEqual = (a, b) => {
|
|
182
|
+
if (a.size !== b.size) return false;
|
|
183
|
+
for (let face = 0; face < CUBE_FACES.length; face += 1) for (let row = 0; row < a.size; row += 1) for (let column = 0; column < a.size; column += 1) if (a.image[face][row][column] !== b.image[face][row][column]) return false;
|
|
184
|
+
return true;
|
|
185
|
+
};
|
|
186
|
+
//#endregion
|
|
187
|
+
export { applyCubeMove, areCubeStatesEqual, createSolvedCubeState };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region .build/vendor/scramble-puzzle/src/errors.d.ts
|
|
2
|
+
declare class ScramblePuzzleError extends Error {
|
|
3
|
+
constructor(message: string, options?: ErrorOptions);
|
|
4
|
+
}
|
|
5
|
+
declare class InvalidMoveError extends ScramblePuzzleError {
|
|
6
|
+
constructor(move: string, puzzleId: string);
|
|
7
|
+
}
|
|
8
|
+
declare class InvalidScrambleError extends ScramblePuzzleError {
|
|
9
|
+
constructor(scramble: string, cause: unknown);
|
|
10
|
+
}
|
|
11
|
+
declare class UnregisteredPuzzleError extends ScramblePuzzleError {
|
|
12
|
+
constructor(eventId: string, options?: ErrorOptions);
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { InvalidMoveError, InvalidScrambleError, ScramblePuzzleError, UnregisteredPuzzleError };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region ../scramble-puzzle/src/errors.ts
|
|
2
|
+
const ERROR_PREFIX = "@cubegin/scramble-puzzle";
|
|
3
|
+
const withPrefix = (message) => `${ERROR_PREFIX}: ${message}`;
|
|
4
|
+
var ScramblePuzzleError = class extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(withPrefix(message), options);
|
|
7
|
+
this.name = "ScramblePuzzleError";
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var InvalidMoveError = class extends ScramblePuzzleError {
|
|
11
|
+
constructor(move, puzzleId) {
|
|
12
|
+
super(`move '${move}' is invalid for puzzle '${puzzleId}'`);
|
|
13
|
+
this.name = "InvalidMoveError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var InvalidScrambleError = class extends ScramblePuzzleError {
|
|
17
|
+
constructor(scramble, cause) {
|
|
18
|
+
const causeMessage = cause instanceof Error ? cause.message : String(cause);
|
|
19
|
+
super(`scramble '${scramble}' is invalid: ${causeMessage}`, { cause });
|
|
20
|
+
this.name = "InvalidScrambleError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { InvalidMoveError, InvalidScrambleError, ScramblePuzzleError };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region .build/vendor/scramble-puzzle/src/errors.ts
|
|
2
|
+
const ERROR_PREFIX = "@cubegin/scramble-puzzle";
|
|
3
|
+
const withPrefix = (message) => `${ERROR_PREFIX}: ${message}`;
|
|
4
|
+
var ScramblePuzzleError = class extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(withPrefix(message), options);
|
|
7
|
+
this.name = "ScramblePuzzleError";
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var InvalidMoveError = class extends ScramblePuzzleError {
|
|
11
|
+
constructor(move, puzzleId) {
|
|
12
|
+
super(`move '${move}' is invalid for puzzle '${puzzleId}'`);
|
|
13
|
+
this.name = "InvalidMoveError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var InvalidScrambleError = class extends ScramblePuzzleError {
|
|
17
|
+
constructor(scramble, cause) {
|
|
18
|
+
const causeMessage = cause instanceof Error ? cause.message : String(cause);
|
|
19
|
+
super(`scramble '${scramble}' is invalid: ${causeMessage}`, { cause });
|
|
20
|
+
this.name = "InvalidScrambleError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var UnregisteredPuzzleError = class extends ScramblePuzzleError {
|
|
24
|
+
constructor(eventId, options) {
|
|
25
|
+
super(`event '${eventId}' is not registered`, options);
|
|
26
|
+
this.name = "UnregisteredPuzzleError";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { InvalidMoveError, InvalidScrambleError, ScramblePuzzleError, UnregisteredPuzzleError };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
//#region ../scramble-puzzle/src/events.d.ts
|
|
2
|
+
declare const WCA_EVENT_IDS: readonly ["333", "222", "444", "555", "666", "777", "333bld", "333fm", "333oh", "clock", "minx", "pyram", "skewb", "sq1", "444bld", "555bld", "333mbld"];
|
|
3
|
+
type WcaEventId = (typeof WCA_EVENT_IDS)[number];
|
|
4
|
+
//#endregion
|
|
5
|
+
export { WcaEventId };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
//#region ../scramble-puzzle/src/events.ts
|
|
2
|
+
const WCA_EVENT_INFO = Object.freeze({
|
|
3
|
+
"333": {
|
|
4
|
+
id: "333",
|
|
5
|
+
label: "3x3x3 Cube",
|
|
6
|
+
puzzleId: "cube"
|
|
7
|
+
},
|
|
8
|
+
"222": {
|
|
9
|
+
id: "222",
|
|
10
|
+
label: "2x2x2 Cube",
|
|
11
|
+
puzzleId: "cube"
|
|
12
|
+
},
|
|
13
|
+
"444": {
|
|
14
|
+
id: "444",
|
|
15
|
+
label: "4x4x4 Cube",
|
|
16
|
+
puzzleId: "cube"
|
|
17
|
+
},
|
|
18
|
+
"555": {
|
|
19
|
+
id: "555",
|
|
20
|
+
label: "5x5x5 Cube",
|
|
21
|
+
puzzleId: "cube"
|
|
22
|
+
},
|
|
23
|
+
"666": {
|
|
24
|
+
id: "666",
|
|
25
|
+
label: "6x6x6 Cube",
|
|
26
|
+
puzzleId: "cube"
|
|
27
|
+
},
|
|
28
|
+
"777": {
|
|
29
|
+
id: "777",
|
|
30
|
+
label: "7x7x7 Cube",
|
|
31
|
+
puzzleId: "cube"
|
|
32
|
+
},
|
|
33
|
+
"333bld": {
|
|
34
|
+
id: "333bld",
|
|
35
|
+
label: "3x3 Blindfolded",
|
|
36
|
+
puzzleId: "cube"
|
|
37
|
+
},
|
|
38
|
+
"333fm": {
|
|
39
|
+
id: "333fm",
|
|
40
|
+
label: "3x3 Fewest Moves",
|
|
41
|
+
puzzleId: "cube"
|
|
42
|
+
},
|
|
43
|
+
"333oh": {
|
|
44
|
+
id: "333oh",
|
|
45
|
+
label: "3x3 One-Handed",
|
|
46
|
+
puzzleId: "cube"
|
|
47
|
+
},
|
|
48
|
+
clock: {
|
|
49
|
+
id: "clock",
|
|
50
|
+
label: "Clock",
|
|
51
|
+
puzzleId: "clock"
|
|
52
|
+
},
|
|
53
|
+
minx: {
|
|
54
|
+
id: "minx",
|
|
55
|
+
label: "Megaminx",
|
|
56
|
+
puzzleId: "megaminx"
|
|
57
|
+
},
|
|
58
|
+
pyram: {
|
|
59
|
+
id: "pyram",
|
|
60
|
+
label: "Pyraminx",
|
|
61
|
+
puzzleId: "pyraminx"
|
|
62
|
+
},
|
|
63
|
+
skewb: {
|
|
64
|
+
id: "skewb",
|
|
65
|
+
label: "Skewb",
|
|
66
|
+
puzzleId: "skewb"
|
|
67
|
+
},
|
|
68
|
+
sq1: {
|
|
69
|
+
id: "sq1",
|
|
70
|
+
label: "Square-1",
|
|
71
|
+
puzzleId: "square1"
|
|
72
|
+
},
|
|
73
|
+
"444bld": {
|
|
74
|
+
id: "444bld",
|
|
75
|
+
label: "4x4 Blindfolded",
|
|
76
|
+
puzzleId: "cube"
|
|
77
|
+
},
|
|
78
|
+
"555bld": {
|
|
79
|
+
id: "555bld",
|
|
80
|
+
label: "5x5 Blindfolded",
|
|
81
|
+
puzzleId: "cube"
|
|
82
|
+
},
|
|
83
|
+
"333mbld": {
|
|
84
|
+
id: "333mbld",
|
|
85
|
+
label: "3x3 Multi-Blind",
|
|
86
|
+
puzzleId: "cube"
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
//#endregion
|
|
90
|
+
export { WCA_EVENT_INFO };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//#region .build/vendor/scramble-puzzle/src/events.d.ts
|
|
2
|
+
declare const WCA_EVENT_IDS: readonly ["333", "222", "444", "555", "666", "777", "333bld", "333fm", "333oh", "clock", "minx", "pyram", "skewb", "sq1", "444bld", "555bld", "333mbld"];
|
|
3
|
+
type WcaEventId = (typeof WCA_EVENT_IDS)[number];
|
|
4
|
+
type PuzzleId = 'cube' | 'clock' | 'megaminx' | 'pyraminx' | 'skewb' | 'square1';
|
|
5
|
+
interface WcaEventInfo {
|
|
6
|
+
readonly id: WcaEventId;
|
|
7
|
+
readonly label: string;
|
|
8
|
+
readonly puzzleId: PuzzleId;
|
|
9
|
+
}
|
|
10
|
+
declare const WCA_EVENT_INFO: Readonly<{
|
|
11
|
+
'333': {
|
|
12
|
+
id: "333";
|
|
13
|
+
label: string;
|
|
14
|
+
puzzleId: "cube";
|
|
15
|
+
};
|
|
16
|
+
'222': {
|
|
17
|
+
id: "222";
|
|
18
|
+
label: string;
|
|
19
|
+
puzzleId: "cube";
|
|
20
|
+
};
|
|
21
|
+
'444': {
|
|
22
|
+
id: "444";
|
|
23
|
+
label: string;
|
|
24
|
+
puzzleId: "cube";
|
|
25
|
+
};
|
|
26
|
+
'555': {
|
|
27
|
+
id: "555";
|
|
28
|
+
label: string;
|
|
29
|
+
puzzleId: "cube";
|
|
30
|
+
};
|
|
31
|
+
'666': {
|
|
32
|
+
id: "666";
|
|
33
|
+
label: string;
|
|
34
|
+
puzzleId: "cube";
|
|
35
|
+
};
|
|
36
|
+
'777': {
|
|
37
|
+
id: "777";
|
|
38
|
+
label: string;
|
|
39
|
+
puzzleId: "cube";
|
|
40
|
+
};
|
|
41
|
+
'333bld': {
|
|
42
|
+
id: "333bld";
|
|
43
|
+
label: string;
|
|
44
|
+
puzzleId: "cube";
|
|
45
|
+
};
|
|
46
|
+
'333fm': {
|
|
47
|
+
id: "333fm";
|
|
48
|
+
label: string;
|
|
49
|
+
puzzleId: "cube";
|
|
50
|
+
};
|
|
51
|
+
'333oh': {
|
|
52
|
+
id: "333oh";
|
|
53
|
+
label: string;
|
|
54
|
+
puzzleId: "cube";
|
|
55
|
+
};
|
|
56
|
+
clock: {
|
|
57
|
+
id: "clock";
|
|
58
|
+
label: string;
|
|
59
|
+
puzzleId: "clock";
|
|
60
|
+
};
|
|
61
|
+
minx: {
|
|
62
|
+
id: "minx";
|
|
63
|
+
label: string;
|
|
64
|
+
puzzleId: "megaminx";
|
|
65
|
+
};
|
|
66
|
+
pyram: {
|
|
67
|
+
id: "pyram";
|
|
68
|
+
label: string;
|
|
69
|
+
puzzleId: "pyraminx";
|
|
70
|
+
};
|
|
71
|
+
skewb: {
|
|
72
|
+
id: "skewb";
|
|
73
|
+
label: string;
|
|
74
|
+
puzzleId: "skewb";
|
|
75
|
+
};
|
|
76
|
+
sq1: {
|
|
77
|
+
id: "sq1";
|
|
78
|
+
label: string;
|
|
79
|
+
puzzleId: "square1";
|
|
80
|
+
};
|
|
81
|
+
'444bld': {
|
|
82
|
+
id: "444bld";
|
|
83
|
+
label: string;
|
|
84
|
+
puzzleId: "cube";
|
|
85
|
+
};
|
|
86
|
+
'555bld': {
|
|
87
|
+
id: "555bld";
|
|
88
|
+
label: string;
|
|
89
|
+
puzzleId: "cube";
|
|
90
|
+
};
|
|
91
|
+
'333mbld': {
|
|
92
|
+
id: "333mbld";
|
|
93
|
+
label: string;
|
|
94
|
+
puzzleId: "cube";
|
|
95
|
+
};
|
|
96
|
+
}>;
|
|
97
|
+
//#endregion
|
|
98
|
+
export { PuzzleId, WCA_EVENT_IDS, WCA_EVENT_INFO, WcaEventId, WcaEventInfo };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
//#region .build/vendor/scramble-puzzle/src/events.ts
|
|
2
|
+
const WCA_EVENT_IDS = [
|
|
3
|
+
"333",
|
|
4
|
+
"222",
|
|
5
|
+
"444",
|
|
6
|
+
"555",
|
|
7
|
+
"666",
|
|
8
|
+
"777",
|
|
9
|
+
"333bld",
|
|
10
|
+
"333fm",
|
|
11
|
+
"333oh",
|
|
12
|
+
"clock",
|
|
13
|
+
"minx",
|
|
14
|
+
"pyram",
|
|
15
|
+
"skewb",
|
|
16
|
+
"sq1",
|
|
17
|
+
"444bld",
|
|
18
|
+
"555bld",
|
|
19
|
+
"333mbld"
|
|
20
|
+
];
|
|
21
|
+
const WCA_EVENT_INFO = Object.freeze({
|
|
22
|
+
"333": {
|
|
23
|
+
id: "333",
|
|
24
|
+
label: "3x3x3 Cube",
|
|
25
|
+
puzzleId: "cube"
|
|
26
|
+
},
|
|
27
|
+
"222": {
|
|
28
|
+
id: "222",
|
|
29
|
+
label: "2x2x2 Cube",
|
|
30
|
+
puzzleId: "cube"
|
|
31
|
+
},
|
|
32
|
+
"444": {
|
|
33
|
+
id: "444",
|
|
34
|
+
label: "4x4x4 Cube",
|
|
35
|
+
puzzleId: "cube"
|
|
36
|
+
},
|
|
37
|
+
"555": {
|
|
38
|
+
id: "555",
|
|
39
|
+
label: "5x5x5 Cube",
|
|
40
|
+
puzzleId: "cube"
|
|
41
|
+
},
|
|
42
|
+
"666": {
|
|
43
|
+
id: "666",
|
|
44
|
+
label: "6x6x6 Cube",
|
|
45
|
+
puzzleId: "cube"
|
|
46
|
+
},
|
|
47
|
+
"777": {
|
|
48
|
+
id: "777",
|
|
49
|
+
label: "7x7x7 Cube",
|
|
50
|
+
puzzleId: "cube"
|
|
51
|
+
},
|
|
52
|
+
"333bld": {
|
|
53
|
+
id: "333bld",
|
|
54
|
+
label: "3x3 Blindfolded",
|
|
55
|
+
puzzleId: "cube"
|
|
56
|
+
},
|
|
57
|
+
"333fm": {
|
|
58
|
+
id: "333fm",
|
|
59
|
+
label: "3x3 Fewest Moves",
|
|
60
|
+
puzzleId: "cube"
|
|
61
|
+
},
|
|
62
|
+
"333oh": {
|
|
63
|
+
id: "333oh",
|
|
64
|
+
label: "3x3 One-Handed",
|
|
65
|
+
puzzleId: "cube"
|
|
66
|
+
},
|
|
67
|
+
clock: {
|
|
68
|
+
id: "clock",
|
|
69
|
+
label: "Clock",
|
|
70
|
+
puzzleId: "clock"
|
|
71
|
+
},
|
|
72
|
+
minx: {
|
|
73
|
+
id: "minx",
|
|
74
|
+
label: "Megaminx",
|
|
75
|
+
puzzleId: "megaminx"
|
|
76
|
+
},
|
|
77
|
+
pyram: {
|
|
78
|
+
id: "pyram",
|
|
79
|
+
label: "Pyraminx",
|
|
80
|
+
puzzleId: "pyraminx"
|
|
81
|
+
},
|
|
82
|
+
skewb: {
|
|
83
|
+
id: "skewb",
|
|
84
|
+
label: "Skewb",
|
|
85
|
+
puzzleId: "skewb"
|
|
86
|
+
},
|
|
87
|
+
sq1: {
|
|
88
|
+
id: "sq1",
|
|
89
|
+
label: "Square-1",
|
|
90
|
+
puzzleId: "square1"
|
|
91
|
+
},
|
|
92
|
+
"444bld": {
|
|
93
|
+
id: "444bld",
|
|
94
|
+
label: "4x4 Blindfolded",
|
|
95
|
+
puzzleId: "cube"
|
|
96
|
+
},
|
|
97
|
+
"555bld": {
|
|
98
|
+
id: "555bld",
|
|
99
|
+
label: "5x5 Blindfolded",
|
|
100
|
+
puzzleId: "cube"
|
|
101
|
+
},
|
|
102
|
+
"333mbld": {
|
|
103
|
+
id: "333mbld",
|
|
104
|
+
label: "3x3 Multi-Blind",
|
|
105
|
+
puzzleId: "cube"
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
//#endregion
|
|
109
|
+
export { WCA_EVENT_IDS, WCA_EVENT_INFO };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "./events.mjs";
|
|
2
|
+
import "./errors.mjs";
|
|
3
|
+
import "./algorithm.mjs";
|
|
4
|
+
import "./cube/cube-parser.mjs";
|
|
5
|
+
import "./cube/cube-state.mjs";
|
|
6
|
+
import "./cube/cube-definition.mjs";
|
|
7
|
+
import "./clock/clock-parser.mjs";
|
|
8
|
+
import "./clock/clock-state.mjs";
|
|
9
|
+
import "./clock/clock-definition.mjs";
|
|
10
|
+
import "./megaminx/megaminx-parser.mjs";
|
|
11
|
+
import "./megaminx/megaminx-state.mjs";
|
|
12
|
+
import "./megaminx/megaminx-definition.mjs";
|
|
13
|
+
import "./pyraminx/pyraminx-parser.mjs";
|
|
14
|
+
import "./pyraminx/pyraminx-state.mjs";
|
|
15
|
+
import "./pyraminx/pyraminx-definition.mjs";
|
|
16
|
+
import "./skewb/skewb-parser.mjs";
|
|
17
|
+
import "./skewb/skewb-state.mjs";
|
|
18
|
+
import "./skewb/skewb-definition.mjs";
|
|
19
|
+
import "./square1/square1-parser.mjs";
|
|
20
|
+
import "./square1/square1-state.mjs";
|
|
21
|
+
import "./square1/square1-definition.mjs";
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PuzzleDefinition } from "../puzzle-definition.mjs";
|
|
2
|
+
import { MegaminxMove } from "./megaminx-parser2.mjs";
|
|
3
|
+
import { MegaminxState } from "./megaminx-state2.mjs";
|
|
4
|
+
|
|
5
|
+
//#region .build/vendor/scramble-puzzle/src/megaminx/megaminx-definition.d.ts
|
|
6
|
+
declare const createMegaminxDefinition: () => PuzzleDefinition<MegaminxState, MegaminxMove>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { createMegaminxDefinition };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { applyAlgorithm } from "../algorithm.mjs";
|
|
2
|
+
import { parseMegaminxAlgorithm } from "./megaminx-parser.mjs";
|
|
3
|
+
import { applyMegaminxMove, areMegaminxStatesEqual, createSolvedMegaminxState } from "./megaminx-state.mjs";
|
|
4
|
+
//#region ../scramble-puzzle/src/megaminx/megaminx-definition.ts
|
|
5
|
+
const createMegaminxDefinition = () => {
|
|
6
|
+
const definition = {
|
|
7
|
+
id: "megaminx",
|
|
8
|
+
eventIds: ["minx"],
|
|
9
|
+
createSolvedState: createSolvedMegaminxState,
|
|
10
|
+
parseAlgorithm: parseMegaminxAlgorithm,
|
|
11
|
+
applyMove: applyMegaminxMove,
|
|
12
|
+
applyAlgorithm: (state, algorithm) => applyAlgorithm(definition, state, algorithm),
|
|
13
|
+
isSolved: (state) => areMegaminxStatesEqual(state, createSolvedMegaminxState())
|
|
14
|
+
};
|
|
15
|
+
return definition;
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createMegaminxDefinition };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { applyAlgorithm } from "../algorithm2.mjs";
|
|
2
|
+
import { parseMegaminxAlgorithm } from "./megaminx-parser2.mjs";
|
|
3
|
+
import { applyMegaminxMove, areMegaminxStatesEqual, createSolvedMegaminxState } from "./megaminx-state2.mjs";
|
|
4
|
+
//#region .build/vendor/scramble-puzzle/src/megaminx/megaminx-definition.ts
|
|
5
|
+
const createMegaminxDefinition = () => {
|
|
6
|
+
const definition = {
|
|
7
|
+
id: "megaminx",
|
|
8
|
+
eventIds: ["minx"],
|
|
9
|
+
createSolvedState: createSolvedMegaminxState,
|
|
10
|
+
parseAlgorithm: parseMegaminxAlgorithm,
|
|
11
|
+
applyMove: applyMegaminxMove,
|
|
12
|
+
applyAlgorithm: (state, algorithm) => applyAlgorithm(definition, state, algorithm),
|
|
13
|
+
isSolved: (state) => areMegaminxStatesEqual(state, createSolvedMegaminxState())
|
|
14
|
+
};
|
|
15
|
+
return definition;
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createMegaminxDefinition };
|