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,115 @@
|
|
|
1
|
+
import { InvalidMoveError } from "../errors.mjs";
|
|
2
|
+
import { validateSquareOneMove } from "./square1-parser.mjs";
|
|
3
|
+
//#region ../scramble-puzzle/src/square1/square1-state.ts
|
|
4
|
+
const PIECE_COUNT = 24;
|
|
5
|
+
const TOP_START = 0;
|
|
6
|
+
const BOTTOM_START = 12;
|
|
7
|
+
const HALF_PIECE_COUNT = 12;
|
|
8
|
+
const SLICE_WIDTH = 6;
|
|
9
|
+
const SOLVED_SQUARE_ONE_PIECES = [
|
|
10
|
+
0,
|
|
11
|
+
0,
|
|
12
|
+
1,
|
|
13
|
+
2,
|
|
14
|
+
2,
|
|
15
|
+
3,
|
|
16
|
+
4,
|
|
17
|
+
4,
|
|
18
|
+
5,
|
|
19
|
+
6,
|
|
20
|
+
6,
|
|
21
|
+
7,
|
|
22
|
+
8,
|
|
23
|
+
9,
|
|
24
|
+
9,
|
|
25
|
+
10,
|
|
26
|
+
11,
|
|
27
|
+
11,
|
|
28
|
+
12,
|
|
29
|
+
13,
|
|
30
|
+
13,
|
|
31
|
+
14,
|
|
32
|
+
15,
|
|
33
|
+
15
|
|
34
|
+
];
|
|
35
|
+
const SQUARE_ONE_TURNS = [
|
|
36
|
+
-5,
|
|
37
|
+
-4,
|
|
38
|
+
-3,
|
|
39
|
+
-2,
|
|
40
|
+
-1,
|
|
41
|
+
0,
|
|
42
|
+
1,
|
|
43
|
+
2,
|
|
44
|
+
3,
|
|
45
|
+
4,
|
|
46
|
+
5,
|
|
47
|
+
6
|
|
48
|
+
];
|
|
49
|
+
const createSquareOneState = (sliceSolved, pieces) => {
|
|
50
|
+
if (pieces.length !== PIECE_COUNT) throw new RangeError(`square1 state must contain 24 piece positions: ${pieces.length}`);
|
|
51
|
+
for (const piece of pieces) if (!Number.isSafeInteger(piece) || piece < 0 || piece > 15) throw new RangeError("square1 pieces must be integer piece indexes from 0 to 15");
|
|
52
|
+
return Object.freeze({
|
|
53
|
+
sliceSolved,
|
|
54
|
+
pieces: Object.freeze([...pieces])
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const rotateHalf = (pieces, start, turn) => {
|
|
58
|
+
const offset = (-turn % HALF_PIECE_COUNT + HALF_PIECE_COUNT) % HALF_PIECE_COUNT;
|
|
59
|
+
const half = pieces.slice(start, start + HALF_PIECE_COUNT);
|
|
60
|
+
for (let index = 0; index < HALF_PIECE_COUNT; index += 1) pieces[start + index] = half[(offset + index) % HALF_PIECE_COUNT];
|
|
61
|
+
};
|
|
62
|
+
const rotateTopAndBottom = (pieces, move) => {
|
|
63
|
+
const nextPieces = [...pieces];
|
|
64
|
+
rotateHalf(nextPieces, TOP_START, move.top);
|
|
65
|
+
rotateHalf(nextPieces, BOTTOM_START, move.bottom);
|
|
66
|
+
return nextPieces;
|
|
67
|
+
};
|
|
68
|
+
const slashPieces = (pieces) => {
|
|
69
|
+
const nextPieces = [...pieces];
|
|
70
|
+
for (let index = 0; index < SLICE_WIDTH; index += 1) {
|
|
71
|
+
const topIndex = TOP_START + SLICE_WIDTH + index;
|
|
72
|
+
const bottomIndex = BOTTOM_START + index;
|
|
73
|
+
const bottomPiece = nextPieces[bottomIndex];
|
|
74
|
+
nextPieces[bottomIndex] = nextPieces[topIndex];
|
|
75
|
+
nextPieces[topIndex] = bottomPiece;
|
|
76
|
+
}
|
|
77
|
+
return nextPieces;
|
|
78
|
+
};
|
|
79
|
+
const createSolvedSquareOneState = () => createSquareOneState(true, SOLVED_SQUARE_ONE_PIECES);
|
|
80
|
+
const canSquareOneSlash = (state) => state.pieces[0] !== state.pieces[11] && state.pieces[6] !== state.pieces[5] && state.pieces[12] !== state.pieces[23] && state.pieces[18] !== state.pieces[17];
|
|
81
|
+
const applySquareOneMove = (state, move) => {
|
|
82
|
+
const validMove = validateSquareOneMove(move);
|
|
83
|
+
if (validMove.type === "slash") {
|
|
84
|
+
if (!canSquareOneSlash(state)) throw new InvalidMoveError("/", "square1");
|
|
85
|
+
return createSquareOneState(!state.sliceSolved, slashPieces(state.pieces));
|
|
86
|
+
}
|
|
87
|
+
return createSquareOneState(state.sliceSolved, rotateTopAndBottom(state.pieces, validMove));
|
|
88
|
+
};
|
|
89
|
+
const areSquareOneStatesEqual = (a, b) => a.sliceSolved === b.sliceSolved && a.pieces.length === PIECE_COUNT && b.pieces.length === PIECE_COUNT && a.pieces.every((piece, index) => piece === b.pieces[index]);
|
|
90
|
+
const getSquareOneSuccessors = (state) => {
|
|
91
|
+
const successors = [];
|
|
92
|
+
for (const top of SQUARE_ONE_TURNS) for (const bottom of SQUARE_ONE_TURNS) {
|
|
93
|
+
if (top === 0 && bottom === 0) continue;
|
|
94
|
+
const move = {
|
|
95
|
+
type: "tuple",
|
|
96
|
+
top,
|
|
97
|
+
bottom
|
|
98
|
+
};
|
|
99
|
+
successors.push({
|
|
100
|
+
move,
|
|
101
|
+
state: applySquareOneMove(state, move)
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (canSquareOneSlash(state)) {
|
|
105
|
+
const move = { type: "slash" };
|
|
106
|
+
successors.push({
|
|
107
|
+
move,
|
|
108
|
+
state: applySquareOneMove(state, move)
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return Object.freeze(successors);
|
|
112
|
+
};
|
|
113
|
+
const getSquareOneScrambleSuccessors = (state) => getSquareOneSuccessors(state).filter((successor) => canSquareOneSlash(successor.state));
|
|
114
|
+
//#endregion
|
|
115
|
+
export { applySquareOneMove, areSquareOneStatesEqual, canSquareOneSlash, createSolvedSquareOneState, getSquareOneScrambleSuccessors, getSquareOneSuccessors };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SquareOneMove } from "./square1-parser.mjs";
|
|
2
|
+
|
|
3
|
+
//#region .build/vendor/scramble-puzzle/src/square1/square1-state.d.ts
|
|
4
|
+
type SquareOnePiece = number;
|
|
5
|
+
type SquareOnePieces = readonly SquareOnePiece[];
|
|
6
|
+
interface SquareOneState {
|
|
7
|
+
readonly sliceSolved: boolean;
|
|
8
|
+
readonly pieces: SquareOnePieces;
|
|
9
|
+
}
|
|
10
|
+
interface SquareOneSuccessor {
|
|
11
|
+
readonly move: SquareOneMove;
|
|
12
|
+
readonly state: SquareOneState;
|
|
13
|
+
}
|
|
14
|
+
declare const createSolvedSquareOneState: () => SquareOneState;
|
|
15
|
+
declare const canSquareOneSlash: (state: SquareOneState) => boolean;
|
|
16
|
+
declare const applySquareOneMove: (state: SquareOneState, move: SquareOneMove) => SquareOneState;
|
|
17
|
+
declare const areSquareOneStatesEqual: (a: SquareOneState, b: SquareOneState) => boolean;
|
|
18
|
+
declare const getSquareOneSuccessors: (state: SquareOneState) => readonly SquareOneSuccessor[];
|
|
19
|
+
declare const getSquareOneScrambleSuccessors: (state: SquareOneState) => readonly SquareOneSuccessor[];
|
|
20
|
+
//#endregion
|
|
21
|
+
export { SquareOnePiece, SquareOnePieces, SquareOneState, SquareOneSuccessor, applySquareOneMove, areSquareOneStatesEqual, canSquareOneSlash, createSolvedSquareOneState, getSquareOneScrambleSuccessors, getSquareOneSuccessors };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { InvalidMoveError } from "../errors2.mjs";
|
|
2
|
+
import { validateSquareOneMove } from "./square1-parser2.mjs";
|
|
3
|
+
//#region .build/vendor/scramble-puzzle/src/square1/square1-state.ts
|
|
4
|
+
const PIECE_COUNT = 24;
|
|
5
|
+
const TOP_START = 0;
|
|
6
|
+
const BOTTOM_START = 12;
|
|
7
|
+
const HALF_PIECE_COUNT = 12;
|
|
8
|
+
const SLICE_WIDTH = 6;
|
|
9
|
+
const SOLVED_SQUARE_ONE_PIECES = [
|
|
10
|
+
0,
|
|
11
|
+
0,
|
|
12
|
+
1,
|
|
13
|
+
2,
|
|
14
|
+
2,
|
|
15
|
+
3,
|
|
16
|
+
4,
|
|
17
|
+
4,
|
|
18
|
+
5,
|
|
19
|
+
6,
|
|
20
|
+
6,
|
|
21
|
+
7,
|
|
22
|
+
8,
|
|
23
|
+
9,
|
|
24
|
+
9,
|
|
25
|
+
10,
|
|
26
|
+
11,
|
|
27
|
+
11,
|
|
28
|
+
12,
|
|
29
|
+
13,
|
|
30
|
+
13,
|
|
31
|
+
14,
|
|
32
|
+
15,
|
|
33
|
+
15
|
|
34
|
+
];
|
|
35
|
+
const SQUARE_ONE_TURNS = [
|
|
36
|
+
-5,
|
|
37
|
+
-4,
|
|
38
|
+
-3,
|
|
39
|
+
-2,
|
|
40
|
+
-1,
|
|
41
|
+
0,
|
|
42
|
+
1,
|
|
43
|
+
2,
|
|
44
|
+
3,
|
|
45
|
+
4,
|
|
46
|
+
5,
|
|
47
|
+
6
|
|
48
|
+
];
|
|
49
|
+
const createSquareOneState = (sliceSolved, pieces) => {
|
|
50
|
+
if (pieces.length !== PIECE_COUNT) throw new RangeError(`square1 state must contain 24 piece positions: ${pieces.length}`);
|
|
51
|
+
for (const piece of pieces) if (!Number.isSafeInteger(piece) || piece < 0 || piece > 15) throw new RangeError("square1 pieces must be integer piece indexes from 0 to 15");
|
|
52
|
+
return Object.freeze({
|
|
53
|
+
sliceSolved,
|
|
54
|
+
pieces: Object.freeze([...pieces])
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const rotateHalf = (pieces, start, turn) => {
|
|
58
|
+
const offset = (-turn % HALF_PIECE_COUNT + HALF_PIECE_COUNT) % HALF_PIECE_COUNT;
|
|
59
|
+
const half = pieces.slice(start, start + HALF_PIECE_COUNT);
|
|
60
|
+
for (let index = 0; index < HALF_PIECE_COUNT; index += 1) pieces[start + index] = half[(offset + index) % HALF_PIECE_COUNT];
|
|
61
|
+
};
|
|
62
|
+
const rotateTopAndBottom = (pieces, move) => {
|
|
63
|
+
const nextPieces = [...pieces];
|
|
64
|
+
rotateHalf(nextPieces, TOP_START, move.top);
|
|
65
|
+
rotateHalf(nextPieces, BOTTOM_START, move.bottom);
|
|
66
|
+
return nextPieces;
|
|
67
|
+
};
|
|
68
|
+
const slashPieces = (pieces) => {
|
|
69
|
+
const nextPieces = [...pieces];
|
|
70
|
+
for (let index = 0; index < SLICE_WIDTH; index += 1) {
|
|
71
|
+
const topIndex = TOP_START + SLICE_WIDTH + index;
|
|
72
|
+
const bottomIndex = BOTTOM_START + index;
|
|
73
|
+
const bottomPiece = nextPieces[bottomIndex];
|
|
74
|
+
nextPieces[bottomIndex] = nextPieces[topIndex];
|
|
75
|
+
nextPieces[topIndex] = bottomPiece;
|
|
76
|
+
}
|
|
77
|
+
return nextPieces;
|
|
78
|
+
};
|
|
79
|
+
const createSolvedSquareOneState = () => createSquareOneState(true, SOLVED_SQUARE_ONE_PIECES);
|
|
80
|
+
const canSquareOneSlash = (state) => state.pieces[0] !== state.pieces[11] && state.pieces[6] !== state.pieces[5] && state.pieces[12] !== state.pieces[23] && state.pieces[18] !== state.pieces[17];
|
|
81
|
+
const applySquareOneMove = (state, move) => {
|
|
82
|
+
const validMove = validateSquareOneMove(move);
|
|
83
|
+
if (validMove.type === "slash") {
|
|
84
|
+
if (!canSquareOneSlash(state)) throw new InvalidMoveError("/", "square1");
|
|
85
|
+
return createSquareOneState(!state.sliceSolved, slashPieces(state.pieces));
|
|
86
|
+
}
|
|
87
|
+
return createSquareOneState(state.sliceSolved, rotateTopAndBottom(state.pieces, validMove));
|
|
88
|
+
};
|
|
89
|
+
const areSquareOneStatesEqual = (a, b) => a.sliceSolved === b.sliceSolved && a.pieces.length === PIECE_COUNT && b.pieces.length === PIECE_COUNT && a.pieces.every((piece, index) => piece === b.pieces[index]);
|
|
90
|
+
const getSquareOneSuccessors = (state) => {
|
|
91
|
+
const successors = [];
|
|
92
|
+
for (const top of SQUARE_ONE_TURNS) for (const bottom of SQUARE_ONE_TURNS) {
|
|
93
|
+
if (top === 0 && bottom === 0) continue;
|
|
94
|
+
const move = {
|
|
95
|
+
type: "tuple",
|
|
96
|
+
top,
|
|
97
|
+
bottom
|
|
98
|
+
};
|
|
99
|
+
successors.push({
|
|
100
|
+
move,
|
|
101
|
+
state: applySquareOneMove(state, move)
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (canSquareOneSlash(state)) {
|
|
105
|
+
const move = { type: "slash" };
|
|
106
|
+
successors.push({
|
|
107
|
+
move,
|
|
108
|
+
state: applySquareOneMove(state, move)
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return Object.freeze(successors);
|
|
112
|
+
};
|
|
113
|
+
const getSquareOneScrambleSuccessors = (state) => getSquareOneSuccessors(state).filter((successor) => canSquareOneSlash(successor.state));
|
|
114
|
+
//#endregion
|
|
115
|
+
export { applySquareOneMove, areSquareOneStatesEqual, canSquareOneSlash, createSolvedSquareOneState, getSquareOneScrambleSuccessors, getSquareOneSuccessors };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PuzzleId, WCA_EVENT_IDS, WCA_EVENT_INFO, WcaEventId, WcaEventInfo } from "./scramble-puzzle/src/events2.mjs";
|
|
2
|
+
import { AppliedPuzzleState, PuzzleDefinition } from "./scramble-puzzle/src/puzzle-definition.mjs";
|
|
3
|
+
import { applyAlgorithm, splitAlgorithm } from "./scramble-puzzle/src/algorithm.mjs";
|
|
4
|
+
import { CubeFace, CubeLayerMove, CubeMove, CubeRotationMove } from "./scramble-puzzle/src/cube/cube-move2.mjs";
|
|
5
|
+
import { CubeFaceState, CubeFacelet, CubeImage, CubeState, applyCubeMove, areCubeStatesEqual, createSolvedCubeState } from "./scramble-puzzle/src/cube/cube-state2.mjs";
|
|
6
|
+
import { createCubeDefinition } from "./scramble-puzzle/src/cube/cube-definition.mjs";
|
|
7
|
+
import { parseCubeAlgorithm, parseCubeMove } from "./scramble-puzzle/src/cube/cube-parser.mjs";
|
|
8
|
+
import { ClockDirection, ClockMove, ClockRotationMove, ClockTurnMove, ClockTurnName, parseClockAlgorithm, parseClockMove } from "./scramble-puzzle/src/clock/clock-parser.mjs";
|
|
9
|
+
import { ClockPositions, ClockState, applyClockMove, areClockStatesEqual, createSolvedClockState } from "./scramble-puzzle/src/clock/clock-state2.mjs";
|
|
10
|
+
import { createClockDefinition } from "./scramble-puzzle/src/clock/clock-definition.mjs";
|
|
11
|
+
import { MEGAMINX_FACES, MegaminxBigTurnMove, MegaminxBigTurnName, MegaminxFace, MegaminxFaceMove, MegaminxMove, MegaminxMoveAmount, parseMegaminxAlgorithm, parseMegaminxMove } from "./scramble-puzzle/src/megaminx/megaminx-parser2.mjs";
|
|
12
|
+
import { MegaminxFaceState, MegaminxFacelet, MegaminxImage, MegaminxState, applyMegaminxMove, areMegaminxStatesEqual, createSolvedMegaminxState } from "./scramble-puzzle/src/megaminx/megaminx-state2.mjs";
|
|
13
|
+
import { createMegaminxDefinition } from "./scramble-puzzle/src/megaminx/megaminx-definition.mjs";
|
|
14
|
+
import { PYRAMINX_AXES, PYRAMINX_FACES, PyraminxAxis, PyraminxFace, PyraminxMove, PyraminxMoveAmount, PyraminxTipMove, PyraminxTurnMove, parsePyraminxAlgorithm, parsePyraminxMove } from "./scramble-puzzle/src/pyraminx/pyraminx-parser2.mjs";
|
|
15
|
+
import { PyraminxFaceState, PyraminxFacelet, PyraminxImage, PyraminxState, applyPyraminxMove, arePyraminxStatesEqual, createSolvedPyraminxState } from "./scramble-puzzle/src/pyraminx/pyraminx-state2.mjs";
|
|
16
|
+
import { createPyraminxDefinition } from "./scramble-puzzle/src/pyraminx/pyraminx-definition.mjs";
|
|
17
|
+
import { SKEWB_AXES, SKEWB_FACES, SkewbAxis, SkewbFace, SkewbMove, SkewbMoveAmount, parseSkewbAlgorithm, parseSkewbMove } from "./scramble-puzzle/src/skewb/skewb-parser2.mjs";
|
|
18
|
+
import { SkewbFaceState, SkewbFacelet, SkewbImage, SkewbState, applySkewbMove, areSkewbStatesEqual, createSolvedSkewbState } from "./scramble-puzzle/src/skewb/skewb-state2.mjs";
|
|
19
|
+
import { createSkewbDefinition } from "./scramble-puzzle/src/skewb/skewb-definition.mjs";
|
|
20
|
+
import { SquareOneMove, SquareOneSlashMove, SquareOneTupleMove, SquareOneTurn, getSquareOneMoveCost, getSquareOneSlashabilityMoveCost, parseSquareOneAlgorithm, parseSquareOneMove } from "./scramble-puzzle/src/square1/square1-parser.mjs";
|
|
21
|
+
import { SquareOnePiece, SquareOnePieces, SquareOneState, SquareOneSuccessor, applySquareOneMove, areSquareOneStatesEqual, canSquareOneSlash, createSolvedSquareOneState, getSquareOneScrambleSuccessors, getSquareOneSuccessors } from "./scramble-puzzle/src/square1/square1-state2.mjs";
|
|
22
|
+
import { createSquareOneDefinition } from "./scramble-puzzle/src/square1/square1-definition.mjs";
|
|
23
|
+
import { AnyPuzzleDefinition, PuzzleRegistry, createPuzzleRegistry } from "./scramble-puzzle/src/registry.mjs";
|
|
24
|
+
import { InvalidMoveError, InvalidScrambleError, ScramblePuzzleError, UnregisteredPuzzleError } from "./scramble-puzzle/src/errors.mjs";
|
|
25
|
+
export { type AnyPuzzleDefinition, type AppliedPuzzleState, type ClockDirection, type ClockMove, type ClockPositions, type ClockRotationMove, type ClockState, type ClockTurnMove, type ClockTurnName, type CubeFace, type CubeFaceState, type CubeFacelet, type CubeImage, type CubeLayerMove, type CubeMove, type CubeRotationMove, type CubeState, InvalidMoveError, InvalidScrambleError, MEGAMINX_FACES, type MegaminxBigTurnMove, type MegaminxBigTurnName, type MegaminxFace, type MegaminxFaceMove, type MegaminxFaceState, type MegaminxFacelet, type MegaminxImage, type MegaminxMove, type MegaminxMoveAmount, type MegaminxState, PYRAMINX_AXES, PYRAMINX_FACES, type PuzzleDefinition, type PuzzleId, type PuzzleRegistry, type PyraminxAxis, type PyraminxFace, type PyraminxFaceState, type PyraminxFacelet, type PyraminxImage, type PyraminxMove, type PyraminxMoveAmount, type PyraminxState, type PyraminxTipMove, type PyraminxTurnMove, SKEWB_AXES, SKEWB_FACES, ScramblePuzzleError, type SkewbAxis, type SkewbFace, type SkewbFaceState, type SkewbFacelet, type SkewbImage, type SkewbMove, type SkewbMoveAmount, type SkewbState, type SquareOneMove, type SquareOnePiece, type SquareOnePieces, type SquareOneSlashMove, type SquareOneState, type SquareOneSuccessor, type SquareOneTupleMove, type SquareOneTurn, UnregisteredPuzzleError, WCA_EVENT_IDS, WCA_EVENT_INFO, type WcaEventId, type WcaEventInfo, applyAlgorithm, applyClockMove, applyCubeMove, applyMegaminxMove, applyPyraminxMove, applySkewbMove, applySquareOneMove, areClockStatesEqual, areCubeStatesEqual, areMegaminxStatesEqual, arePyraminxStatesEqual, areSkewbStatesEqual, areSquareOneStatesEqual, canSquareOneSlash, createClockDefinition, createCubeDefinition, createMegaminxDefinition, createPuzzleRegistry, createPyraminxDefinition, createSkewbDefinition, createSolvedClockState, createSolvedCubeState, createSolvedMegaminxState, createSolvedPyraminxState, createSolvedSkewbState, createSolvedSquareOneState, createSquareOneDefinition, getSquareOneMoveCost, getSquareOneScrambleSuccessors, getSquareOneSlashabilityMoveCost, getSquareOneSuccessors, parseClockAlgorithm, parseClockMove, parseCubeAlgorithm, parseCubeMove, parseMegaminxAlgorithm, parseMegaminxMove, parsePyraminxAlgorithm, parsePyraminxMove, parseSkewbAlgorithm, parseSkewbMove, parseSquareOneAlgorithm, parseSquareOneMove, splitAlgorithm };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { WCA_EVENT_IDS, WCA_EVENT_INFO } from "./scramble-puzzle/src/events2.mjs";
|
|
2
|
+
import { InvalidMoveError, InvalidScrambleError, ScramblePuzzleError, UnregisteredPuzzleError } from "./scramble-puzzle/src/errors2.mjs";
|
|
3
|
+
import { applyAlgorithm, splitAlgorithm } from "./scramble-puzzle/src/algorithm2.mjs";
|
|
4
|
+
import { parseCubeAlgorithm, parseCubeMove } from "./scramble-puzzle/src/cube/cube-parser2.mjs";
|
|
5
|
+
import { applyCubeMove, areCubeStatesEqual, createSolvedCubeState } from "./scramble-puzzle/src/cube/cube-state2.mjs";
|
|
6
|
+
import { createCubeDefinition } from "./scramble-puzzle/src/cube/cube-definition2.mjs";
|
|
7
|
+
import { parseClockAlgorithm, parseClockMove } from "./scramble-puzzle/src/clock/clock-parser2.mjs";
|
|
8
|
+
import { applyClockMove, areClockStatesEqual, createSolvedClockState } from "./scramble-puzzle/src/clock/clock-state2.mjs";
|
|
9
|
+
import { createClockDefinition } from "./scramble-puzzle/src/clock/clock-definition2.mjs";
|
|
10
|
+
import { MEGAMINX_FACES, parseMegaminxAlgorithm, parseMegaminxMove } from "./scramble-puzzle/src/megaminx/megaminx-parser2.mjs";
|
|
11
|
+
import { applyMegaminxMove, areMegaminxStatesEqual, createSolvedMegaminxState } from "./scramble-puzzle/src/megaminx/megaminx-state2.mjs";
|
|
12
|
+
import { createMegaminxDefinition } from "./scramble-puzzle/src/megaminx/megaminx-definition2.mjs";
|
|
13
|
+
import { PYRAMINX_AXES, PYRAMINX_FACES, parsePyraminxAlgorithm, parsePyraminxMove } from "./scramble-puzzle/src/pyraminx/pyraminx-parser2.mjs";
|
|
14
|
+
import { applyPyraminxMove, arePyraminxStatesEqual, createSolvedPyraminxState } from "./scramble-puzzle/src/pyraminx/pyraminx-state2.mjs";
|
|
15
|
+
import { createPyraminxDefinition } from "./scramble-puzzle/src/pyraminx/pyraminx-definition2.mjs";
|
|
16
|
+
import { SKEWB_AXES, SKEWB_FACES, parseSkewbAlgorithm, parseSkewbMove } from "./scramble-puzzle/src/skewb/skewb-parser2.mjs";
|
|
17
|
+
import { applySkewbMove, areSkewbStatesEqual, createSolvedSkewbState } from "./scramble-puzzle/src/skewb/skewb-state2.mjs";
|
|
18
|
+
import { createSkewbDefinition } from "./scramble-puzzle/src/skewb/skewb-definition2.mjs";
|
|
19
|
+
import { getSquareOneMoveCost, getSquareOneSlashabilityMoveCost, parseSquareOneAlgorithm, parseSquareOneMove } from "./scramble-puzzle/src/square1/square1-parser2.mjs";
|
|
20
|
+
import { applySquareOneMove, areSquareOneStatesEqual, canSquareOneSlash, createSolvedSquareOneState, getSquareOneScrambleSuccessors, getSquareOneSuccessors } from "./scramble-puzzle/src/square1/square1-state2.mjs";
|
|
21
|
+
import { createSquareOneDefinition } from "./scramble-puzzle/src/square1/square1-definition2.mjs";
|
|
22
|
+
import { createPuzzleRegistry } from "./scramble-puzzle/src/registry.mjs";
|
|
23
|
+
export { InvalidMoveError, InvalidScrambleError, MEGAMINX_FACES, PYRAMINX_AXES, PYRAMINX_FACES, SKEWB_AXES, SKEWB_FACES, ScramblePuzzleError, UnregisteredPuzzleError, WCA_EVENT_IDS, WCA_EVENT_INFO, applyAlgorithm, applyClockMove, applyCubeMove, applyMegaminxMove, applyPyraminxMove, applySkewbMove, applySquareOneMove, areClockStatesEqual, areCubeStatesEqual, areMegaminxStatesEqual, arePyraminxStatesEqual, areSkewbStatesEqual, areSquareOneStatesEqual, canSquareOneSlash, createClockDefinition, createCubeDefinition, createMegaminxDefinition, createPuzzleRegistry, createPyraminxDefinition, createSkewbDefinition, createSolvedClockState, createSolvedCubeState, createSolvedMegaminxState, createSolvedPyraminxState, createSolvedSkewbState, createSolvedSquareOneState, createSquareOneDefinition, getSquareOneMoveCost, getSquareOneScrambleSuccessors, getSquareOneSlashabilityMoveCost, getSquareOneSuccessors, parseClockAlgorithm, parseClockMove, parseCubeAlgorithm, parseCubeMove, parseMegaminxAlgorithm, parseMegaminxMove, parsePyraminxAlgorithm, parsePyraminxMove, parseSkewbAlgorithm, parseSkewbMove, parseSquareOneAlgorithm, parseSquareOneMove, splitAlgorithm };
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cubegin",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Public Cubegin package entrypoints for scramble generation, parsing, and SVG rendering.",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"CHANGELOG.md",
|
|
9
|
+
"LICENSE",
|
|
10
|
+
"NOTICE",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./scramble-core": "./dist/scramble-core.mjs",
|
|
16
|
+
"./scramble-image": "./dist/scramble-image.mjs",
|
|
17
|
+
"./scramble-puzzle": "./dist/scramble-puzzle.mjs",
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "node scripts/build.mjs",
|
|
22
|
+
"dev": "node scripts/build.mjs --watch",
|
|
23
|
+
"release:prepare": "node scripts/release.mjs",
|
|
24
|
+
"test": "vp test",
|
|
25
|
+
"typecheck": "tsc --noEmit"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@cubegin/scramble-core": "workspace:*",
|
|
29
|
+
"@cubegin/scramble-image": "workspace:*",
|
|
30
|
+
"@cubegin/scramble-puzzle": "workspace:*",
|
|
31
|
+
"@types/node": "catalog:",
|
|
32
|
+
"typescript": "catalog:",
|
|
33
|
+
"vite": "catalog:",
|
|
34
|
+
"vite-plus": "catalog:",
|
|
35
|
+
"vitest": "catalog:"
|
|
36
|
+
}
|
|
37
|
+
}
|