@cubingcenter/scrambler 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +21 -0
  2. package/dist/core/api.d.ts.map +1 -1
  3. package/dist/core/api.js +6 -1
  4. package/dist/puzzles/skewb/facelets.d.ts.map +1 -1
  5. package/dist/puzzles/skewb/facelets.js +46 -23
  6. package/dist/puzzles/skewb/index.d.ts +2 -1
  7. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  8. package/dist/puzzles/skewb/index.js +2 -1
  9. package/dist/puzzles/skewb/random-state.d.ts +1 -1
  10. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  11. package/dist/puzzles/skewb/random-state.js +25 -18
  12. package/dist/puzzles/skewb/scrambler.d.ts.map +1 -1
  13. package/dist/puzzles/skewb/scrambler.js +10 -13
  14. package/dist/puzzles/skewb/solver/browser-loader.d.ts +20 -0
  15. package/dist/puzzles/skewb/solver/browser-loader.d.ts.map +1 -0
  16. package/dist/puzzles/skewb/solver/browser-loader.js +86 -0
  17. package/dist/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  18. package/dist/puzzles/skewb/solver/generated/helpers.bin +0 -0
  19. package/dist/puzzles/skewb/solver/generated/manifest.json +31 -0
  20. package/dist/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  21. package/dist/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  22. package/dist/puzzles/skewb/solver/generated/policy.bin +0 -0
  23. package/dist/puzzles/skewb/solver/generated-assets.d.ts +10 -0
  24. package/dist/puzzles/skewb/solver/generated-assets.d.ts.map +1 -0
  25. package/dist/puzzles/skewb/solver/generated-assets.js +24 -0
  26. package/dist/puzzles/skewb/solver/index.d.ts +5 -0
  27. package/dist/puzzles/skewb/solver/index.d.ts.map +1 -0
  28. package/dist/puzzles/skewb/solver/index.js +4 -0
  29. package/dist/puzzles/skewb/solver/node-loader.d.ts +10 -0
  30. package/dist/puzzles/skewb/solver/node-loader.d.ts.map +1 -0
  31. package/dist/puzzles/skewb/solver/node-loader.js +91 -0
  32. package/dist/puzzles/skewb/solver/search.d.ts +11 -0
  33. package/dist/puzzles/skewb/solver/search.d.ts.map +1 -0
  34. package/dist/puzzles/skewb/solver/search.js +80 -0
  35. package/dist/puzzles/skewb/solver/table-metadata.d.ts +27 -0
  36. package/dist/puzzles/skewb/solver/table-metadata.d.ts.map +1 -0
  37. package/dist/puzzles/skewb/solver/table-metadata.js +26 -0
  38. package/dist/puzzles/skewb/solver/tables.d.ts +68 -0
  39. package/dist/puzzles/skewb/solver/tables.d.ts.map +1 -0
  40. package/dist/puzzles/skewb/solver/tables.js +508 -0
  41. package/dist/random/prng.js +10 -1
  42. package/dist-cjs/core/api.js +6 -1
  43. package/dist-cjs/puzzles/skewb/facelets.js +46 -23
  44. package/dist-cjs/puzzles/skewb/index.js +49 -11
  45. package/dist-cjs/puzzles/skewb/random-state.js +25 -18
  46. package/dist-cjs/puzzles/skewb/scrambler.js +9 -12
  47. package/dist-cjs/puzzles/skewb/solver/browser-loader.js +91 -0
  48. package/dist-cjs/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  49. package/dist-cjs/puzzles/skewb/solver/generated/helpers.bin +0 -0
  50. package/dist-cjs/puzzles/skewb/solver/generated/manifest.json +31 -0
  51. package/dist-cjs/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  52. package/dist-cjs/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  53. package/dist-cjs/puzzles/skewb/solver/generated/policy.bin +0 -0
  54. package/dist-cjs/puzzles/skewb/solver/generated-assets.js +60 -0
  55. package/dist-cjs/puzzles/skewb/solver/index.js +23 -0
  56. package/dist-cjs/puzzles/skewb/solver/node-loader.js +97 -0
  57. package/dist-cjs/puzzles/skewb/solver/search.js +87 -0
  58. package/dist-cjs/puzzles/skewb/solver/table-metadata.js +29 -0
  59. package/dist-cjs/puzzles/skewb/solver/tables.js +539 -0
  60. package/dist-cjs/random/prng.js +10 -1
  61. package/package.json +6 -3
  62. package/dist/puzzles/skewb/solver.d.ts +0 -11
  63. package/dist/puzzles/skewb/solver.d.ts.map +0 -1
  64. package/dist/puzzles/skewb/solver.js +0 -149
  65. package/dist-cjs/puzzles/skewb/solver.js +0 -160
