@cubingcenter/scrambler 0.4.0 → 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 (174) hide show
  1. package/README.md +67 -3
  2. package/dist/core/api.d.ts.map +1 -1
  3. package/dist/core/api.js +18 -6
  4. package/dist/core/index.d.ts +1 -1
  5. package/dist/core/index.d.ts.map +1 -1
  6. package/dist/core/types.d.ts +7 -0
  7. package/dist/core/types.d.ts.map +1 -1
  8. package/dist/puzzles/clock/index.d.ts +1 -0
  9. package/dist/puzzles/clock/index.d.ts.map +1 -1
  10. package/dist/puzzles/clock/index.js +4 -0
  11. package/dist/puzzles/cube2/index.d.ts +1 -0
  12. package/dist/puzzles/cube2/index.d.ts.map +1 -1
  13. package/dist/puzzles/cube2/index.js +4 -0
  14. package/dist/puzzles/cube2/scrambler.d.ts.map +1 -1
  15. package/dist/puzzles/cube2/scrambler.js +4 -6
  16. package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -1
  17. package/dist/puzzles/cube2/solver/browser-loader.js +4 -12
  18. package/dist/puzzles/cube2/solver/index.d.ts +1 -1
  19. package/dist/puzzles/cube2/solver/index.d.ts.map +1 -1
  20. package/dist/puzzles/cube2/solver/index.js +1 -1
  21. package/dist/puzzles/cube2/solver/search.d.ts +2 -0
  22. package/dist/puzzles/cube2/solver/search.d.ts.map +1 -1
  23. package/dist/puzzles/cube2/solver/search.js +26 -0
  24. package/dist/puzzles/cube2/validation.d.ts.map +1 -1
  25. package/dist/puzzles/cube2/validation.js +15 -3
  26. package/dist/puzzles/cube3/index.d.ts +1 -0
  27. package/dist/puzzles/cube3/index.d.ts.map +1 -1
  28. package/dist/puzzles/cube3/index.js +4 -0
  29. package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -1
  30. package/dist/puzzles/cube3/solver/browser-loader.js +5 -29
  31. package/dist/puzzles/cube4/index.d.ts +1 -0
  32. package/dist/puzzles/cube4/index.d.ts.map +1 -1
  33. package/dist/puzzles/cube4/index.js +4 -0
  34. package/dist/puzzles/cube5x5/index.d.ts +1 -0
  35. package/dist/puzzles/cube5x5/index.d.ts.map +1 -1
  36. package/dist/puzzles/cube5x5/index.js +4 -0
  37. package/dist/puzzles/cube6x6/index.d.ts +1 -0
  38. package/dist/puzzles/cube6x6/index.d.ts.map +1 -1
  39. package/dist/puzzles/cube6x6/index.js +4 -0
  40. package/dist/puzzles/cube7x7/index.d.ts +1 -0
  41. package/dist/puzzles/cube7x7/index.d.ts.map +1 -1
  42. package/dist/puzzles/cube7x7/index.js +4 -0
  43. package/dist/puzzles/megaminx/index.d.ts +1 -0
  44. package/dist/puzzles/megaminx/index.d.ts.map +1 -1
  45. package/dist/puzzles/megaminx/index.js +4 -0
  46. package/dist/puzzles/pyraminx/index.d.ts +3 -1
  47. package/dist/puzzles/pyraminx/index.d.ts.map +1 -1
  48. package/dist/puzzles/pyraminx/index.js +6 -1
  49. package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -1
  50. package/dist/puzzles/pyraminx/scrambler.js +24 -20
  51. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts +14 -0
  52. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts.map +1 -0
  53. package/dist/puzzles/pyraminx/solver/browser-loader.js +63 -0
  54. package/dist/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  55. package/dist/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  56. package/dist/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  57. package/dist/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  58. package/dist/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  59. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts +7 -0
  60. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts.map +1 -0
  61. package/dist/puzzles/pyraminx/solver/generated-assets.js +24 -0
  62. package/dist/puzzles/pyraminx/solver/index.d.ts +5 -0
  63. package/dist/puzzles/pyraminx/solver/index.d.ts.map +1 -0
  64. package/dist/puzzles/pyraminx/solver/index.js +4 -0
  65. package/dist/puzzles/pyraminx/solver/node-loader.d.ts +7 -0
  66. package/dist/puzzles/pyraminx/solver/node-loader.d.ts.map +1 -0
  67. package/dist/puzzles/pyraminx/solver/node-loader.js +73 -0
  68. package/dist/puzzles/pyraminx/solver/search.d.ts +10 -0
  69. package/dist/puzzles/pyraminx/solver/search.d.ts.map +1 -0
  70. package/dist/puzzles/pyraminx/solver/search.js +82 -0
  71. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts +20 -0
  72. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts.map +1 -0
  73. package/dist/puzzles/pyraminx/solver/table-metadata.js +19 -0
  74. package/dist/puzzles/pyraminx/solver/tables.d.ts +43 -0
  75. package/dist/puzzles/pyraminx/solver/tables.d.ts.map +1 -0
  76. package/dist/puzzles/pyraminx/solver/tables.js +300 -0
  77. package/dist/puzzles/shared/compressed-fetch.d.ts +12 -0
  78. package/dist/puzzles/shared/compressed-fetch.d.ts.map +1 -0
  79. package/dist/puzzles/shared/compressed-fetch.js +68 -0
  80. package/dist/puzzles/skewb/facelets.d.ts.map +1 -1
  81. package/dist/puzzles/skewb/facelets.js +46 -23
  82. package/dist/puzzles/skewb/index.d.ts +3 -1
  83. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  84. package/dist/puzzles/skewb/index.js +6 -1
  85. package/dist/puzzles/skewb/random-state.d.ts +1 -1
  86. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  87. package/dist/puzzles/skewb/random-state.js +25 -18
  88. package/dist/puzzles/skewb/scrambler.d.ts.map +1 -1
  89. package/dist/puzzles/skewb/scrambler.js +10 -13
  90. package/dist/puzzles/skewb/solver/browser-loader.d.ts +20 -0
  91. package/dist/puzzles/skewb/solver/browser-loader.d.ts.map +1 -0
  92. package/dist/puzzles/skewb/solver/browser-loader.js +86 -0
  93. package/dist/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  94. package/dist/puzzles/skewb/solver/generated/helpers.bin +0 -0
  95. package/dist/puzzles/skewb/solver/generated/manifest.json +31 -0
  96. package/dist/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  97. package/dist/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  98. package/dist/puzzles/skewb/solver/generated/policy.bin +0 -0
  99. package/dist/puzzles/skewb/solver/generated-assets.d.ts +10 -0
  100. package/dist/puzzles/skewb/solver/generated-assets.d.ts.map +1 -0
  101. package/dist/puzzles/skewb/solver/generated-assets.js +24 -0
  102. package/dist/puzzles/skewb/solver/index.d.ts +5 -0
  103. package/dist/puzzles/skewb/solver/index.d.ts.map +1 -0
  104. package/dist/puzzles/skewb/solver/index.js +4 -0
  105. package/dist/puzzles/skewb/solver/node-loader.d.ts +10 -0
  106. package/dist/puzzles/skewb/solver/node-loader.d.ts.map +1 -0
  107. package/dist/puzzles/skewb/solver/node-loader.js +91 -0
  108. package/dist/puzzles/skewb/solver/search.d.ts +11 -0
  109. package/dist/puzzles/skewb/solver/search.d.ts.map +1 -0
  110. package/dist/puzzles/skewb/solver/search.js +80 -0
  111. package/dist/puzzles/skewb/solver/table-metadata.d.ts +27 -0
  112. package/dist/puzzles/skewb/solver/table-metadata.d.ts.map +1 -0
  113. package/dist/puzzles/skewb/solver/table-metadata.js +26 -0
  114. package/dist/puzzles/skewb/solver/tables.d.ts +68 -0
  115. package/dist/puzzles/skewb/solver/tables.d.ts.map +1 -0
  116. package/dist/puzzles/skewb/solver/tables.js +508 -0
  117. package/dist/random/prng.js +10 -1
  118. package/dist-cjs/core/api.js +51 -6
  119. package/dist-cjs/puzzles/clock/index.js +13 -4
  120. package/dist-cjs/puzzles/cube2/index.js +13 -4
  121. package/dist-cjs/puzzles/cube2/scrambler.js +2 -4
  122. package/dist-cjs/puzzles/cube2/solver/browser-loader.js +4 -12
  123. package/dist-cjs/puzzles/cube2/solver/index.js +3 -1
  124. package/dist-cjs/puzzles/cube2/solver/search.js +28 -0
  125. package/dist-cjs/puzzles/cube2/validation.js +14 -2
  126. package/dist-cjs/puzzles/cube3/index.js +13 -4
  127. package/dist-cjs/puzzles/cube3/solver/browser-loader.js +5 -29
  128. package/dist-cjs/puzzles/cube4/index.js +13 -4
  129. package/dist-cjs/puzzles/cube5x5/index.js +13 -4
  130. package/dist-cjs/puzzles/cube6x6/index.js +13 -4
  131. package/dist-cjs/puzzles/cube7x7/index.js +13 -4
  132. package/dist-cjs/puzzles/megaminx/index.js +13 -4
  133. package/dist-cjs/puzzles/pyraminx/index.js +50 -6
  134. package/dist-cjs/puzzles/pyraminx/scrambler.js +23 -19
  135. package/dist-cjs/puzzles/pyraminx/solver/browser-loader.js +68 -0
  136. package/dist-cjs/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  137. package/dist-cjs/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  138. package/dist-cjs/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  139. package/dist-cjs/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  140. package/dist-cjs/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  141. package/dist-cjs/puzzles/pyraminx/solver/generated-assets.js +60 -0
  142. package/dist-cjs/puzzles/pyraminx/solver/index.js +23 -0
  143. package/dist-cjs/puzzles/pyraminx/solver/node-loader.js +79 -0
  144. package/dist-cjs/puzzles/pyraminx/solver/search.js +88 -0
  145. package/dist-cjs/puzzles/pyraminx/solver/table-metadata.js +22 -0
  146. package/dist-cjs/puzzles/pyraminx/solver/tables.js +327 -0
  147. package/dist-cjs/puzzles/shared/compressed-fetch.js +71 -0
  148. package/dist-cjs/puzzles/skewb/facelets.js +46 -23
  149. package/dist-cjs/puzzles/skewb/index.js +55 -8
  150. package/dist-cjs/puzzles/skewb/random-state.js +25 -18
  151. package/dist-cjs/puzzles/skewb/scrambler.js +9 -12
  152. package/dist-cjs/puzzles/skewb/solver/browser-loader.js +91 -0
  153. package/dist-cjs/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  154. package/dist-cjs/puzzles/skewb/solver/generated/helpers.bin +0 -0
  155. package/dist-cjs/puzzles/skewb/solver/generated/manifest.json +31 -0
  156. package/dist-cjs/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  157. package/dist-cjs/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  158. package/dist-cjs/puzzles/skewb/solver/generated/policy.bin +0 -0
  159. package/dist-cjs/puzzles/skewb/solver/generated-assets.js +60 -0
  160. package/dist-cjs/puzzles/skewb/solver/index.js +23 -0
  161. package/dist-cjs/puzzles/skewb/solver/node-loader.js +97 -0
  162. package/dist-cjs/puzzles/skewb/solver/search.js +87 -0
  163. package/dist-cjs/puzzles/skewb/solver/table-metadata.js +29 -0
  164. package/dist-cjs/puzzles/skewb/solver/tables.js +539 -0
  165. package/dist-cjs/random/prng.js +10 -1
  166. package/package.json +20 -6
  167. package/dist/puzzles/pyraminx/solver.d.ts +0 -10
  168. package/dist/puzzles/pyraminx/solver.d.ts.map +0 -1
  169. package/dist/puzzles/pyraminx/solver.js +0 -160
  170. package/dist/puzzles/skewb/solver.d.ts +0 -11
  171. package/dist/puzzles/skewb/solver.d.ts.map +0 -1
  172. package/dist/puzzles/skewb/solver.js +0 -149
  173. package/dist-cjs/puzzles/pyraminx/solver.js +0 -170
  174. package/dist-cjs/puzzles/skewb/solver.js +0 -160
@@ -0,0 +1,20 @@
1
+ export declare function getCachedBrowserTables(): {
2
+ permutationTable: Uint16Array;
3
+ orientationTable: Uint16Array;
4
+ centersTable: Uint16Array;
5
+ policyTable: Uint8Array;
6
+ evenCenterRank: Uint16Array;
7
+ orientClass: Uint8Array;
8
+ r7Sets: Uint16Array;
9
+ } | undefined;
10
+ export declare function clearCachedBrowserTables(): void;
11
+ export declare function loadBrowserTables(baseUrl?: string): Promise<{
12
+ permutationTable: Uint16Array;
13
+ orientationTable: Uint16Array;
14
+ centersTable: Uint16Array;
15
+ policyTable: Uint8Array;
16
+ evenCenterRank: Uint16Array;
17
+ orientClass: Uint8Array;
18
+ r7Sets: Uint16Array;
19
+ }>;
20
+ //# sourceMappingURL=browser-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/browser-loader.ts"],"names":[],"mappings":"AAeA,wBAAgB,sBAAsB;sBATlB,WAAW;sBACX,WAAW;kBACf,WAAW;iBACZ,UAAU;oBACP,WAAW;iBACd,UAAU;YACf,WAAW;cAKpB;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC,CAwCD"}
@@ -0,0 +1,86 @@
1
+ import { SKEWB_SOLVER_TABLE_METADATA } from "./table-metadata.js";
2
+ import { fetchTableBuffer } from "../../shared/compressed-fetch.js";
3
+ const TABLES_DIR = "puzzles/skewb/solver/generated";
4
+ let cachedBrowserTables;
5
+ export function getCachedBrowserTables() {
6
+ return cachedBrowserTables;
7
+ }
8
+ export function clearCachedBrowserTables() {
9
+ cachedBrowserTables = undefined;
10
+ }
11
+ export async function loadBrowserTables(baseUrl) {
12
+ if (cachedBrowserTables) {
13
+ return cachedBrowserTables;
14
+ }
15
+ const resolved = resolveBaseUrl(baseUrl);
16
+ const manifest = await fetchManifest(resolved);
17
+ const [permTable, orientTable, centersTable, helpers, policy] = await Promise.all([
18
+ fetchUint16Table(resolved, manifest.files.permutationTable, SKEWB_SOLVER_TABLE_METADATA.permutationTable.entries),
19
+ fetchUint16Table(resolved, manifest.files.orientationTable, SKEWB_SOLVER_TABLE_METADATA.orientationTable.entries),
20
+ fetchUint16Table(resolved, manifest.files.centersTable, SKEWB_SOLVER_TABLE_METADATA.centersTable.entries),
21
+ fetchUint8Table(resolved, manifest.files.helpers, SKEWB_SOLVER_TABLE_METADATA.helpers.entries),
22
+ fetchUint8Table(resolved, manifest.files.policyTable, SKEWB_SOLVER_TABLE_METADATA.policyTable.entries)
23
+ ]);
24
+ const helpersOffset = SKEWB_SOLVER_TABLE_METADATA.helpers;
25
+ const evenCenterRank = new Uint16Array(helpersOffset.evenCenterRankBytes / 2);
26
+ const rankView = new DataView(helpers.buffer, helpers.byteOffset);
27
+ for (let i = 0; i < evenCenterRank.length; i++) {
28
+ evenCenterRank[i] = rankView.getUint16(i * 2, true);
29
+ }
30
+ const orientClass = helpers.subarray(helpersOffset.evenCenterRankBytes, helpersOffset.evenCenterRankBytes + helpersOffset.orientClassBytes);
31
+ const r7Sets = new Uint16Array(helpersOffset.r7SetsEntries);
32
+ const view = new DataView(helpers.buffer, helpers.byteOffset + helpersOffset.evenCenterRankBytes + helpersOffset.orientClassBytes);
33
+ for (let i = 0; i < r7Sets.length; i++) {
34
+ r7Sets[i] = view.getUint16(i * 2, true);
35
+ }
36
+ cachedBrowserTables = {
37
+ permutationTable: permTable,
38
+ orientationTable: orientTable,
39
+ centersTable,
40
+ policyTable: policy,
41
+ evenCenterRank,
42
+ orientClass,
43
+ r7Sets
44
+ };
45
+ return cachedBrowserTables;
46
+ }
47
+ function resolveBaseUrl(provided) {
48
+ if (provided) {
49
+ return provided.replace(/\/$/, "");
50
+ }
51
+ if (typeof document !== "undefined") {
52
+ const script = document.currentScript;
53
+ if (script?.src) {
54
+ const base = new URL(".", script.src).href;
55
+ return base.replace(/\/$/, "");
56
+ }
57
+ }
58
+ return ".";
59
+ }
60
+ async function fetchManifest(baseUrl) {
61
+ const url = `${baseUrl}/puzzles/skewb/solver/generated/manifest.json`;
62
+ const response = await fetch(url);
63
+ if (!response.ok) {
64
+ throw new Error(`Failed to load skewb solver table manifest from ${url}: ${response.status} ${response.statusText}`);
65
+ }
66
+ return await response.json();
67
+ }
68
+ async function fetchUint16Table(baseUrl, entry, expectedEntries) {
69
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
70
+ if (buffer.byteLength !== expectedEntries * 2) {
71
+ throw new Error(`Invalid byte size for ${entry.file}`);
72
+ }
73
+ const values = new Uint16Array(expectedEntries);
74
+ const view = new DataView(buffer);
75
+ for (let i = 0; i < values.length; i++) {
76
+ values[i] = view.getUint16(i * 2, true);
77
+ }
78
+ return values;
79
+ }
80
+ async function fetchUint8Table(baseUrl, entry, expectedEntries) {
81
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
82
+ if (buffer.byteLength !== expectedEntries) {
83
+ throw new Error(`Invalid byte size for ${entry.file}`);
84
+ }
85
+ return new Uint8Array(buffer);
86
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "version": 1,
3
+ "files": {
4
+ "permutationTable": {
5
+ "file": "permutation-table.bin",
6
+ "entries": 40320,
7
+ "checksum": 3073532981
8
+ },
9
+ "orientationTable": {
10
+ "file": "orientation-table.bin",
11
+ "entries": 17496,
12
+ "checksum": 2128852053
13
+ },
14
+ "centersTable": {
15
+ "file": "centers-table.bin",
16
+ "entries": 5760,
17
+ "checksum": 360885765
18
+ },
19
+ "helpers": {
20
+ "file": "helpers.bin",
21
+ "entries": 29547,
22
+ "checksum": 4284555735
23
+ },
24
+ "policyTable": {
25
+ "file": "policy.bin",
26
+ "entries": 1180980,
27
+ "checksum": 1294485891,
28
+ "maxDepth": 11
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,10 @@
1
+ export declare function loadGeneratedSkewbSolverTables(): Promise<{
2
+ permutationTable: Uint16Array;
3
+ orientationTable: Uint16Array;
4
+ centersTable: Uint16Array;
5
+ policyTable: Uint8Array;
6
+ evenCenterRank: Uint16Array;
7
+ orientClass: Uint8Array;
8
+ r7Sets: Uint16Array;
9
+ }>;
10
+ //# sourceMappingURL=generated-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-assets.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/generated-assets.ts"],"names":[],"mappings":"AAgBA,wBAAsB,8BAA8B,IAAI,OAAO,CAAC;IAC9D,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC,CAYD"}
@@ -0,0 +1,24 @@
1
+ import { getCachedBrowserTables } from "./browser-loader.js";
2
+ let cachedTables;
3
+ function isBrowser() {
4
+ return typeof self !== "undefined";
5
+ }
6
+ export async function loadGeneratedSkewbSolverTables() {
7
+ if (isBrowser()) {
8
+ const browserTables = getCachedBrowserTables();
9
+ if (browserTables)
10
+ return browserTables;
11
+ throw new Error("Skewb solver tables are not loaded. " +
12
+ "In browser environments, call `initializeScrambler(baseUrl)` " +
13
+ "before generating scrambles.");
14
+ }
15
+ cachedTables ??= await loadNodeTables();
16
+ return cachedTables;
17
+ }
18
+ async function loadNodeTables() {
19
+ const loader = await import(
20
+ /* webpackIgnore: true */
21
+ /* @vite-ignore */
22
+ "./node-loader.js");
23
+ return loader.readGeneratedSkewbSolverTables();
24
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./tables.js";
2
+ export * from "./search.js";
3
+ export { SKEWB_SOLVER_TABLE_METADATA } from "./table-metadata.js";
4
+ export { loadGeneratedSkewbSolverTables } from "./generated-assets.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./tables.js";
2
+ export * from "./search.js";
3
+ export { SKEWB_SOLVER_TABLE_METADATA } from "./table-metadata.js";
4
+ export { loadGeneratedSkewbSolverTables } from "./generated-assets.js";
@@ -0,0 +1,10 @@
1
+ export declare function readGeneratedSkewbSolverTables(): {
2
+ permutationTable: Uint16Array;
3
+ orientationTable: Uint16Array;
4
+ centersTable: Uint16Array;
5
+ policyTable: Uint8Array;
6
+ evenCenterRank: Uint16Array;
7
+ orientClass: Uint8Array;
8
+ r7Sets: Uint16Array;
9
+ };
10
+ //# sourceMappingURL=node-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/node-loader.ts"],"names":[],"mappings":"AAkBA,wBAAgB,8BAA8B,IAAI;IAChD,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB,CA6DA"}
@@ -0,0 +1,91 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { SKEWB_SOLVER_TABLE_METADATA } from "./table-metadata.js";
5
+ const GENERATED_DIRECTORY = "puzzles/skewb/solver/generated";
6
+ export function readGeneratedSkewbSolverTables() {
7
+ const assetDirectory = resolveGeneratedAssetDirectory();
8
+ const manifest = JSON.parse(readFileSync(path.join(assetDirectory, "manifest.json"), "utf8"));
9
+ if (manifest.version !== 1) {
10
+ throw new Error(`Unsupported skewb solver table manifest version: ${manifest.version}`);
11
+ }
12
+ const permutationTable = readUint16Table(assetDirectory, manifest.files.permutationTable, SKEWB_SOLVER_TABLE_METADATA.permutationTable.checksum);
13
+ const orientationTable = readUint16Table(assetDirectory, manifest.files.orientationTable, SKEWB_SOLVER_TABLE_METADATA.orientationTable.checksum);
14
+ const centersTable = readUint16Table(assetDirectory, manifest.files.centersTable, SKEWB_SOLVER_TABLE_METADATA.centersTable.checksum);
15
+ const helpersBuffer = readFileSync(path.join(assetDirectory, manifest.files.helpers.file));
16
+ if (helpersBuffer.length !== manifest.files.helpers.entries) {
17
+ throw new Error(`Invalid byte size for ${manifest.files.helpers.file}`);
18
+ }
19
+ assertChecksum(manifest.files.helpers.file, checksum(new Uint8Array(helpersBuffer)), SKEWB_SOLVER_TABLE_METADATA.helpers.checksum);
20
+ const evenCenterRank = new Uint16Array(SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes / 2);
21
+ for (let i = 0; i < evenCenterRank.length; i++) {
22
+ evenCenterRank[i] = helpersBuffer.readUInt16LE(i * 2);
23
+ }
24
+ const orientClass = new Uint8Array(helpersBuffer.subarray(SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes, SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes + SKEWB_SOLVER_TABLE_METADATA.helpers.orientClassBytes));
25
+ const r7SetsBuffer = helpersBuffer.subarray(SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes + SKEWB_SOLVER_TABLE_METADATA.helpers.orientClassBytes);
26
+ const r7Sets = new Uint16Array(SKEWB_SOLVER_TABLE_METADATA.helpers.r7SetsEntries);
27
+ for (let i = 0; i < r7Sets.length; i++) {
28
+ r7Sets[i] = r7SetsBuffer.readUInt16LE(i * 2);
29
+ }
30
+ const policyBuffer = readFileSync(path.join(assetDirectory, manifest.files.policyTable.file));
31
+ if (policyBuffer.length !== manifest.files.policyTable.entries) {
32
+ throw new Error(`Invalid byte size for ${manifest.files.policyTable.file}`);
33
+ }
34
+ const policyTable = new Uint8Array(policyBuffer);
35
+ assertChecksum(manifest.files.policyTable.file, checksum(policyTable), SKEWB_SOLVER_TABLE_METADATA.policyTable.checksum);
36
+ return { permutationTable, orientationTable, centersTable, policyTable, evenCenterRank, orientClass, r7Sets };
37
+ }
38
+ function readUint16Table(assetDirectory, entry, expectedChecksum) {
39
+ const buffer = readFileSync(path.join(assetDirectory, entry.file));
40
+ if (buffer.length !== entry.entries * 2) {
41
+ throw new Error(`Invalid byte size for ${entry.file}`);
42
+ }
43
+ const values = new Uint16Array(entry.entries);
44
+ for (let index = 0; index < values.length; index += 1) {
45
+ values[index] = buffer.readUInt16LE(index * 2);
46
+ }
47
+ assertChecksum(entry.file, checksum(values), expectedChecksum);
48
+ return values;
49
+ }
50
+ function resolveGeneratedAssetDirectory() {
51
+ const envDirectory = process.env.CUBINGCENTER_SCRAMBLER_TABLES_DIR;
52
+ if (envDirectory && existsSync(path.join(envDirectory, "manifest.json"))) {
53
+ return envDirectory;
54
+ }
55
+ for (const candidate of getAssetDirectoryCandidates()) {
56
+ if (existsSync(path.join(candidate, "manifest.json"))) {
57
+ return candidate;
58
+ }
59
+ }
60
+ throw new Error("Unable to find generated skewb solver tables. Run pnpm skewb:tables.");
61
+ }
62
+ function getAssetDirectoryCandidates() {
63
+ const cwd = process.cwd();
64
+ const candidates = [
65
+ path.join(cwd, "src", GENERATED_DIRECTORY),
66
+ path.join(cwd, "dist", GENERATED_DIRECTORY),
67
+ path.join(cwd, "dist-cjs", GENERATED_DIRECTORY)
68
+ ];
69
+ try {
70
+ const requireFromCwd = createRequire(path.join(cwd, "package.json"));
71
+ const packageEntry = requireFromCwd.resolve("@cubingcenter/scrambler");
72
+ candidates.push(path.join(path.dirname(packageEntry), GENERATED_DIRECTORY));
73
+ }
74
+ catch {
75
+ // Source-tree usage is covered by the cwd candidates.
76
+ }
77
+ return candidates;
78
+ }
79
+ function assertChecksum(file, actual, expected) {
80
+ if (actual !== expected) {
81
+ throw new Error(`Checksum mismatch for ${file}: expected ${expected}, received ${actual}.`);
82
+ }
83
+ }
84
+ function checksum(values) {
85
+ let hash = 0x811c9dc5;
86
+ for (let index = 0; index < values.length; index += 1) {
87
+ hash ^= values[index];
88
+ hash = Math.imul(hash, 0x01000193);
89
+ }
90
+ return hash >>> 0;
91
+ }
@@ -0,0 +1,11 @@
1
+ import type { SkewbMove, SkewbState } from "../types.js";
2
+ export interface SkewbSolution {
3
+ moves: SkewbMove[];
4
+ depth: number;
5
+ }
6
+ export declare function solveSkewb(state: SkewbState): Promise<SkewbMove[]>;
7
+ export declare function solveSkewbWithInfo(state: SkewbState): Promise<SkewbSolution>;
8
+ export declare function solveSkewbSync(state: SkewbState): SkewbMove[];
9
+ export declare function verifySkewbScramble(state: SkewbState, scrambleMoves: readonly SkewbMove[]): boolean;
10
+ export declare function verifySkewbSolution(state: SkewbState, solutionMoves: readonly SkewbMove[]): boolean;
11
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGxE;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAGlF;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAK7D;AAsED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAOnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAUnG"}
@@ -0,0 +1,80 @@
1
+ import { ensureTablesLoaded, getCenterIndex, getOrientationIndex, getPerm7Index, getPolicyMoveFromPacked, MOVE_COUNT, PERMUTATION_TABLE, ORIENTATION_TABLE, CENTERS_TABLE, POLICY_TABLE, rankFromComponents, SKEWB_MOVES, SOLVED_RANK } from "./tables.js";
2
+ export async function solveSkewb(state) {
3
+ await ensureTablesLoaded();
4
+ return solveWithTables(state).moves;
5
+ }
6
+ export async function solveSkewbWithInfo(state) {
7
+ await ensureTablesLoaded();
8
+ return solveWithTables(state);
9
+ }
10
+ // Synchronous variant for scripts that have already ensured tables are loaded
11
+ export function solveSkewbSync(state) {
12
+ if (!POLICY_TABLE) {
13
+ throw new Error("Skewb solver tables not loaded. Call ensureTablesLoaded() first.");
14
+ }
15
+ return solveWithTables(state).moves;
16
+ }
17
+ function solveWithTables(state) {
18
+ const policy = POLICY_TABLE;
19
+ const permTable = PERMUTATION_TABLE;
20
+ const orientTable = ORIENTATION_TABLE;
21
+ const centersTable = CENTERS_TABLE;
22
+ if (state.corners.permutation[0] !== 0) {
23
+ throw new Error("The Skewb solver requires the UFR corner (index 0) to be fixed " +
24
+ "as the frame of reference. Please normalize the state before solving.");
25
+ }
26
+ let r7 = getPerm7Index(state.corners.permutation);
27
+ let rO = getOrientationIndex(state.corners.orientation);
28
+ let rC = getCenterIndex(state.centers);
29
+ let rank = rankFromComponents(r7, rO, rC);
30
+ if (rank === SOLVED_RANK) {
31
+ return { moves: [], depth: 0 };
32
+ }
33
+ const moves = [];
34
+ while (rank !== SOLVED_RANK) {
35
+ const m = getPolicyMoveFromPacked(policy, rank);
36
+ moves.push(SKEWB_MOVES[m]);
37
+ r7 = permTable[r7 * MOVE_COUNT + m];
38
+ rO = orientTable[rO * MOVE_COUNT + m];
39
+ rC = centersTable[rC * MOVE_COUNT + m];
40
+ rank = rankFromComponents(r7, rO, rC);
41
+ }
42
+ return { moves, depth: moves.length };
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Coordinate-walking verification (no full state clones)
46
+ // ---------------------------------------------------------------------------
47
+ const MOVE_INDEX = {};
48
+ for (let i = 0; i < SKEWB_MOVES.length; i++) {
49
+ MOVE_INDEX[SKEWB_MOVES[i]] = i;
50
+ }
51
+ function walkSkewbCoordinates(start, moves) {
52
+ const permTable = PERMUTATION_TABLE;
53
+ const orientTable = ORIENTATION_TABLE;
54
+ const centersTable = CENTERS_TABLE;
55
+ if (!permTable || !orientTable || !centersTable) {
56
+ throw new Error("Skewb solver tables not loaded. Call ensureTablesLoaded() first.");
57
+ }
58
+ let { r7, rO, rC } = start;
59
+ for (const move of moves) {
60
+ const m = MOVE_INDEX[move];
61
+ r7 = permTable[r7 * MOVE_COUNT + m];
62
+ rO = orientTable[rO * MOVE_COUNT + m];
63
+ rC = centersTable[rC * MOVE_COUNT + m];
64
+ }
65
+ return { r7, rO, rC };
66
+ }
67
+ export function verifySkewbScramble(state, scrambleMoves) {
68
+ const final = walkSkewbCoordinates({ r7: 0, rO: 0, rC: 0 }, scrambleMoves);
69
+ return (final.r7 === getPerm7Index(state.corners.permutation) &&
70
+ final.rO === getOrientationIndex(state.corners.orientation) &&
71
+ final.rC === getCenterIndex(state.centers));
72
+ }
73
+ export function verifySkewbSolution(state, solutionMoves) {
74
+ const final = walkSkewbCoordinates({
75
+ r7: getPerm7Index(state.corners.permutation),
76
+ rO: getOrientationIndex(state.corners.orientation),
77
+ rC: getCenterIndex(state.centers)
78
+ }, solutionMoves);
79
+ return final.r7 === 0 && final.rO === 0 && final.rC === 0;
80
+ }
@@ -0,0 +1,27 @@
1
+ export declare const SKEWB_SOLVER_TABLE_METADATA: {
2
+ readonly permutationTable: {
3
+ readonly entries: 40320;
4
+ readonly checksum: 3073532981;
5
+ };
6
+ readonly orientationTable: {
7
+ readonly entries: 17496;
8
+ readonly checksum: 2128852053;
9
+ };
10
+ readonly centersTable: {
11
+ readonly entries: 5760;
12
+ readonly checksum: 360885765;
13
+ };
14
+ readonly helpers: {
15
+ readonly evenCenterRankBytes: 1440;
16
+ readonly orientClassBytes: 2187;
17
+ readonly r7SetsEntries: 12960;
18
+ readonly entries: number;
19
+ readonly checksum: 4284555735;
20
+ };
21
+ readonly policyTable: {
22
+ readonly entries: 1180980;
23
+ readonly checksum: 1294485891;
24
+ readonly maxDepth: 11;
25
+ };
26
+ };
27
+ //# sourceMappingURL=table-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-metadata.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/table-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;CAyB9B,CAAC"}
@@ -0,0 +1,26 @@
1
+ export const SKEWB_SOLVER_TABLE_METADATA = {
2
+ permutationTable: {
3
+ entries: 40320, // PERMUTATION_COUNT (5040) * MOVE_COUNT (8)
4
+ checksum: 3073532981
5
+ },
6
+ orientationTable: {
7
+ entries: 17496, // ORIENTATION_COUNT (2187) * MOVE_COUNT (8)
8
+ checksum: 2128852053
9
+ },
10
+ centersTable: {
11
+ entries: 5760, // CENTER_COUNT (720) * MOVE_COUNT (8)
12
+ checksum: 360885765
13
+ },
14
+ helpers: {
15
+ evenCenterRankBytes: 1440, // 720 * 2 (Uint16, sentinel 65535)
16
+ orientClassBytes: 2187,
17
+ r7SetsEntries: 12960, // EVEN_CENTER_COUNT (360) * ORIENT_CLASS_COUNT (9) * PER_SET_SIZE (4)
18
+ entries: 1440 + 2187 + 12960 * 2,
19
+ checksum: 4284555735
20
+ },
21
+ policyTable: {
22
+ entries: 1180980, // ceil(STATE_COUNT (3_149_280) * 3 / 8)
23
+ checksum: 1294485891,
24
+ maxDepth: 11
25
+ }
26
+ };
@@ -0,0 +1,68 @@
1
+ import type { SkewbMove, SkewbState } from "../types.js";
2
+ export declare function getPermutationIndex(perm: readonly number[]): number;
3
+ export declare function getPermutationFromIndex(index: number, n: number): number[];
4
+ export declare function getOrientationIndex(orient: readonly number[]): number;
5
+ export declare function getOrientationFromIndex(index: number): number[];
6
+ export declare function getCenterIndex(centers: readonly number[]): number;
7
+ export declare function getCenterFromIndex(index: number): number[];
8
+ export declare function getStateIndex(state: SkewbState): number;
9
+ export declare function getStateFromIndex(index: number): SkewbState;
10
+ export declare const PERMUTATION_COUNT = 5040;
11
+ export declare const ORIENTATION_COUNT = 2187;
12
+ export declare const CENTER_COUNT = 720;
13
+ export declare const EVEN_CENTER_COUNT = 360;
14
+ export declare const ORIENT_CLASS_COUNT = 9;
15
+ export declare const PER_SET_SIZE = 4;
16
+ export declare const MOVE_COUNT = 8;
17
+ export declare const STATE_COUNT: number;
18
+ export declare const POLICY_PACKED_ENTRIES: number;
19
+ export declare const SKEWB_MOVES: readonly SkewbMove[];
20
+ export declare function getPerm7Index(perm: readonly number[]): number;
21
+ export declare function getPerm7FromIndex(index: number): number[];
22
+ export declare let PERMUTATION_TABLE: Uint16Array | null;
23
+ export declare let ORIENTATION_TABLE: Uint16Array | null;
24
+ export declare let CENTERS_TABLE: Uint16Array | null;
25
+ export declare let POLICY_TABLE: Uint8Array | null;
26
+ export declare let EVEN_CENTER_RANK: Uint16Array | null;
27
+ export declare let EVEN_CENTER_FULL: Uint16Array | null;
28
+ export declare let ORIENT_CLASS: Uint8Array | null;
29
+ export declare let R7_SETS: Uint16Array | null;
30
+ export declare let PERM7_UNRANK: Uint8Array | null;
31
+ export declare let CENTER_UNRANK: Uint8Array | null;
32
+ export declare let SOLVED_RANK: number;
33
+ export declare function ensureTablesLoaded(): Promise<void>;
34
+ export declare function assignTables(tables: {
35
+ permutationTable: Uint16Array;
36
+ orientationTable: Uint16Array;
37
+ centersTable: Uint16Array;
38
+ policyTable: Uint8Array;
39
+ evenCenterRank: Uint16Array;
40
+ orientClass: Uint8Array;
41
+ r7Sets: Uint16Array;
42
+ }): void;
43
+ export declare function resetTablesForTests(): void;
44
+ export declare function rankFromComponents(r7: number, rO: number, rC: number): number;
45
+ export declare function getStateRank(state: SkewbState): number;
46
+ export declare function getStateFromRank(rank: number): SkewbState;
47
+ export declare function getPolicyMoveFromPacked(packed: Uint8Array, stateRank: number): number;
48
+ export declare function getPolicyMove(stateRank: number): number;
49
+ export declare function getPermutationTransition(permIdx: number, move: number): number;
50
+ export declare function getOrientationTransition(orientIdx: number, move: number): number;
51
+ export declare function getCentersTransition(centerIdx: number, move: number): number;
52
+ export declare function generatePermutationTable(): Uint16Array;
53
+ export declare function generateOrientationTable(): Uint16Array;
54
+ export declare function generateCentersTable(): Uint16Array;
55
+ export declare function permutationParity(perm: readonly number[]): number;
56
+ export interface SkewbHelperTables {
57
+ evenCenterRank: Uint16Array;
58
+ orientClass: Uint8Array;
59
+ r7Sets: Uint16Array;
60
+ evenCenterFull: Uint16Array;
61
+ }
62
+ export declare function generateHelperTables(permTable: Uint16Array, orientTable: Uint16Array, centersTable: Uint16Array): SkewbHelperTables;
63
+ export declare function generatePolicyTable(permTable: Uint16Array, orientTable: Uint16Array, centersTable: Uint16Array, helpers: SkewbHelperTables): {
64
+ packed: Uint8Array;
65
+ maxDepth: number;
66
+ };
67
+ export declare function checksum(values: ArrayLike<number>): number;
68
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/skewb/solver/tables.ts"],"names":[],"mappings":"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"}