@@ -1,149 +0,0 @@
1
- import { applySkewbMove } from "./moves.js";
2
- import { createSolvedSkewbState } from "./state.js";
3
- const FACT = [1, 1, 2, 6, 24, 120, 720, 5040, 40320];
4
- export function getPermutationIndex(perm) {
5
- // perm length 8, but pos0 is always 0 for WCA reachable states.
6
- // We encode full 8-perm via Lehmer code (0..40319), but for fixed corner it will be in subset.
7
- let index = 0;
8
- const n = perm.length;
9
- for (let i = 0; i < n; i++) {
10
- let count = 0;
11
- for (let j = i + 1; j < n; j++)
12
- if (perm[j] < perm[i])
13
- count++;
14
- index += count * FACT[n - 1 - i];
15
- }
16
- return index;
17
- }
18
- export function getPermutationFromIndex(index, n) {
19
- const perm = Array(n).fill(0);
20
- const temp = Array.from({ length: n }, (_, i) => i);
21
- let val = index;
22
- for (let i = 0; i < n; i++) {
23
- const f = FACT[n - 1 - i];
24
- const choice = Math.floor(val / f);
25
- val %= f;
26
- perm[i] = temp[choice];
27
- temp.splice(choice, 1);
28
- }
29
- return perm;
30
- }
31
- export function getOrientationIndex(orient) {
32
- // orient length 8, index 0 is fixed 0, encode remaining 7 base3
33
- let index = 0;
34
- for (let i = 7; i >= 1; i--) {
35
- index = index * 3 + orient[i];
36
- }
37
- return index;
38
- }
39
- export function getOrientationFromIndex(index) {
40
- const orient = Array(8).fill(0);
41
- orient[0] = 0;
42
- let val = index;
43
- for (let i = 1; i < 8; i++) {
44
- orient[i] = val % 3;
45
- val = Math.floor(val / 3);
46
- }
47
- return orient;
48
- }
49
- export function getCenterIndex(centers) {
50
- let index = 0;
51
- const n = centers.length;
52
- for (let i = 0; i < n; i++) {
53
- let count = 0;
54
- for (let j = i + 1; j < n; j++)
55
- if (centers[j] < centers[i])
56
- count++;
57
- index += count * FACT[n - 1 - i];
58
- }
59
- return index;
60
- }
61
- export function getCenterFromIndex(index) {
62
- return getPermutationFromIndex(index, 6);
63
- }
64
- export function getStateIndex(state) {
65
- const p = getPermutationIndex(state.corners.permutation);
66
- const c = getCenterIndex(state.centers);
67
- const o = getOrientationIndex(state.corners.orientation);
68
- // p in 0..40319, c in 0..719, o in 0..2186
69
- // Combine: ((p * 720 + c) * 2187 + o) -> up to 63B fits in JS number (53-bit)
70
- return ((p * 720 + c) * 2187 + o);
71
- }
72
- export function getStateFromIndex(index) {
73
- const o = index % 2187;
74
- let val = Math.floor(index / 2187);
75
- const c = val % 720;
76
- const p = Math.floor(val / 720);
77
- return {
78
- corners: {
79
- permutation: getPermutationFromIndex(p, 8),
80
- orientation: getOrientationFromIndex(o),
81
- },
82
- centers: getCenterFromIndex(c),
83
- };
84
- }
85
- const MOVES = ["R", "R'", "U", "U'", "L", "L'", "B", "B'"];
86
- export function solveSkewb(state) {
87
- const startIdx = getStateIndex(state);
88
- const solvedIdx = getStateIndex(createSolvedSkewbState());
89
- if (startIdx === solvedIdx)
90
- return [];
91
- const forwardMap = new Map();
92
- const backwardMap = new Map();
93
- const forwardQueue = [startIdx];
94
- const backwardQueue = [solvedIdx];
95
- forwardMap.set(startIdx, { move: "", parent: -1 });
96
- backwardMap.set(solvedIdx, { move: "", parent: -1 });
97
- while (forwardQueue.length > 0 && backwardQueue.length > 0) {
98
- const fSize = forwardQueue.length;
99
- for (let i = 0; i < Math.min(fSize, 1000); i++) {
100
- const currIdx = forwardQueue.shift();
101
- const currState = getStateFromIndex(currIdx);
102
- for (const move of MOVES) {
103
- const nextState = applySkewbMove(currState, move);
104
- const nextIdx = getStateIndex(nextState);
105
- if (!forwardMap.has(nextIdx)) {
106
- forwardMap.set(nextIdx, { move, parent: currIdx });
107
- if (backwardMap.has(nextIdx))
108
- return reconstructPath(nextIdx, forwardMap, backwardMap);
109
- forwardQueue.push(nextIdx);
110
- }
111
- }
112
- }
113
- const bSize = backwardQueue.length;
114
- for (let i = 0; i < Math.min(bSize, 1000); i++) {
115
- const currIdx = backwardQueue.shift();
116
- const currState = getStateFromIndex(currIdx);
117
- for (const move of MOVES) {
118
- const nextState = applySkewbMove(currState, move);
119
- const nextIdx = getStateIndex(nextState);
120
- if (!backwardMap.has(nextIdx)) {
121
- const invMove = move.endsWith("'") ? move.slice(0, -1) : `${move}'`;
122
- backwardMap.set(nextIdx, { move: invMove, parent: currIdx });
123
- if (forwardMap.has(nextIdx))
124
- return reconstructPath(nextIdx, forwardMap, backwardMap);
125
- backwardQueue.push(nextIdx);
126
- }
127
- }
128
- }
129
- }
130
- throw new Error("Skewb state is unsolvable");
131
- }
132
- function reconstructPath(meetingIdx, forwardMap, backwardMap) {
133
- const path = [];
134
- let curr = meetingIdx;
135
- while (curr !== -1) {
136
- const edge = forwardMap.get(curr);
137
- if (edge.parent !== -1)
138
- path.unshift(edge.move);
139
- curr = edge.parent;
140
- }
141
- curr = meetingIdx;
142
- while (curr !== -1) {
143
- const edge = backwardMap.get(curr);
144
- if (edge.parent !== -1)
145
- path.push(edge.move);
146
- curr = edge.parent;
147
- }
148
- return path;
149
- }
@@ -1,160 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPermutationIndex = getPermutationIndex;
4
- exports.getPermutationFromIndex = getPermutationFromIndex;
5
- exports.getOrientationIndex = getOrientationIndex;
6
- exports.getOrientationFromIndex = getOrientationFromIndex;
7
- exports.getCenterIndex = getCenterIndex;
8
- exports.getCenterFromIndex = getCenterFromIndex;
9
- exports.getStateIndex = getStateIndex;
10
- exports.getStateFromIndex = getStateFromIndex;
11
- exports.solveSkewb = solveSkewb;
12
- const moves_js_1 = require("./moves.js");
13
- const state_js_1 = require("./state.js");
14
- const FACT = [1, 1, 2, 6, 24, 120, 720, 5040, 40320];
15
- function getPermutationIndex(perm) {
16
- // perm length 8, but pos0 is always 0 for WCA reachable states.
17
- // We encode full 8-perm via Lehmer code (0..40319), but for fixed corner it will be in subset.
18
- let index = 0;
19
- const n = perm.length;
20
- for (let i = 0; i < n; i++) {
21
- let count = 0;
22
- for (let j = i + 1; j < n; j++)
23
- if (perm[j] < perm[i])
24
- count++;
25
- index += count * FACT[n - 1 - i];
26
- }
27
- return index;
28
- }
29
- function getPermutationFromIndex(index, n) {
30
- const perm = Array(n).fill(0);
31
- const temp = Array.from({ length: n }, (_, i) => i);
32
- let val = index;
33
- for (let i = 0; i < n; i++) {
34
- const f = FACT[n - 1 - i];
35
- const choice = Math.floor(val / f);
36
- val %= f;
37
- perm[i] = temp[choice];
38
- temp.splice(choice, 1);
39
- }
40
- return perm;
41
- }
42
- function getOrientationIndex(orient) {
43
- // orient length 8, index 0 is fixed 0, encode remaining 7 base3
44
- let index = 0;
45
- for (let i = 7; i >= 1; i--) {
46
- index = index * 3 + orient[i];
47
- }
48
- return index;
49
- }
50
- function getOrientationFromIndex(index) {
51
- const orient = Array(8).fill(0);
52
- orient[0] = 0;
53
- let val = index;
54
- for (let i = 1; i < 8; i++) {
55
- orient[i] = val % 3;
56
- val = Math.floor(val / 3);
57
- }
58
- return orient;
59
- }
60
- function getCenterIndex(centers) {
61
- let index = 0;
62
- const n = centers.length;
63
- for (let i = 0; i < n; i++) {
64
- let count = 0;
65
- for (let j = i + 1; j < n; j++)
66
- if (centers[j] < centers[i])
67
- count++;
68
- index += count * FACT[n - 1 - i];
69
- }
70
- return index;
71
- }
72
- function getCenterFromIndex(index) {
73
- return getPermutationFromIndex(index, 6);
74
- }
75
- function getStateIndex(state) {
76
- const p = getPermutationIndex(state.corners.permutation);
77
- const c = getCenterIndex(state.centers);
78
- const o = getOrientationIndex(state.corners.orientation);
79
- // p in 0..40319, c in 0..719, o in 0..2186
80
- // Combine: ((p * 720 + c) * 2187 + o) -> up to 63B fits in JS number (53-bit)
81
- return ((p * 720 + c) * 2187 + o);
82
- }
83
- function getStateFromIndex(index) {
84
- const o = index % 2187;
85
- let val = Math.floor(index / 2187);
86
- const c = val % 720;
87
- const p = Math.floor(val / 720);
88
- return {
89
- corners: {
90
- permutation: getPermutationFromIndex(p, 8),
91
- orientation: getOrientationFromIndex(o),
92
- },
93
- centers: getCenterFromIndex(c),
94
- };
95
- }
96
- const MOVES = ["R", "R'", "U", "U'", "L", "L'", "B", "B'"];
97
- function solveSkewb(state) {
98
- const startIdx = getStateIndex(state);
99
- const solvedIdx = getStateIndex((0, state_js_1.createSolvedSkewbState)());
100
- if (startIdx === solvedIdx)
101
- return [];
102
- const forwardMap = new Map();
103
- const backwardMap = new Map();
104
- const forwardQueue = [startIdx];
105
- const backwardQueue = [solvedIdx];
106
- forwardMap.set(startIdx, { move: "", parent: -1 });
107
- backwardMap.set(solvedIdx, { move: "", parent: -1 });
108
- while (forwardQueue.length > 0 && backwardQueue.length > 0) {
109
- const fSize = forwardQueue.length;
110
- for (let i = 0; i < Math.min(fSize, 1000); i++) {
111
- const currIdx = forwardQueue.shift();
112
- const currState = getStateFromIndex(currIdx);
113
- for (const move of MOVES) {
114
- const nextState = (0, moves_js_1.applySkewbMove)(currState, move);
115
- const nextIdx = getStateIndex(nextState);
116
- if (!forwardMap.has(nextIdx)) {
117
- forwardMap.set(nextIdx, { move, parent: currIdx });
118
- if (backwardMap.has(nextIdx))
119
- return reconstructPath(nextIdx, forwardMap, backwardMap);
120
- forwardQueue.push(nextIdx);
121
- }
122
- }
123
- }
124
- const bSize = backwardQueue.length;
125
- for (let i = 0; i < Math.min(bSize, 1000); i++) {
126
- const currIdx = backwardQueue.shift();
127
- const currState = getStateFromIndex(currIdx);
128
- for (const move of MOVES) {
129
- const nextState = (0, moves_js_1.applySkewbMove)(currState, move);
130
- const nextIdx = getStateIndex(nextState);
131
- if (!backwardMap.has(nextIdx)) {
132
- const invMove = move.endsWith("'") ? move.slice(0, -1) : `${move}'`;
133
- backwardMap.set(nextIdx, { move: invMove, parent: currIdx });
134
- if (forwardMap.has(nextIdx))
135
- return reconstructPath(nextIdx, forwardMap, backwardMap);
136
- backwardQueue.push(nextIdx);
137
- }
138
- }
139
- }
140
- }
141
- throw new Error("Skewb state is unsolvable");
142
- }
143
- function reconstructPath(meetingIdx, forwardMap, backwardMap) {
144
- const path = [];
145
- let curr = meetingIdx;
146
- while (curr !== -1) {
147
- const edge = forwardMap.get(curr);
148
- if (edge.parent !== -1)
149
- path.unshift(edge.move);
150
- curr = edge.parent;
151
- }
152
- curr = meetingIdx;
153
- while (curr !== -1) {
154
- const edge = backwardMap.get(curr);
155
- if (edge.parent !== -1)
156
- path.push(edge.move);
157
- curr = edge.parent;
158
- }
159
- return path;
160
- }