aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arch/common.h14
-rw-r--r--src/core/constant_cubes.h229
-rw-r--r--src/core/constants.h734
-rw-r--r--src/core/core.h3
-rw-r--r--src/core/core_types.h4
-rw-r--r--src/core/cube.h95
-rw-r--r--src/core/moves.h12
-rw-r--r--src/core/transform.h13
-rw-r--r--src/nissy.c77
-rw-r--r--src/nissy.h25
-rw-r--r--src/solvers/h48/solve.h4
-rw-r--r--src/utils/constants.h442
12 files changed, 846 insertions, 806 deletions
diff --git a/src/arch/common.h b/src/arch/common.h
index e57fba9..922ea51 100644
--- a/src/arch/common.h
+++ b/src/arch/common.h
@@ -1,3 +1,17 @@
1#define EOSHIFT UINT8_C(4)
2#define COSHIFT UINT8_C(5)
3
4#define PBITS UINT8_C(0xF)
5#define ESEPBIT_1 UINT8_C(0x4)
6#define ESEPBIT_2 UINT8_C(0x8)
7#define CSEPBIT UINT8_C(0x4)
8#define EOBIT UINT8_C(0x10)
9#define COBITS UINT8_C(0xF0)
10#define COBITS_2 UINT8_C(0x60)
11#define CTWIST_CW UINT8_C(0x20)
12#define CTWIST_CCW UINT8_C(0x40)
13#define EFLIP UINT8_C(0x10)
14
1STATIC_INLINE int popcount_u32(uint32_t); 15STATIC_INLINE int popcount_u32(uint32_t);
2 16
3STATIC void pieces(cube_t [static 1], uint8_t [static 8], uint8_t [static 12]); 17STATIC void pieces(cube_t [static 1], uint8_t [static 8], uint8_t [static 12]);
diff --git a/src/core/constant_cubes.h b/src/core/constant_cubes.h
deleted file mode 100644
index 9657e1a..0000000
--- a/src/core/constant_cubes.h
+++ /dev/null
@@ -1,229 +0,0 @@
1#define MOVE_CUBE_U STATIC_CUBE( \
2 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
3#define MOVE_CUBE_U2 STATIC_CUBE( \
4 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
5#define MOVE_CUBE_U3 STATIC_CUBE( \
6 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
7#define MOVE_CUBE_D STATIC_CUBE( \
8 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
9#define MOVE_CUBE_D2 STATIC_CUBE( \
10 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
11#define MOVE_CUBE_D3 STATIC_CUBE( \
12 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
13#define MOVE_CUBE_R STATIC_CUBE( \
14 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
15#define MOVE_CUBE_R2 STATIC_CUBE( \
16 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
17#define MOVE_CUBE_R3 STATIC_CUBE( \
18 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
19#define MOVE_CUBE_L STATIC_CUBE( \
20 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
21#define MOVE_CUBE_L2 STATIC_CUBE( \
22 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
23#define MOVE_CUBE_L3 STATIC_CUBE( \
24 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
25#define MOVE_CUBE_F STATIC_CUBE( \
26 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
27#define MOVE_CUBE_F2 STATIC_CUBE( \
28 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
29#define MOVE_CUBE_F3 STATIC_CUBE( \
30 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
31#define MOVE_CUBE_B STATIC_CUBE( \
32 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
33#define MOVE_CUBE_B2 STATIC_CUBE( \
34 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
35#define MOVE_CUBE_B3 STATIC_CUBE( \
36 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
37
38#define TRANS_CUBE_UFr STATIC_CUBE( \
39 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
40#define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \
41 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
42#define TRANS_CUBE_ULr STATIC_CUBE( \
43 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
44#define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \
45 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
46#define TRANS_CUBE_UBr STATIC_CUBE( \
47 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
48#define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \
49 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
50#define TRANS_CUBE_URr STATIC_CUBE( \
51 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
52#define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \
53 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
54#define TRANS_CUBE_DFr STATIC_CUBE( \
55 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
56#define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \
57 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
58#define TRANS_CUBE_DLr STATIC_CUBE( \
59 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
60#define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \
61 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
62#define TRANS_CUBE_DBr STATIC_CUBE( \
63 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
64#define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \
65 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
66#define TRANS_CUBE_DRr STATIC_CUBE( \
67 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
68#define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \
69 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
70#define TRANS_CUBE_RUr STATIC_CUBE( \
71 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
72#define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \
73 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
74#define TRANS_CUBE_RFr STATIC_CUBE( \
75 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
76#define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \
77 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
78#define TRANS_CUBE_RDr STATIC_CUBE( \
79 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
80#define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \
81 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
82#define TRANS_CUBE_RBr STATIC_CUBE( \
83 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
84#define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \
85 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
86#define TRANS_CUBE_LUr STATIC_CUBE( \
87 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
88#define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \
89 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
90#define TRANS_CUBE_LFr STATIC_CUBE( \
91 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
92#define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \
93 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
94#define TRANS_CUBE_LDr STATIC_CUBE( \
95 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
96#define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \
97 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
98#define TRANS_CUBE_LBr STATIC_CUBE( \
99 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
100#define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \
101 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
102#define TRANS_CUBE_FUr STATIC_CUBE( \
103 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
104#define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \
105 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
106#define TRANS_CUBE_FRr STATIC_CUBE( \
107 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
108#define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \
109 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
110#define TRANS_CUBE_FDr STATIC_CUBE( \
111 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
112#define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \
113 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
114#define TRANS_CUBE_FLr STATIC_CUBE( \
115 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
116#define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \
117 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
118#define TRANS_CUBE_BUr STATIC_CUBE( \
119 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
120#define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \
121 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
122#define TRANS_CUBE_BRr STATIC_CUBE( \
123 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
124#define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \
125 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
126#define TRANS_CUBE_BDr STATIC_CUBE( \
127 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
128#define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \
129 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
130#define TRANS_CUBE_BLr STATIC_CUBE( \
131 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
132#define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \
133 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
134#define TRANS_CUBE_UFm STATIC_CUBE( \
135 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
136#define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \
137 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
138#define TRANS_CUBE_ULm STATIC_CUBE( \
139 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
140#define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \
141 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
142#define TRANS_CUBE_UBm STATIC_CUBE( \
143 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
144#define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \
145 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
146#define TRANS_CUBE_URm STATIC_CUBE( \
147 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
148#define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \
149 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
150#define TRANS_CUBE_DFm STATIC_CUBE( \
151 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
152#define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \
153 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
154#define TRANS_CUBE_DLm STATIC_CUBE( \
155 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
156#define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \
157 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
158#define TRANS_CUBE_DBm STATIC_CUBE( \
159 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
160#define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \
161 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
162#define TRANS_CUBE_DRm STATIC_CUBE( \
163 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
164#define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \
165 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
166#define TRANS_CUBE_RUm STATIC_CUBE( \
167 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
168#define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \
169 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
170#define TRANS_CUBE_RFm STATIC_CUBE( \
171 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
172#define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \
173 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
174#define TRANS_CUBE_RDm STATIC_CUBE( \
175 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
176#define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \
177 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
178#define TRANS_CUBE_RBm STATIC_CUBE( \
179 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
180#define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \
181 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
182#define TRANS_CUBE_LUm STATIC_CUBE( \
183 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
184#define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \
185 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
186#define TRANS_CUBE_LFm STATIC_CUBE( \
187 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
188#define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \
189 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
190#define TRANS_CUBE_LDm STATIC_CUBE( \
191 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
192#define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \
193 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
194#define TRANS_CUBE_LBm STATIC_CUBE( \
195 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
196#define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \
197 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
198#define TRANS_CUBE_FUm STATIC_CUBE( \
199 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
200#define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \
201 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
202#define TRANS_CUBE_FRm STATIC_CUBE( \
203 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
204#define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \
205 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
206#define TRANS_CUBE_FDm STATIC_CUBE( \
207 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
208#define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \
209 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
210#define TRANS_CUBE_FLm STATIC_CUBE( \
211 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
212#define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \
213 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
214#define TRANS_CUBE_BUm STATIC_CUBE( \
215 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
216#define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \
217 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
218#define TRANS_CUBE_BRm STATIC_CUBE( \
219 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
220#define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \
221 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
222#define TRANS_CUBE_BDm STATIC_CUBE( \
223 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
224#define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \
225 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
226#define TRANS_CUBE_BLm STATIC_CUBE( \
227 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
228#define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \
229 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
diff --git a/src/core/constants.h b/src/core/constants.h
new file mode 100644
index 0000000..e8b80ae
--- /dev/null
+++ b/src/core/constants.h
@@ -0,0 +1,734 @@
1#define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0})
2#define SOLVED_ORIENTED_CUBE \
3 ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 })
4
5#define MOVE_CUBE_U STATIC_CUBE( \
6 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
7#define MOVE_CUBE_U2 STATIC_CUBE( \
8 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
9#define MOVE_CUBE_U3 STATIC_CUBE( \
10 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
11#define MOVE_CUBE_D STATIC_CUBE( \
12 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
13#define MOVE_CUBE_D2 STATIC_CUBE( \
14 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
15#define MOVE_CUBE_D3 STATIC_CUBE( \
16 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
17#define MOVE_CUBE_R STATIC_CUBE( \
18 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
19#define MOVE_CUBE_R2 STATIC_CUBE( \
20 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
21#define MOVE_CUBE_R3 STATIC_CUBE( \
22 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
23#define MOVE_CUBE_L STATIC_CUBE( \
24 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
25#define MOVE_CUBE_L2 STATIC_CUBE( \
26 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
27#define MOVE_CUBE_L3 STATIC_CUBE( \
28 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
29#define MOVE_CUBE_F STATIC_CUBE( \
30 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
31#define MOVE_CUBE_F2 STATIC_CUBE( \
32 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
33#define MOVE_CUBE_F3 STATIC_CUBE( \
34 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
35#define MOVE_CUBE_B STATIC_CUBE( \
36 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
37#define MOVE_CUBE_B2 STATIC_CUBE( \
38 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
39#define MOVE_CUBE_B3 STATIC_CUBE( \
40 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
41
42#define TRANS_CUBE_UFr STATIC_CUBE( \
43 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
44#define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \
45 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
46#define TRANS_CUBE_ULr STATIC_CUBE( \
47 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
48#define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \
49 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
50#define TRANS_CUBE_UBr STATIC_CUBE( \
51 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
52#define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \
53 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
54#define TRANS_CUBE_URr STATIC_CUBE( \
55 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
56#define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \
57 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
58#define TRANS_CUBE_DFr STATIC_CUBE( \
59 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
60#define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \
61 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
62#define TRANS_CUBE_DLr STATIC_CUBE( \
63 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
64#define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \
65 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
66#define TRANS_CUBE_DBr STATIC_CUBE( \
67 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
68#define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \
69 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
70#define TRANS_CUBE_DRr STATIC_CUBE( \
71 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
72#define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \
73 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
74#define TRANS_CUBE_RUr STATIC_CUBE( \
75 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
76#define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \
77 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
78#define TRANS_CUBE_RFr STATIC_CUBE( \
79 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
80#define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \
81 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
82#define TRANS_CUBE_RDr STATIC_CUBE( \
83 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
84#define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \
85 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
86#define TRANS_CUBE_RBr STATIC_CUBE( \
87 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
88#define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \
89 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
90#define TRANS_CUBE_LUr STATIC_CUBE( \
91 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
92#define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \
93 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
94#define TRANS_CUBE_LFr STATIC_CUBE( \
95 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
96#define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \
97 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
98#define TRANS_CUBE_LDr STATIC_CUBE( \
99 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
100#define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \
101 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
102#define TRANS_CUBE_LBr STATIC_CUBE( \
103 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
104#define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \
105 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
106#define TRANS_CUBE_FUr STATIC_CUBE( \
107 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
108#define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \
109 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
110#define TRANS_CUBE_FRr STATIC_CUBE( \
111 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
112#define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \
113 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
114#define TRANS_CUBE_FDr STATIC_CUBE( \
115 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
116#define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \
117 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
118#define TRANS_CUBE_FLr STATIC_CUBE( \
119 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
120#define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \
121 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
122#define TRANS_CUBE_BUr STATIC_CUBE( \
123 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
124#define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \
125 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
126#define TRANS_CUBE_BRr STATIC_CUBE( \
127 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
128#define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \
129 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
130#define TRANS_CUBE_BDr STATIC_CUBE( \
131 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
132#define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \
133 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
134#define TRANS_CUBE_BLr STATIC_CUBE( \
135 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
136#define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \
137 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
138#define TRANS_CUBE_UFm STATIC_CUBE( \
139 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
140#define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \
141 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
142#define TRANS_CUBE_ULm STATIC_CUBE( \
143 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
144#define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \
145 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
146#define TRANS_CUBE_UBm STATIC_CUBE( \
147 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
148#define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \
149 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
150#define TRANS_CUBE_URm STATIC_CUBE( \
151 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
152#define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \
153 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
154#define TRANS_CUBE_DFm STATIC_CUBE( \
155 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
156#define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \
157 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
158#define TRANS_CUBE_DLm STATIC_CUBE( \
159 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
160#define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \
161 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
162#define TRANS_CUBE_DBm STATIC_CUBE( \
163 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
164#define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \
165 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
166#define TRANS_CUBE_DRm STATIC_CUBE( \
167 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
168#define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \
169 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
170#define TRANS_CUBE_RUm STATIC_CUBE( \
171 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
172#define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \
173 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
174#define TRANS_CUBE_RFm STATIC_CUBE( \
175 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
176#define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \
177 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
178#define TRANS_CUBE_RDm STATIC_CUBE( \
179 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
180#define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \
181 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
182#define TRANS_CUBE_RBm STATIC_CUBE( \
183 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
184#define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \
185 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
186#define TRANS_CUBE_LUm STATIC_CUBE( \
187 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
188#define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \
189 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
190#define TRANS_CUBE_LFm STATIC_CUBE( \
191 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
192#define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \
193 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
194#define TRANS_CUBE_LDm STATIC_CUBE( \
195 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
196#define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \
197 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
198#define TRANS_CUBE_LBm STATIC_CUBE( \
199 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
200#define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \
201 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
202#define TRANS_CUBE_FUm STATIC_CUBE( \
203 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
204#define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \
205 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
206#define TRANS_CUBE_FRm STATIC_CUBE( \
207 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
208#define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \
209 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
210#define TRANS_CUBE_FDm STATIC_CUBE( \
211 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
212#define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \
213 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
214#define TRANS_CUBE_FLm STATIC_CUBE( \
215 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
216#define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \
217 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
218#define TRANS_CUBE_BUm STATIC_CUBE( \
219 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
220#define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \
221 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
222#define TRANS_CUBE_BRm STATIC_CUBE( \
223 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
224#define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \
225 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
226#define TRANS_CUBE_BDm STATIC_CUBE( \
227 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
228#define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \
229 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
230#define TRANS_CUBE_BLm STATIC_CUBE( \
231 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
232#define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \
233 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
234
235#define MOVE_U UINT8_C(0)
236#define MOVE_U2 UINT8_C(1)
237#define MOVE_U3 UINT8_C(2)
238#define MOVE_D UINT8_C(3)
239#define MOVE_D2 UINT8_C(4)
240#define MOVE_D3 UINT8_C(5)
241#define MOVE_R UINT8_C(6)
242#define MOVE_R2 UINT8_C(7)
243#define MOVE_R3 UINT8_C(8)
244#define MOVE_L UINT8_C(9)
245#define MOVE_L2 UINT8_C(10)
246#define MOVE_L3 UINT8_C(11)
247#define MOVE_F UINT8_C(12)
248#define MOVE_F2 UINT8_C(13)
249#define MOVE_F3 UINT8_C(14)
250#define MOVE_B UINT8_C(15)
251#define MOVE_B2 UINT8_C(16)
252#define MOVE_B3 UINT8_C(17)
253
254#define MOVE_Uw UINT8_C(18)
255#define MOVE_Uw2 UINT8_C(19)
256#define MOVE_Uw3 UINT8_C(20)
257#define MOVE_Dw UINT8_C(21)
258#define MOVE_Dw2 UINT8_C(22)
259#define MOVE_Dw3 UINT8_C(23)
260#define MOVE_Rw UINT8_C(24)
261#define MOVE_Rw2 UINT8_C(25)
262#define MOVE_Rw3 UINT8_C(26)
263#define MOVE_Lw UINT8_C(27)
264#define MOVE_Lw2 UINT8_C(28)
265#define MOVE_Lw3 UINT8_C(29)
266#define MOVE_Fw UINT8_C(30)
267#define MOVE_Fw2 UINT8_C(31)
268#define MOVE_Fw3 UINT8_C(32)
269#define MOVE_Bw UINT8_C(33)
270#define MOVE_Bw2 UINT8_C(34)
271#define MOVE_Bw3 UINT8_C(35)
272
273#define MOVE_M UINT8_C(36)
274#define MOVE_M2 UINT8_C(37)
275#define MOVE_M3 UINT8_C(38)
276#define MOVE_S UINT8_C(39)
277#define MOVE_S2 UINT8_C(40)
278#define MOVE_S3 UINT8_C(41)
279#define MOVE_E UINT8_C(42)
280#define MOVE_E2 UINT8_C(43)
281#define MOVE_E3 UINT8_C(44)
282
283#define MOVE_x UINT8_C(45)
284#define MOVE_x2 UINT8_C(46)
285#define MOVE_x3 UINT8_C(47)
286#define MOVE_y UINT8_C(48)
287#define MOVE_y2 UINT8_C(49)
288#define MOVE_y3 UINT8_C(50)
289#define MOVE_z UINT8_C(51)
290#define MOVE_z2 UINT8_C(52)
291#define MOVE_z3 UINT8_C(53)
292
293#define TRANS_UFr UINT8_C(0)
294#define TRANS_ULr UINT8_C(1)
295#define TRANS_UBr UINT8_C(2)
296#define TRANS_URr UINT8_C(3)
297#define TRANS_DFr UINT8_C(4)
298#define TRANS_DLr UINT8_C(5)
299#define TRANS_DBr UINT8_C(6)
300#define TRANS_DRr UINT8_C(7)
301#define TRANS_RUr UINT8_C(8)
302#define TRANS_RFr UINT8_C(9)
303#define TRANS_RDr UINT8_C(10)
304#define TRANS_RBr UINT8_C(11)
305#define TRANS_LUr UINT8_C(12)
306#define TRANS_LFr UINT8_C(13)
307#define TRANS_LDr UINT8_C(14)
308#define TRANS_LBr UINT8_C(15)
309#define TRANS_FUr UINT8_C(16)
310#define TRANS_FRr UINT8_C(17)
311#define TRANS_FDr UINT8_C(18)
312#define TRANS_FLr UINT8_C(19)
313#define TRANS_BUr UINT8_C(20)
314#define TRANS_BRr UINT8_C(21)
315#define TRANS_BDr UINT8_C(22)
316#define TRANS_BLr UINT8_C(23)
317
318#define TRANS_UFm UINT8_C(24)
319#define TRANS_ULm UINT8_C(25)
320#define TRANS_UBm UINT8_C(26)
321#define TRANS_URm UINT8_C(27)
322#define TRANS_DFm UINT8_C(28)
323#define TRANS_DLm UINT8_C(29)
324#define TRANS_DBm UINT8_C(30)
325#define TRANS_DRm UINT8_C(31)
326#define TRANS_RUm UINT8_C(32)
327#define TRANS_RFm UINT8_C(33)
328#define TRANS_RDm UINT8_C(34)
329#define TRANS_RBm UINT8_C(35)
330#define TRANS_LUm UINT8_C(36)
331#define TRANS_LFm UINT8_C(37)
332#define TRANS_LDm UINT8_C(38)
333#define TRANS_LBm UINT8_C(39)
334#define TRANS_FUm UINT8_C(40)
335#define TRANS_FRm UINT8_C(41)
336#define TRANS_FDm UINT8_C(42)
337#define TRANS_FLm UINT8_C(43)
338#define TRANS_BUm UINT8_C(44)
339#define TRANS_BRm UINT8_C(45)
340#define TRANS_BDm UINT8_C(46)
341#define TRANS_BLm UINT8_C(47)
342
343#define AXIS_UD UINT8_C(0)
344#define AXIS_RL UINT8_C(1)
345#define AXIS_FB UINT8_C(2)
346
347#define NMOVES (1+MOVE_B3)
348#define NMOVES_EXTENDED (1+MOVE_z3)
349#define NTRANS (1+TRANS_BLm)
350
351#define MM_ALLMOVES UINT32_C(0x3FFFF)
352#define MM_NOHALFTURNS UINT32_C(0x2DB6D)
353#define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m))
354#define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m))
355#define MM_EO (\
356 MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
357 MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\
358 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
359#define MM_DR (\
360 MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
361 MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\
362 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
363#define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS)
364
365#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
366#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t))
367#define TM_UDRLFIX (\
368 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \
369 TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \
370 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm))
371#define TM_UDFIX (\
372 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
373 TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
374 TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
375 TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
376 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
377 TM_SINGLE(TRANS_DLm))
378
379#define CORNER_UFR UINT8_C(0)
380#define CORNER_UBL UINT8_C(1)
381#define CORNER_DFL UINT8_C(2)
382#define CORNER_DBR UINT8_C(3)
383#define CORNER_UFL UINT8_C(4)
384#define CORNER_UBR UINT8_C(5)
385#define CORNER_DFR UINT8_C(6)
386#define CORNER_DBL UINT8_C(7)
387
388#define EDGE_UF UINT8_C(0)
389#define EDGE_UB UINT8_C(1)
390#define EDGE_DB UINT8_C(2)
391#define EDGE_DF UINT8_C(3)
392#define EDGE_UR UINT8_C(4)
393#define EDGE_UL UINT8_C(5)
394#define EDGE_DL UINT8_C(6)
395#define EDGE_DR UINT8_C(7)
396#define EDGE_FR UINT8_C(8)
397#define EDGE_FL UINT8_C(9)
398#define EDGE_BL UINT8_C(10)
399#define EDGE_BR UINT8_C(11)
400
401#define ORIENTATION_UF UINT8_C(0)
402#define ORIENTATION_UR UINT8_C(1)
403#define ORIENTATION_UB UINT8_C(2)
404#define ORIENTATION_UL UINT8_C(3)
405#define ORIENTATION_DF UINT8_C(4)
406#define ORIENTATION_DR UINT8_C(5)
407#define ORIENTATION_DB UINT8_C(6)
408#define ORIENTATION_DL UINT8_C(7)
409#define ORIENTATION_RF UINT8_C(8)
410#define ORIENTATION_RD UINT8_C(9)
411#define ORIENTATION_RB UINT8_C(10)
412#define ORIENTATION_RU UINT8_C(11)
413#define ORIENTATION_LF UINT8_C(12)
414#define ORIENTATION_LD UINT8_C(13)
415#define ORIENTATION_LB UINT8_C(14)
416#define ORIENTATION_LU UINT8_C(15)
417#define ORIENTATION_FD UINT8_C(16)
418#define ORIENTATION_FR UINT8_C(17)
419#define ORIENTATION_FU UINT8_C(18)
420#define ORIENTATION_FL UINT8_C(19)
421#define ORIENTATION_BD UINT8_C(20)
422#define ORIENTATION_BR UINT8_C(21)
423#define ORIENTATION_BU UINT8_C(22)
424#define ORIENTATION_BL UINT8_C(23)
425
426STATIC const uint32_t allowedmask[] = {
427 UINT32_C(0x3FFF8),
428 UINT32_C(0x3FFC0),
429 UINT32_C(0x3FE3F),
430 UINT32_C(0x3F03F),
431 UINT32_C(0x38FFF),
432 UINT32_C(0x00FFF)
433};
434
435STATIC const char *cornerstr[] = {
436 [CORNER_UFR] = "UFR",
437 [CORNER_UBL] = "UBL",
438 [CORNER_DFL] = "DFL",
439 [CORNER_DBR] = "DBR",
440 [CORNER_UFL] = "UFL",
441 [CORNER_UBR] = "UBR",
442 [CORNER_DFR] = "DFR",
443 [CORNER_DBL] = "DBL"
444};
445
446STATIC const char *cornerstralt[] = {
447 [CORNER_UFR] = "URF",
448 [CORNER_UBL] = "ULB",
449 [CORNER_DFL] = "DLF",
450 [CORNER_DBR] = "DRB",
451 [CORNER_UFL] = "ULF",
452 [CORNER_UBR] = "URB",
453 [CORNER_DFR] = "DRF",
454 [CORNER_DBL] = "DLB"
455};
456
457STATIC const char *edgestr[] = {
458 [EDGE_UF] = "UF",
459 [EDGE_UB] = "UB",
460 [EDGE_DB] = "DB",
461 [EDGE_DF] = "DF",
462 [EDGE_UR] = "UR",
463 [EDGE_UL] = "UL",
464 [EDGE_DL] = "DL",
465 [EDGE_DR] = "DR",
466 [EDGE_FR] = "FR",
467 [EDGE_FL] = "FL",
468 [EDGE_BL] = "BL",
469 [EDGE_BR] = "BR"
470};
471
472STATIC const char *movestr[] = {
473 [MOVE_U] = "U",
474 [MOVE_U2] = "U2",
475 [MOVE_U3] = "U'",
476 [MOVE_D] = "D",
477 [MOVE_D2] = "D2",
478 [MOVE_D3] = "D'",
479 [MOVE_R] = "R",
480 [MOVE_R2] = "R2",
481 [MOVE_R3] = "R'",
482 [MOVE_L] = "L",
483 [MOVE_L2] = "L2",
484 [MOVE_L3] = "L'",
485 [MOVE_F] = "F",
486 [MOVE_F2] = "F2",
487 [MOVE_F3] = "F'",
488 [MOVE_B] = "B",
489 [MOVE_B2] = "B2",
490 [MOVE_B3] = "B'",
491
492 [MOVE_Uw] = "Uw",
493 [MOVE_Uw2] = "Uw2",
494 [MOVE_Uw3] = "Uw'",
495 [MOVE_Dw] = "Dw",
496 [MOVE_Dw2] = "Dw2",
497 [MOVE_Dw3] = "Dw'",
498 [MOVE_Rw] = "Rw",
499 [MOVE_Rw2] = "Rw2",
500 [MOVE_Rw3] = "Rw'",
501 [MOVE_Lw] = "Lw",
502 [MOVE_Lw2] = "Lw2",
503 [MOVE_Lw3] = "Lw'",
504 [MOVE_Fw] = "Fw",
505 [MOVE_Fw2] = "Fw2",
506 [MOVE_Fw3] = "Fw'",
507 [MOVE_Bw] = "Bw",
508 [MOVE_Bw2] = "Bw2",
509 [MOVE_Bw3] = "Bw'",
510
511 [MOVE_M] = "M",
512 [MOVE_M2] = "M2",
513 [MOVE_M3] = "M'",
514 [MOVE_S] = "S",
515 [MOVE_S2] = "S2",
516 [MOVE_S3] = "S'",
517 [MOVE_E] = "E",
518 [MOVE_E2] = "E2",
519 [MOVE_E3] = "E'",
520
521 [MOVE_x] = "x",
522 [MOVE_x2] = "x2",
523 [MOVE_x3] = "x'",
524 [MOVE_y] = "y",
525 [MOVE_y2] = "y2",
526 [MOVE_y3] = "y'",
527 [MOVE_z] = "z",
528 [MOVE_z2] = "z2",
529 [MOVE_z3] = "z'",
530};
531
532STATIC const char *transstr[] = {
533 [TRANS_UFr] = "rotation UF",
534 [TRANS_UFm] = "mirrored UF",
535 [TRANS_ULr] = "rotation UL",
536 [TRANS_ULm] = "mirrored UL",
537 [TRANS_UBr] = "rotation UB",
538 [TRANS_UBm] = "mirrored UB",
539 [TRANS_URr] = "rotation UR",
540 [TRANS_URm] = "mirrored UR",
541 [TRANS_DFr] = "rotation DF",
542 [TRANS_DFm] = "mirrored DF",
543 [TRANS_DLr] = "rotation DL",
544 [TRANS_DLm] = "mirrored DL",
545 [TRANS_DBr] = "rotation DB",
546 [TRANS_DBm] = "mirrored DB",
547 [TRANS_DRr] = "rotation DR",
548 [TRANS_DRm] = "mirrored DR",
549 [TRANS_RUr] = "rotation RU",
550 [TRANS_RUm] = "mirrored RU",
551 [TRANS_RFr] = "rotation RF",
552 [TRANS_RFm] = "mirrored RF",
553 [TRANS_RDr] = "rotation RD",
554 [TRANS_RDm] = "mirrored RD",
555 [TRANS_RBr] = "rotation RB",
556 [TRANS_RBm] = "mirrored RB",
557 [TRANS_LUr] = "rotation LU",
558 [TRANS_LUm] = "mirrored LU",
559 [TRANS_LFr] = "rotation LF",
560 [TRANS_LFm] = "mirrored LF",
561 [TRANS_LDr] = "rotation LD",
562 [TRANS_LDm] = "mirrored LD",
563 [TRANS_LBr] = "rotation LB",
564 [TRANS_LBm] = "mirrored LB",
565 [TRANS_FUr] = "rotation FU",
566 [TRANS_FUm] = "mirrored FU",
567 [TRANS_FRr] = "rotation FR",
568 [TRANS_FRm] = "mirrored FR",
569 [TRANS_FDr] = "rotation FD",
570 [TRANS_FDm] = "mirrored FD",
571 [TRANS_FLr] = "rotation FL",
572 [TRANS_FLm] = "mirrored FL",
573 [TRANS_BUr] = "rotation BU",
574 [TRANS_BUm] = "mirrored BU",
575 [TRANS_BRr] = "rotation BR",
576 [TRANS_BRm] = "mirrored BR",
577 [TRANS_BDr] = "rotation BD",
578 [TRANS_BDm] = "mirrored BD",
579 [TRANS_BLr] = "rotation BL",
580 [TRANS_BLm] = "mirrored BL",
581};
582
583static uint8_t inverse_trans_table[] = {
584 [TRANS_UFr] = TRANS_UFr,
585 [TRANS_UFm] = TRANS_UFm,
586 [TRANS_ULr] = TRANS_URr,
587 [TRANS_ULm] = TRANS_ULm,
588 [TRANS_UBr] = TRANS_UBr,
589 [TRANS_UBm] = TRANS_UBm,
590 [TRANS_URr] = TRANS_ULr,
591 [TRANS_URm] = TRANS_URm,
592 [TRANS_DFr] = TRANS_DFr,
593 [TRANS_DFm] = TRANS_DFm,
594 [TRANS_DLr] = TRANS_DLr,
595 [TRANS_DLm] = TRANS_DRm,
596 [TRANS_DBr] = TRANS_DBr,
597 [TRANS_DBm] = TRANS_DBm,
598 [TRANS_DRr] = TRANS_DRr,
599 [TRANS_DRm] = TRANS_DLm,
600 [TRANS_RUr] = TRANS_FRr,
601 [TRANS_RUm] = TRANS_FLm,
602 [TRANS_RFr] = TRANS_LFr,
603 [TRANS_RFm] = TRANS_RFm,
604 [TRANS_RDr] = TRANS_BLr,
605 [TRANS_RDm] = TRANS_BRm,
606 [TRANS_RBr] = TRANS_RBr,
607 [TRANS_RBm] = TRANS_LBm,
608 [TRANS_LUr] = TRANS_FLr,
609 [TRANS_LUm] = TRANS_FRm,
610 [TRANS_LFr] = TRANS_RFr,
611 [TRANS_LFm] = TRANS_LFm,
612 [TRANS_LDr] = TRANS_BRr,
613 [TRANS_LDm] = TRANS_BLm,
614 [TRANS_LBr] = TRANS_LBr,
615 [TRANS_LBm] = TRANS_RBm,
616 [TRANS_FUr] = TRANS_FUr,
617 [TRANS_FUm] = TRANS_FUm,
618 [TRANS_FRr] = TRANS_RUr,
619 [TRANS_FRm] = TRANS_LUm,
620 [TRANS_FDr] = TRANS_BUr,
621 [TRANS_FDm] = TRANS_BUm,
622 [TRANS_FLr] = TRANS_LUr,
623 [TRANS_FLm] = TRANS_RUm,
624 [TRANS_BUr] = TRANS_FDr,
625 [TRANS_BUm] = TRANS_FDm,
626 [TRANS_BRr] = TRANS_LDr,
627 [TRANS_BRm] = TRANS_RDm,
628 [TRANS_BDr] = TRANS_BDr,
629 [TRANS_BDm] = TRANS_BDm,
630 [TRANS_BLr] = TRANS_RDr,
631 [TRANS_BLm] = TRANS_LDm,
632};
633
634static uint8_t trans_move_table[][3] = {
635 [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F },
636 [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F },
637 [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L },
638 [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R },
639 [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B },
640 [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B },
641 [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R },
642 [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L },
643 [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F },
644 [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F },
645 [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L },
646 [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R },
647 [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B },
648 [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B },
649 [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R },
650 [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L },
651 [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U },
652 [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U },
653 [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F },
654 [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F },
655 [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D },
656 [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D },
657 [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B },
658 [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B },
659 [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U },
660 [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U },
661 [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F },
662 [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F },
663 [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D },
664 [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D },
665 [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B },
666 [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B },
667 [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U },
668 [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U },
669 [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R },
670 [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L },
671 [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D },
672 [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D },
673 [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L },
674 [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R },
675 [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U },
676 [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U },
677 [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R },
678 [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L },
679 [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D },
680 [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D },
681 [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L },
682 [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R },
683};
684
685static uint8_t orientation_transition_table[][3] = {
686 [ORIENTATION_UF] = { ORIENTATION_FD, ORIENTATION_UR, ORIENTATION_LF },
687 [ORIENTATION_UR] = { ORIENTATION_RD, ORIENTATION_UB, ORIENTATION_FR },
688 [ORIENTATION_UB] = { ORIENTATION_BD, ORIENTATION_UL, ORIENTATION_RB },
689 [ORIENTATION_UL] = { ORIENTATION_LD, ORIENTATION_UF, ORIENTATION_BL },
690 [ORIENTATION_DF] = { ORIENTATION_FU, ORIENTATION_DL, ORIENTATION_RF },
691 [ORIENTATION_DR] = { ORIENTATION_RU, ORIENTATION_DF, ORIENTATION_BR },
692 [ORIENTATION_DB] = { ORIENTATION_BU, ORIENTATION_DR, ORIENTATION_LB },
693 [ORIENTATION_DL] = { ORIENTATION_LU, ORIENTATION_DB, ORIENTATION_FL },
694 [ORIENTATION_RF] = { ORIENTATION_FL, ORIENTATION_RD, ORIENTATION_UF },
695 [ORIENTATION_RD] = { ORIENTATION_DL, ORIENTATION_RB, ORIENTATION_FD },
696 [ORIENTATION_RB] = { ORIENTATION_BL, ORIENTATION_RU, ORIENTATION_DB },
697 [ORIENTATION_RU] = { ORIENTATION_UL, ORIENTATION_RF, ORIENTATION_BU },
698 [ORIENTATION_LF] = { ORIENTATION_FR, ORIENTATION_LU, ORIENTATION_DF },
699 [ORIENTATION_LD] = { ORIENTATION_DR, ORIENTATION_LB, ORIENTATION_BD },
700 [ORIENTATION_LB] = { ORIENTATION_BR, ORIENTATION_LD, ORIENTATION_UB },
701 [ORIENTATION_LU] = { ORIENTATION_UR, ORIENTATION_LF, ORIENTATION_FU },
702 [ORIENTATION_FD] = { ORIENTATION_DB, ORIENTATION_FR, ORIENTATION_LD },
703 [ORIENTATION_FR] = { ORIENTATION_RB, ORIENTATION_FU, ORIENTATION_DR },
704 [ORIENTATION_FU] = { ORIENTATION_UB, ORIENTATION_FL, ORIENTATION_RU },
705 [ORIENTATION_FL] = { ORIENTATION_LB, ORIENTATION_FD, ORIENTATION_UL },
706 [ORIENTATION_BD] = { ORIENTATION_DF, ORIENTATION_BL, ORIENTATION_RD },
707 [ORIENTATION_BR] = { ORIENTATION_RF, ORIENTATION_BU, ORIENTATION_UR },
708 [ORIENTATION_BU] = { ORIENTATION_UF, ORIENTATION_BR, ORIENTATION_LU },
709 [ORIENTATION_BL] = { ORIENTATION_LF, ORIENTATION_BD, ORIENTATION_DL },
710};
711
712static struct {
713 uint8_t moves[3];
714 uint8_t rotations[6];
715} equivalent_move_table[] = {
716 [MOVE_U] = { { MOVE_U, UINT8_MAX }, {UINT8_MAX} },
717 [MOVE_U2] = { { MOVE_U2, UINT8_MAX }, {UINT8_MAX} },
718 [MOVE_U3] = { { MOVE_U3, UINT8_MAX }, {UINT8_MAX} },
719 [MOVE_D] = { { MOVE_D, UINT8_MAX }, {UINT8_MAX} },
720 [MOVE_D2] = { { MOVE_D2, UINT8_MAX }, {UINT8_MAX} },
721 [MOVE_D3] = { { MOVE_D3, UINT8_MAX }, {UINT8_MAX} },
722 [MOVE_R] = { { MOVE_R, UINT8_MAX }, {UINT8_MAX} },
723 [MOVE_R2] = { { MOVE_R2, UINT8_MAX }, {UINT8_MAX} },
724 [MOVE_R3] = { { MOVE_R3, UINT8_MAX }, {UINT8_MAX} },
725 [MOVE_L] = { { MOVE_L, UINT8_MAX }, {UINT8_MAX} },
726 [MOVE_L2] = { { MOVE_L2, UINT8_MAX }, {UINT8_MAX} },
727 [MOVE_L3] = { { MOVE_L3, UINT8_MAX }, {UINT8_MAX} },
728 [MOVE_F] = { { MOVE_F, UINT8_MAX }, {UINT8_MAX} },
729 [MOVE_F2] = { { MOVE_F2, UINT8_MAX }, {UINT8_MAX} },
730 [MOVE_F3] = { { MOVE_F3, UINT8_MAX }, {UINT8_MAX} },
731 [MOVE_B] = { { MOVE_B, UINT8_MAX }, {UINT8_MAX} },
732 [MOVE_B2] = { { MOVE_B2, UINT8_MAX }, {UINT8_MAX} },
733 [MOVE_B3] = { { MOVE_B3, UINT8_MAX }, {UINT8_MAX} },
734};
diff --git a/src/core/core.h b/src/core/core.h
index fce1751..b56106e 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -1,4 +1,5 @@
1#include "constant_cubes.h" 1#include "core_types.h"
2#include "constants.h"
2#include "cube.h" 3#include "cube.h"
3#include "moves.h" 4#include "moves.h"
4#include "transform.h" 5#include "transform.h"
diff --git a/src/core/core_types.h b/src/core/core_types.h
new file mode 100644
index 0000000..2ad8938
--- /dev/null
+++ b/src/core/core_types.h
@@ -0,0 +1,4 @@
1typedef struct {
2 cube_t cube;
3 uint8_t orientation;
4} oriented_cube_t;
diff --git a/src/core/cube.h b/src/core/cube.h
index a045e55..91bb284 100644
--- a/src/core/cube.h
+++ b/src/core/cube.h
@@ -1,17 +1,29 @@
1STATIC cube_t solvedcube(void); 1STATIC oriented_cube_t solvedcube(void);
2STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]); 2STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]);
3STATIC bool isconsistent(cube_t); 3STATIC bool isconsistent(oriented_cube_t);
4STATIC bool issolvable(cube_t); 4STATIC bool issolvable(oriented_cube_t);
5STATIC bool issolved(cube_t); 5STATIC bool issolved(oriented_cube_t);
6STATIC bool iserror(cube_t); 6STATIC bool iserror(oriented_cube_t);
7STATIC void getcube_fix(long long *, long long *, long long *, long long *); 7STATIC void getcube_fix(long long *, long long *, long long *, long long *);
8STATIC cube_t getcube(int64_t, int64_t, int64_t, int64_t); 8STATIC cube_t getcube(int64_t, int64_t, int64_t, int64_t);
9 9
10/* This is used only in tests, use SOLVED_CUBE directly everywhere else */ 10STATIC oriented_cube_t readcube(const char *);
11STATIC cube_t 11STATIC int64_t writecube(oriented_cube_t, size_t n, char [n]);
12STATIC uint8_t readco(const char *);
13STATIC uint8_t readcp(const char *);
14STATIC uint8_t readeo(const char *);
15STATIC uint8_t readep(const char *);
16
17STATIC uint8_t b32toedge(char);
18STATIC uint8_t b32tocorner(char);
19STATIC char edgetob32(uint8_t);
20STATIC char cornertob32(uint8_t);
21
22/* This is used only in tests, use SOLVED_ORIENTED_CUBE everywhere else */
23STATIC oriented_cube_t
12solvedcube(void) 24solvedcube(void)
13{ 25{
14 return SOLVED_CUBE; 26 return SOLVED_ORIENTED_CUBE;
15} 27}
16 28
17STATIC cube_t 29STATIC cube_t
@@ -24,12 +36,12 @@ cubefromarray(uint8_t c[static 8], uint8_t e[static 12])
24} 36}
25 37
26STATIC bool 38STATIC bool
27isconsistent(cube_t cube) 39isconsistent(oriented_cube_t cube)
28{ 40{
29 uint8_t i, p, e, piece, corner[8], edge[12]; 41 uint8_t i, p, e, piece, corner[8], edge[12];
30 bool found[12]; 42 bool found[12];
31 43
32 pieces(&cube, corner, edge); 44 pieces(&cube.cube, corner, edge);
33 45
34 for (i = 0; i < 12; i++) 46 for (i = 0; i < 12; i++)
35 found[i] = false; 47 found[i] = false;
@@ -63,25 +75,29 @@ isconsistent(cube_t cube)
63 if (!found[i]) 75 if (!found[i])
64 goto inconsistent_cp; 76 goto inconsistent_cp;
65 77
78 if (cube.orientation >= 24)
79 goto inconsistent_orientation;
80
66 return true; 81 return true;
67 82
68inconsistent_ep: 83inconsistent_ep:
69inconsistent_cp: 84inconsistent_cp:
70inconsistent_eo: 85inconsistent_eo:
71inconsistent_co: 86inconsistent_co:
72 /* We used to do more logging here, hence the 4 different labels */ 87inconsistent_orientation:
88 /* We used to do more logging here, hence the different labels */
73 return false; 89 return false;
74} 90}
75 91
76STATIC bool 92STATIC bool
77issolvable(cube_t cube) 93issolvable(oriented_cube_t cube)
78{ 94{
79 uint8_t i, eo, co, piece, edge[12], corner[8], ep[12], cp[8]; 95 uint8_t i, eo, co, piece, edge[12], corner[8], ep[12], cp[8];
80 96
81 DBG_ASSERT(isconsistent(cube), false, 97 DBG_ASSERT(isconsistent(cube), false,
82 "issolvable: cube is inconsistent\n"); 98 "issolvable: cube is inconsistent\n");
83 99
84 pieces(&cube, corner, edge); 100 pieces(&cube.cube, corner, edge);
85 for (i = 0; i < 12; i++) 101 for (i = 0; i < 12; i++)
86 ep[i] = edge[i] & PBITS; 102 ep[i] = edge[i] & PBITS;
87 for (i = 0; i < 8; i++) 103 for (i = 0; i < 8; i++)
@@ -120,15 +136,15 @@ issolvable_co:
120} 136}
121 137
122bool 138bool
123issolved(cube_t cube) 139issolved(oriented_cube_t cube)
124{ 140{
125 return equal(cube, SOLVED_CUBE); 141 return equal(cube.cube, SOLVED_CUBE);
126} 142}
127 143
128bool 144bool
129iserror(cube_t cube) 145iserror(oriented_cube_t cube)
130{ 146{
131 return equal(cube, ZERO_CUBE); 147 return equal(cube.cube, ZERO_CUBE);
132} 148}
133 149
134STATIC void 150STATIC void
@@ -175,21 +191,6 @@ getcube(int64_t ep, int64_t eo, int64_t cp, int64_t co)
175 return cubefromarray(carr, earr); 191 return cubefromarray(carr, earr);
176} 192}
177 193
178
179/******************************************************************************/
180
181STATIC cube_t readcube(const char *);
182STATIC int64_t writecube(cube_t, size_t n, char [n]);
183STATIC uint8_t readco(const char *);
184STATIC uint8_t readcp(const char *);
185STATIC uint8_t readeo(const char *);
186STATIC uint8_t readep(const char *);
187
188STATIC uint8_t b32toedge(char);
189STATIC uint8_t b32tocorner(char);
190STATIC char edgetob32(uint8_t);
191STATIC char cornertob32(uint8_t);
192
193STATIC uint8_t 194STATIC uint8_t
194readco(const char *str) 195readco(const char *str)
195{ 196{
@@ -243,11 +244,11 @@ readep(const char *str)
243 return UINT8_ERROR; 244 return UINT8_ERROR;
244} 245}
245 246
246STATIC cube_t 247STATIC oriented_cube_t
247readcube(const char *buf) 248readcube(const char *buf)
248{ 249{
249 int i; 250 int i;
250 uint8_t c[8], e[12]; 251 uint8_t c[8], e[12], orientation;
251 252
252 for (i = 0; i < 8; i++) { 253 for (i = 0; i < 8; i++) {
253 c[i] = b32tocorner(buf[i]); 254 c[i] = b32tocorner(buf[i]);
@@ -258,14 +259,14 @@ readcube(const char *buf)
258 } else { 259 } else {
259 LOG("(char '%c')\n", buf[i]); 260 LOG("(char '%c')\n", buf[i]);
260 } 261 }
261 return ZERO_CUBE; 262 return ZERO_ORIENTED_CUBE;
262 } 263 }
263 } 264 }
264 265
265 if (buf[8] != '=') { 266 if (buf[8] != '=') {
266 LOG("Error reading separator: a single '=' " 267 LOG("Error reading separator: a single '=' "
267 "must be used to separate edges and corners\n"); 268 "must be used to separate edges and corners\n");
268 return ZERO_CUBE; 269 return ZERO_ORIENTED_CUBE;
269 } 270 }
270 271
271 for (i = 0; i < 12; i++) { 272 for (i = 0; i < 12; i++) {
@@ -277,15 +278,25 @@ readcube(const char *buf)
277 } else { 278 } else {
278 LOG("(char '%c')\n", buf[i+9]); 279 LOG("(char '%c')\n", buf[i+9]);
279 } 280 }
280 return ZERO_CUBE; 281 return ZERO_ORIENTED_CUBE;
281 } 282 }
282 } 283 }
283 284
284 return cubefromarray(c, e); 285 orientation = (uint8_t)(buf[22] - 'A');
286 if (orientation >= 24) {
287 LOG("Error reading orientation: impossible value %" PRIu8
288 " (%c)\n", orientation, buf[22]);
289 return ZERO_ORIENTED_CUBE;
290 }
291
292 return (oriented_cube_t) {
293 .cube = cubefromarray(c, e),
294 .orientation = orientation
295 };
285} 296}
286 297
287STATIC int64_t 298STATIC int64_t
288writecube(cube_t cube, size_t buf_size, char buf[buf_size]) 299writecube(oriented_cube_t cube, size_t buf_size, char buf[buf_size])
289{ 300{
290 int i; 301 int i;
291 uint8_t corner[8], edge[12]; 302 uint8_t corner[8], edge[12];
@@ -297,7 +308,7 @@ writecube(cube_t cube, size_t buf_size, char buf[buf_size])
297 return NISSY_ERROR_BUFFER_SIZE; 308 return NISSY_ERROR_BUFFER_SIZE;
298 } 309 }
299 310
300 pieces(&cube, corner, edge); 311 pieces(&cube.cube, corner, edge);
301 312
302 for (i = 0; i < 8; i++) 313 for (i = 0; i < 8; i++)
303 buf[i] = cornertob32(corner[i]); 314 buf[i] = cornertob32(corner[i]);
@@ -307,9 +318,8 @@ writecube(cube_t cube, size_t buf_size, char buf[buf_size])
307 for (i = 0; i < 12; i++) 318 for (i = 0; i < 12; i++)
308 buf[i+9] = edgetob32(edge[i]); 319 buf[i+9] = edgetob32(edge[i]);
309 320
310/* TODO */
311 buf[21] = '='; 321 buf[21] = '=';
312 buf[22] = 'A'; 322 buf[22] = (char)cube.orientation + 'A';
313 buf[23] = '\0'; 323 buf[23] = '\0';
314 324
315 return NISSY_OK; 325 return NISSY_OK;
@@ -351,4 +361,3 @@ cornertob32(uint8_t corner)
351 361
352 return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26); 362 return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26);
353} 363}
354/******************************************************************************/
diff --git a/src/core/moves.h b/src/core/moves.h
index bbc8e7c..8ed267d 100644
--- a/src/core/moves.h
+++ b/src/core/moves.h
@@ -21,7 +21,7 @@ STATIC uint8_t inverse_move(uint8_t);
21STATIC void sortparallel_moves(size_t n, uint8_t [n]); 21STATIC void sortparallel_moves(size_t n, uint8_t [n]);
22STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]); 22STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]);
23 23
24STATIC cube_t applymoves(cube_t, const char *); 24STATIC oriented_cube_t applymoves(oriented_cube_t, const char *);
25 25
26#define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \ 26#define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \
27 RET_ERROR, ARG_ACTION) \ 27 RET_ERROR, ARG_ACTION) \
@@ -335,17 +335,17 @@ are_lastmoves_singlecw(size_t n, const uint8_t moves[n])
335 return isbase(moves[n-1]) && (!two || isbase(moves[n-2])); 335 return isbase(moves[n-1]) && (!two || isbase(moves[n-2]));
336} 336}
337 337
338STATIC cube_t 338STATIC oriented_cube_t
339applymoves(cube_t cube, const char *buf) 339applymoves(oriented_cube_t cube, const char *buf)
340{ 340{
341 int c; 341 int c;
342 uint8_t m; 342 uint8_t m;
343 343
344 DBG_ASSERT(isconsistent(cube), ZERO_CUBE, 344 DBG_ASSERT(isconsistent(cube), ZERO_ORIENTED_CUBE,
345 "move error: inconsistent cube\n"); 345 "move error: inconsistent cube\n");
346 346
347 FOREACH_READMOVE(buf, m, c, -1, ZERO_CUBE, 347 FOREACH_READMOVE(buf, m, c, -1, ZERO_ORIENTED_CUBE,
348 cube = move(cube, m); 348 cube.cube = move(cube.cube, m);
349 ) 349 )
350 350
351 return cube; 351 return cube;
diff --git a/src/core/transform.h b/src/core/transform.h
index 28b8d93..763a4ae 100644
--- a/src/core/transform.h
+++ b/src/core/transform.h
@@ -23,7 +23,7 @@ STATIC void writetrans(uint8_t, char [static NISSY_SIZE_TRANSFORMATION]);
23STATIC cube_t transform_edges(cube_t, uint8_t); 23STATIC cube_t transform_edges(cube_t, uint8_t);
24STATIC cube_t transform_corners(cube_t, uint8_t); 24STATIC cube_t transform_corners(cube_t, uint8_t);
25STATIC cube_t transform(cube_t, uint8_t); 25STATIC cube_t transform(cube_t, uint8_t);
26STATIC cube_t applytrans(cube_t, const char *); 26STATIC oriented_cube_t applytrans(oriented_cube_t, const char *);
27STATIC_INLINE uint8_t inverse_trans(uint8_t); 27STATIC_INLINE uint8_t inverse_trans(uint8_t);
28STATIC uint8_t transform_move(uint8_t, uint8_t); 28STATIC uint8_t transform_move(uint8_t, uint8_t);
29STATIC uint64_t symmetry_mask(cube_t); 29STATIC uint64_t symmetry_mask(cube_t);
@@ -367,12 +367,12 @@ transform(cube_t c, uint8_t t)
367 } 367 }
368} 368}
369 369
370STATIC cube_t 370STATIC oriented_cube_t
371applytrans(cube_t cube, const char *buf) 371applytrans(oriented_cube_t cube, const char *buf)
372{ 372{
373 uint8_t t; 373 uint8_t t;
374 374
375 DBG_ASSERT(isconsistent(cube), ZERO_CUBE, 375 DBG_ASSERT(isconsistent(cube), ZERO_ORIENTED_CUBE,
376 "transformation error: inconsistent cube\n"); 376 "transformation error: inconsistent cube\n");
377 377
378 t = readtrans(buf); 378 t = readtrans(buf);
@@ -380,7 +380,10 @@ applytrans(cube_t cube, const char *buf)
380 if (t == UINT8_ERROR) 380 if (t == UINT8_ERROR)
381 LOG("Unknown transformation: %s\n", buf); 381 LOG("Unknown transformation: %s\n", buf);
382 382
383 return transform(cube, t); 383 return (oriented_cube_t){
384 .cube = transform(cube.cube, t),
385 .orientation = cube.orientation
386 };
384} 387}
385 388
386STATIC_INLINE uint8_t 389STATIC_INLINE uint8_t
diff --git a/src/nissy.c b/src/nissy.c
index 8aa0334..27f2b35 100644
--- a/src/nissy.c
+++ b/src/nissy.c
@@ -17,7 +17,7 @@ long long parse_h48_solver(
17STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); 17STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]);
18STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], 18STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN],
19 const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); 19 const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t);
20STATIC long long write_result(cube_t, char [static NISSY_SIZE_CUBE]); 20STATIC long long write_result(oriented_cube_t, char [static NISSY_SIZE_CUBE]);
21STATIC size_t my_strnlen(const char *, size_t); 21STATIC size_t my_strnlen(const char *, size_t);
22STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); 22STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]);
23STATIC long long nissy_gendata_unsafe( 23STATIC long long nissy_gendata_unsafe(
@@ -117,7 +117,7 @@ distribution_equal(
117} 117}
118 118
119STATIC long long 119STATIC long long
120write_result(cube_t cube, char result[static NISSY_SIZE_CUBE]) 120write_result(oriented_cube_t cube, char result[static NISSY_SIZE_CUBE])
121{ 121{
122 writecube(cube, NISSY_SIZE_CUBE, result); 122 writecube(cube, NISSY_SIZE_CUBE, result);
123 123
@@ -142,53 +142,12 @@ my_strnlen(const char *str, size_t maxlen)
142} 142}
143 143
144long long 144long long
145nissy_compose(
146 const char cube[static NISSY_SIZE_CUBE],
147 const char permutation[static NISSY_SIZE_CUBE],
148 char result[static NISSY_SIZE_CUBE]
149)
150{
151 cube_t c, p, res;
152 long long err;
153
154 c = readcube(cube);
155
156 if (!isconsistent(c)) {
157 LOG("[compose] Error: the given cube is invalid\n");
158 err = NISSY_ERROR_INVALID_CUBE;
159 goto nissy_compose_error;
160 }
161
162 p = readcube(permutation);
163
164 if (!isconsistent(p)) {
165 LOG("[compose] Error: given permutation is invalid\n");
166 err = NISSY_ERROR_INVALID_CUBE;
167 goto nissy_compose_error;
168 }
169
170 res = compose(c, p);
171
172 if (!isconsistent(res)) {
173 LOG("[compose] Unknown error: resulting cube is invalid\n");
174 err = NISSY_ERROR_UNKNOWN;
175 goto nissy_compose_error;
176 }
177
178 return write_result(res, result);
179
180nissy_compose_error:
181 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result);
182 return err;
183}
184
185long long
186nissy_inverse( 145nissy_inverse(
187 const char cube[static NISSY_SIZE_CUBE], 146 const char cube[static NISSY_SIZE_CUBE],
188 char result[static NISSY_SIZE_CUBE] 147 char result[static NISSY_SIZE_CUBE]
189) 148)
190{ 149{
191 cube_t c, res; 150 oriented_cube_t c, res;
192 long long err; 151 long long err;
193 152
194 c = readcube(cube); 153 c = readcube(cube);
@@ -199,7 +158,10 @@ nissy_inverse(
199 goto nissy_inverse_error; 158 goto nissy_inverse_error;
200 } 159 }
201 160
202 res = inverse(c); 161 res = (oriented_cube_t) {
162 .cube = inverse(c.cube),
163 .orientation = c.orientation
164 };
203 165
204 if (!isconsistent(res)) { 166 if (!isconsistent(res)) {
205 LOG("[inverse] Unknown error: inverted cube is invalid\n"); 167 LOG("[inverse] Unknown error: inverted cube is invalid\n");
@@ -210,7 +172,7 @@ nissy_inverse(
210 return write_result(res, result); 172 return write_result(res, result);
211 173
212nissy_inverse_error: 174nissy_inverse_error:
213 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 175 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
214 return err; 176 return err;
215} 177}
216 178
@@ -221,7 +183,7 @@ nissy_applymoves(
221 char result[static NISSY_SIZE_CUBE] 183 char result[static NISSY_SIZE_CUBE]
222) 184)
223{ 185{
224 cube_t c, res; 186 oriented_cube_t c, res;
225 long long err; 187 long long err;
226 188
227 if (moves == NULL) { 189 if (moves == NULL) {
@@ -249,7 +211,7 @@ nissy_applymoves(
249 return write_result(res, result); 211 return write_result(res, result);
250 212
251nissy_applymoves_error: 213nissy_applymoves_error:
252 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 214 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
253 return err; 215 return err;
254} 216}
255 217
@@ -260,7 +222,7 @@ nissy_applytrans(
260 char result[static NISSY_SIZE_CUBE] 222 char result[static NISSY_SIZE_CUBE]
261) 223)
262{ 224{
263 cube_t c, res; 225 oriented_cube_t c, res;
264 long long err; 226 long long err;
265 227
266 c = readcube(cube); 228 c = readcube(cube);
@@ -282,7 +244,7 @@ nissy_applytrans(
282 return write_result(res, result); 244 return write_result(res, result);
283 245
284nissy_applytrans_error: 246nissy_applytrans_error:
285 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 247 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
286 return err; 248 return err;
287} 249}
288 250
@@ -310,13 +272,14 @@ nissy_getcube(
310 272
311 c = getcube(ep, eo, cp, co); 273 c = getcube(ep, eo, cp, co);
312 274
313 if (!isconsistent(c)) { 275 if (!isconsistent((oriented_cube_t){ .cube = c, .orientation = 0 })) {
314 LOG("[getcube] Error: could not get cube with ep=%lld, " 276 LOG("[getcube] Error: could not get cube with ep=%lld, "
315 "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); 277 "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co);
316 return NISSY_ERROR_OPTIONS; 278 return NISSY_ERROR_OPTIONS;
317 } 279 }
318 280
319 return write_result(c, result); 281/* TODO: should support orientation */
282 return write_result((oriented_cube_t){.cube = c, .orientation = 0}, result);
320} 283}
321 284
322long long 285long long
@@ -497,6 +460,7 @@ nissy_solve(
497 long long stats[static NISSY_SIZE_SOLVE_STATS] 460 long long stats[static NISSY_SIZE_SOLVE_STATS]
498) 461)
499{ 462{
463 oriented_cube_t oc;
500 cube_t c; 464 cube_t c;
501 long long parse_ret; 465 long long parse_ret;
502 uint8_t h, k; 466 uint8_t h, k;
@@ -507,14 +471,17 @@ nissy_solve(
507 return NISSY_ERROR_NULL_POINTER; 471 return NISSY_ERROR_NULL_POINTER;
508 } 472 }
509 473
510 c = readcube(cube); 474 oc = readcube(cube);
475 c = oc.cube;
511 476
512 if (!isconsistent(c)) { 477/* TODO: solve should handle oriented cubes */
478
479 if (!isconsistent(oc)) {
513 LOG("[solve] Error: cube is invalid\n"); 480 LOG("[solve] Error: cube is invalid\n");
514 return NISSY_ERROR_INVALID_CUBE; 481 return NISSY_ERROR_INVALID_CUBE;
515 } 482 }
516 483
517 if (!issolvable(c)) { 484 if (!issolvable((oriented_cube_t){ .cube = c, .orientation = 0})) {
518/* TODO: this is step-dependent */ 485/* TODO: this is step-dependent */
519 LOG("[solve] Error: cube is not solvable\n"); 486 LOG("[solve] Error: cube is not solvable\n");
520 return NISSY_ERROR_UNSOLVABLE_CUBE; 487 return NISSY_ERROR_UNSOLVABLE_CUBE;
diff --git a/src/nissy.h b/src/nissy.h
index 4b2d1eb..e7ae50e 100644
--- a/src/nissy.h
+++ b/src/nissy.h
@@ -126,31 +126,6 @@ of this kind to sebastiano@tronto.net. Thanks!
126/* Library functions *********************************************************/ 126/* Library functions *********************************************************/
127 127
128/* 128/*
129Apply the secod argument as a permutation on the first argument.
130
131Parameters:
132 cube - The first cube.
133 permutation - The second cub. This cube is treated as a permutation and
134 "applied" to the first cube.
135 result - The return parameter for the resulting cube.
136
137Return values:
138 NISSY_OK - The cubes were composed succesfully.
139 NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
140 either because at least on of the given cubes
141 was not solvable, or due to an unknown internal
142 error.
143 NISSY_ERROR_INVALID_CUBE - At least one of the given cubes is invalid.
144 NISSY_ERROR_UNKNOWN - An unknown error occurred.
145*/
146long long
147nissy_compose(
148 const char cube[static NISSY_SIZE_CUBE],
149 const char permutation[static NISSY_SIZE_CUBE],
150 char result[static NISSY_SIZE_CUBE]
151);
152
153/*
154Compute the inverse of the given cube. 129Compute the inverse of the given cube.
155 130
156Parameters: 131Parameters:
diff --git a/src/solvers/h48/solve.h b/src/solvers/h48/solve.h
index cf7095c..d19309b 100644
--- a/src/solvers/h48/solve.h
+++ b/src/solvers/h48/solve.h
@@ -155,7 +155,7 @@ solve_h48_dfs(dfsarg_solve_h48_t arg[static 1])
155 bool ulbi, ulbn; 155 bool ulbi, ulbn;
156 cube_t backup_cube, backup_inverse; 156 cube_t backup_cube, backup_inverse;
157 157
158 if (issolved(arg->cube)) { 158 if (equal(arg->cube, SOLVED_CUBE)) {
159 nm = arg->solution_moves->nmoves 159 nm = arg->solution_moves->nmoves
160 + arg->solution_moves->npremoves; 160 + arg->solution_moves->npremoves;
161 if (arg->target_depth != nm) 161 if (arg->target_depth != nm)
@@ -282,7 +282,7 @@ solve_h48_maketasks(
282 cube_t backup_cube; 282 cube_t backup_cube;
283 solution_moves_t moves; 283 solution_moves_t moves;
284 284
285 if (issolved(maketasks_arg->cube)) { 285 if (equal(maketasks_arg->cube, SOLVED_CUBE)) {
286 if (maketasks_arg->nmoves > maketasks_arg->maxmoves || 286 if (maketasks_arg->nmoves > maketasks_arg->maxmoves ||
287 maketasks_arg->nmoves < maketasks_arg->minmoves || 287 maketasks_arg->nmoves < maketasks_arg->minmoves ||
288 solutions_done(solve_arg->solution_list, 288 solutions_done(solve_arg->solution_list,
diff --git a/src/utils/constants.h b/src/utils/constants.h
index d6d48cc..da0a813 100644
--- a/src/utils/constants.h
+++ b/src/utils/constants.h
@@ -9,6 +9,8 @@
9#define COMB_12_4 INT64_C(495) 9#define COMB_12_4 INT64_C(495)
10#define COMB_8_4 INT64_C(70) 10#define COMB_8_4 INT64_C(70)
11 11
12#define UINT8_ERROR UINT8_MAX
13
12STATIC int64_t binomial[12][12] = { 14STATIC int64_t binomial[12][12] = {
13 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 15 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
14 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -23,443 +25,3 @@ STATIC int64_t binomial[12][12] = {
23 {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0}, 25 {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0},
24 {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1}, 26 {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1},
25}; 27};
26
27#define MOVE_U UINT8_C(0)
28#define MOVE_U2 UINT8_C(1)
29#define MOVE_U3 UINT8_C(2)
30#define MOVE_D UINT8_C(3)
31#define MOVE_D2 UINT8_C(4)
32#define MOVE_D3 UINT8_C(5)
33#define MOVE_R UINT8_C(6)
34#define MOVE_R2 UINT8_C(7)
35#define MOVE_R3 UINT8_C(8)
36#define MOVE_L UINT8_C(9)
37#define MOVE_L2 UINT8_C(10)
38#define MOVE_L3 UINT8_C(11)
39#define MOVE_F UINT8_C(12)
40#define MOVE_F2 UINT8_C(13)
41#define MOVE_F3 UINT8_C(14)
42#define MOVE_B UINT8_C(15)
43#define MOVE_B2 UINT8_C(16)
44#define MOVE_B3 UINT8_C(17)
45
46#define MOVE_Uw UINT8_C(18)
47#define MOVE_Uw2 UINT8_C(19)
48#define MOVE_Uw3 UINT8_C(20)
49#define MOVE_Dw UINT8_C(21)
50#define MOVE_Dw2 UINT8_C(22)
51#define MOVE_Dw3 UINT8_C(23)
52#define MOVE_Rw UINT8_C(24)
53#define MOVE_Rw2 UINT8_C(25)
54#define MOVE_Rw3 UINT8_C(26)
55#define MOVE_Lw UINT8_C(27)
56#define MOVE_Lw2 UINT8_C(28)
57#define MOVE_Lw3 UINT8_C(29)
58#define MOVE_Fw UINT8_C(30)
59#define MOVE_Fw2 UINT8_C(31)
60#define MOVE_Fw3 UINT8_C(32)
61#define MOVE_Bw UINT8_C(33)
62#define MOVE_Bw2 UINT8_C(34)
63#define MOVE_Bw3 UINT8_C(35)
64
65#define MOVE_M UINT8_C(36)
66#define MOVE_M2 UINT8_C(37)
67#define MOVE_M3 UINT8_C(38)
68#define MOVE_S UINT8_C(39)
69#define MOVE_S2 UINT8_C(40)
70#define MOVE_S3 UINT8_C(41)
71#define MOVE_E UINT8_C(42)
72#define MOVE_E2 UINT8_C(43)
73#define MOVE_E3 UINT8_C(44)
74
75#define MOVE_x UINT8_C(45)
76#define MOVE_x2 UINT8_C(46)
77#define MOVE_x3 UINT8_C(47)
78#define MOVE_y UINT8_C(48)
79#define MOVE_y2 UINT8_C(49)
80#define MOVE_y3 UINT8_C(50)
81#define MOVE_z UINT8_C(51)
82#define MOVE_z2 UINT8_C(52)
83#define MOVE_z3 UINT8_C(53)
84
85#define TRANS_UFr UINT8_C(0)
86#define TRANS_ULr UINT8_C(1)
87#define TRANS_UBr UINT8_C(2)
88#define TRANS_URr UINT8_C(3)
89#define TRANS_DFr UINT8_C(4)
90#define TRANS_DLr UINT8_C(5)
91#define TRANS_DBr UINT8_C(6)
92#define TRANS_DRr UINT8_C(7)
93#define TRANS_RUr UINT8_C(8)
94#define TRANS_RFr UINT8_C(9)
95#define TRANS_RDr UINT8_C(10)
96#define TRANS_RBr UINT8_C(11)
97#define TRANS_LUr UINT8_C(12)
98#define TRANS_LFr UINT8_C(13)
99#define TRANS_LDr UINT8_C(14)
100#define TRANS_LBr UINT8_C(15)
101#define TRANS_FUr UINT8_C(16)
102#define TRANS_FRr UINT8_C(17)
103#define TRANS_FDr UINT8_C(18)
104#define TRANS_FLr UINT8_C(19)
105#define TRANS_BUr UINT8_C(20)
106#define TRANS_BRr UINT8_C(21)
107#define TRANS_BDr UINT8_C(22)
108#define TRANS_BLr UINT8_C(23)
109
110#define TRANS_UFm UINT8_C(24)
111#define TRANS_ULm UINT8_C(25)
112#define TRANS_UBm UINT8_C(26)
113#define TRANS_URm UINT8_C(27)
114#define TRANS_DFm UINT8_C(28)
115#define TRANS_DLm UINT8_C(29)
116#define TRANS_DBm UINT8_C(30)
117#define TRANS_DRm UINT8_C(31)
118#define TRANS_RUm UINT8_C(32)
119#define TRANS_RFm UINT8_C(33)
120#define TRANS_RDm UINT8_C(34)
121#define TRANS_RBm UINT8_C(35)
122#define TRANS_LUm UINT8_C(36)
123#define TRANS_LFm UINT8_C(37)
124#define TRANS_LDm UINT8_C(38)
125#define TRANS_LBm UINT8_C(39)
126#define TRANS_FUm UINT8_C(40)
127#define TRANS_FRm UINT8_C(41)
128#define TRANS_FDm UINT8_C(42)
129#define TRANS_FLm UINT8_C(43)
130#define TRANS_BUm UINT8_C(44)
131#define TRANS_BRm UINT8_C(45)
132#define TRANS_BDm UINT8_C(46)
133#define TRANS_BLm UINT8_C(47)
134
135#define AXIS_UD UINT8_C(0)
136#define AXIS_RL UINT8_C(1)
137#define AXIS_FB UINT8_C(2)
138
139#define NMOVES (1+MOVE_B3)
140#define NMOVES_EXTENDED (1+MOVE_z3)
141#define NTRANS (1+TRANS_BLm)
142
143#define MM_ALLMOVES UINT32_C(0x3FFFF)
144#define MM_NOHALFTURNS UINT32_C(0x2DB6D)
145#define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m))
146#define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m))
147#define MM_EO (\
148 MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
149 MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\
150 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
151#define MM_DR (\
152 MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
153 MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\
154 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
155#define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS)
156
157#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
158#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t))
159#define TM_UDRLFIX (\
160 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \
161 TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \
162 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm))
163#define TM_UDFIX (\
164 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
165 TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
166 TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
167 TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
168 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
169 TM_SINGLE(TRANS_DLm))
170
171#define CORNER_UFR UINT8_C(0)
172#define CORNER_UBL UINT8_C(1)
173#define CORNER_DFL UINT8_C(2)
174#define CORNER_DBR UINT8_C(3)
175#define CORNER_UFL UINT8_C(4)
176#define CORNER_UBR UINT8_C(5)
177#define CORNER_DFR UINT8_C(6)
178#define CORNER_DBL UINT8_C(7)
179
180#define EDGE_UF UINT8_C(0)
181#define EDGE_UB UINT8_C(1)
182#define EDGE_DB UINT8_C(2)
183#define EDGE_DF UINT8_C(3)
184#define EDGE_UR UINT8_C(4)
185#define EDGE_UL UINT8_C(5)
186#define EDGE_DL UINT8_C(6)
187#define EDGE_DR UINT8_C(7)
188#define EDGE_FR UINT8_C(8)
189#define EDGE_FL UINT8_C(9)
190#define EDGE_BL UINT8_C(10)
191#define EDGE_BR UINT8_C(11)
192
193#define EOSHIFT UINT8_C(4)
194#define COSHIFT UINT8_C(5)
195
196#define PBITS UINT8_C(0xF)
197#define ESEPBIT_1 UINT8_C(0x4)
198#define ESEPBIT_2 UINT8_C(0x8)
199#define CSEPBIT UINT8_C(0x4)
200#define EOBIT UINT8_C(0x10)
201#define COBITS UINT8_C(0xF0)
202#define COBITS_2 UINT8_C(0x60)
203#define CTWIST_CW UINT8_C(0x20)
204#define CTWIST_CCW UINT8_C(0x40)
205#define EFLIP UINT8_C(0x10)
206#define UINT8_ERROR UINT8_MAX
207
208STATIC const uint32_t allowedmask[] = {
209 UINT32_C(0x3FFF8),
210 UINT32_C(0x3FFC0),
211 UINT32_C(0x3FE3F),
212 UINT32_C(0x3F03F),
213 UINT32_C(0x38FFF),
214 UINT32_C(0x00FFF)
215};
216
217STATIC const char *cornerstr[] = {
218 [CORNER_UFR] = "UFR",
219 [CORNER_UBL] = "UBL",
220 [CORNER_DFL] = "DFL",
221 [CORNER_DBR] = "DBR",
222 [CORNER_UFL] = "UFL",
223 [CORNER_UBR] = "UBR",
224 [CORNER_DFR] = "DFR",
225 [CORNER_DBL] = "DBL"
226};
227
228STATIC const char *cornerstralt[] = {
229 [CORNER_UFR] = "URF",
230 [CORNER_UBL] = "ULB",
231 [CORNER_DFL] = "DLF",
232 [CORNER_DBR] = "DRB",
233 [CORNER_UFL] = "ULF",
234 [CORNER_UBR] = "URB",
235 [CORNER_DFR] = "DRF",
236 [CORNER_DBL] = "DLB"
237};
238
239STATIC const char *edgestr[] = {
240 [EDGE_UF] = "UF",
241 [EDGE_UB] = "UB",
242 [EDGE_DB] = "DB",
243 [EDGE_DF] = "DF",
244 [EDGE_UR] = "UR",
245 [EDGE_UL] = "UL",
246 [EDGE_DL] = "DL",
247 [EDGE_DR] = "DR",
248 [EDGE_FR] = "FR",
249 [EDGE_FL] = "FL",
250 [EDGE_BL] = "BL",
251 [EDGE_BR] = "BR"
252};
253
254STATIC const char *movestr[] = {
255 [MOVE_U] = "U",
256 [MOVE_U2] = "U2",
257 [MOVE_U3] = "U'",
258 [MOVE_D] = "D",
259 [MOVE_D2] = "D2",
260 [MOVE_D3] = "D'",
261 [MOVE_R] = "R",
262 [MOVE_R2] = "R2",
263 [MOVE_R3] = "R'",
264 [MOVE_L] = "L",
265 [MOVE_L2] = "L2",
266 [MOVE_L3] = "L'",
267 [MOVE_F] = "F",
268 [MOVE_F2] = "F2",
269 [MOVE_F3] = "F'",
270 [MOVE_B] = "B",
271 [MOVE_B2] = "B2",
272 [MOVE_B3] = "B'",
273
274 [MOVE_Uw] = "Uw",
275 [MOVE_Uw2] = "Uw2",
276 [MOVE_Uw3] = "Uw'",
277 [MOVE_Dw] = "Dw",
278 [MOVE_Dw2] = "Dw2",
279 [MOVE_Dw3] = "Dw'",
280 [MOVE_Rw] = "Rw",
281 [MOVE_Rw2] = "Rw2",
282 [MOVE_Rw3] = "Rw'",
283 [MOVE_Lw] = "Lw",
284 [MOVE_Lw2] = "Lw2",
285 [MOVE_Lw3] = "Lw'",
286 [MOVE_Fw] = "Fw",
287 [MOVE_Fw2] = "Fw2",
288 [MOVE_Fw3] = "Fw'",
289 [MOVE_Bw] = "Bw",
290 [MOVE_Bw2] = "Bw2",
291 [MOVE_Bw3] = "Bw'",
292
293 [MOVE_M] = "M",
294 [MOVE_M2] = "M2",
295 [MOVE_M3] = "M'",
296 [MOVE_S] = "S",
297 [MOVE_S2] = "S2",
298 [MOVE_S3] = "S'",
299 [MOVE_E] = "E",
300 [MOVE_E2] = "E2",
301 [MOVE_E3] = "E'",
302
303 [MOVE_x] = "x",
304 [MOVE_x2] = "x2",
305 [MOVE_x3] = "x'",
306 [MOVE_y] = "y",
307 [MOVE_y2] = "y2",
308 [MOVE_y3] = "y'",
309 [MOVE_z] = "z",
310 [MOVE_z2] = "z2",
311 [MOVE_z3] = "z'",
312};
313
314STATIC const char *transstr[] = {
315 [TRANS_UFr] = "rotation UF",
316 [TRANS_UFm] = "mirrored UF",
317 [TRANS_ULr] = "rotation UL",
318 [TRANS_ULm] = "mirrored UL",
319 [TRANS_UBr] = "rotation UB",
320 [TRANS_UBm] = "mirrored UB",
321 [TRANS_URr] = "rotation UR",
322 [TRANS_URm] = "mirrored UR",
323 [TRANS_DFr] = "rotation DF",
324 [TRANS_DFm] = "mirrored DF",
325 [TRANS_DLr] = "rotation DL",
326 [TRANS_DLm] = "mirrored DL",
327 [TRANS_DBr] = "rotation DB",
328 [TRANS_DBm] = "mirrored DB",
329 [TRANS_DRr] = "rotation DR",
330 [TRANS_DRm] = "mirrored DR",
331 [TRANS_RUr] = "rotation RU",
332 [TRANS_RUm] = "mirrored RU",
333 [TRANS_RFr] = "rotation RF",
334 [TRANS_RFm] = "mirrored RF",
335 [TRANS_RDr] = "rotation RD",
336 [TRANS_RDm] = "mirrored RD",
337 [TRANS_RBr] = "rotation RB",
338 [TRANS_RBm] = "mirrored RB",
339 [TRANS_LUr] = "rotation LU",
340 [TRANS_LUm] = "mirrored LU",
341 [TRANS_LFr] = "rotation LF",
342 [TRANS_LFm] = "mirrored LF",
343 [TRANS_LDr] = "rotation LD",
344 [TRANS_LDm] = "mirrored LD",
345 [TRANS_LBr] = "rotation LB",
346 [TRANS_LBm] = "mirrored LB",
347 [TRANS_FUr] = "rotation FU",
348 [TRANS_FUm] = "mirrored FU",
349 [TRANS_FRr] = "rotation FR",
350 [TRANS_FRm] = "mirrored FR",
351 [TRANS_FDr] = "rotation FD",
352 [TRANS_FDm] = "mirrored FD",
353 [TRANS_FLr] = "rotation FL",
354 [TRANS_FLm] = "mirrored FL",
355 [TRANS_BUr] = "rotation BU",
356 [TRANS_BUm] = "mirrored BU",
357 [TRANS_BRr] = "rotation BR",
358 [TRANS_BRm] = "mirrored BR",
359 [TRANS_BDr] = "rotation BD",
360 [TRANS_BDm] = "mirrored BD",
361 [TRANS_BLr] = "rotation BL",
362 [TRANS_BLm] = "mirrored BL",
363};
364
365static uint8_t inverse_trans_table[48] = {
366 [TRANS_UFr] = TRANS_UFr,
367 [TRANS_UFm] = TRANS_UFm,
368 [TRANS_ULr] = TRANS_URr,
369 [TRANS_ULm] = TRANS_ULm,
370 [TRANS_UBr] = TRANS_UBr,
371 [TRANS_UBm] = TRANS_UBm,
372 [TRANS_URr] = TRANS_ULr,
373 [TRANS_URm] = TRANS_URm,
374 [TRANS_DFr] = TRANS_DFr,
375 [TRANS_DFm] = TRANS_DFm,
376 [TRANS_DLr] = TRANS_DLr,
377 [TRANS_DLm] = TRANS_DRm,
378 [TRANS_DBr] = TRANS_DBr,
379 [TRANS_DBm] = TRANS_DBm,
380 [TRANS_DRr] = TRANS_DRr,
381 [TRANS_DRm] = TRANS_DLm,
382 [TRANS_RUr] = TRANS_FRr,
383 [TRANS_RUm] = TRANS_FLm,
384 [TRANS_RFr] = TRANS_LFr,
385 [TRANS_RFm] = TRANS_RFm,
386 [TRANS_RDr] = TRANS_BLr,
387 [TRANS_RDm] = TRANS_BRm,
388 [TRANS_RBr] = TRANS_RBr,
389 [TRANS_RBm] = TRANS_LBm,
390 [TRANS_LUr] = TRANS_FLr,
391 [TRANS_LUm] = TRANS_FRm,
392 [TRANS_LFr] = TRANS_RFr,
393 [TRANS_LFm] = TRANS_LFm,
394 [TRANS_LDr] = TRANS_BRr,
395 [TRANS_LDm] = TRANS_BLm,
396 [TRANS_LBr] = TRANS_LBr,
397 [TRANS_LBm] = TRANS_RBm,
398 [TRANS_FUr] = TRANS_FUr,
399 [TRANS_FUm] = TRANS_FUm,
400 [TRANS_FRr] = TRANS_RUr,
401 [TRANS_FRm] = TRANS_LUm,
402 [TRANS_FDr] = TRANS_BUr,
403 [TRANS_FDm] = TRANS_BUm,
404 [TRANS_FLr] = TRANS_LUr,
405 [TRANS_FLm] = TRANS_RUm,
406 [TRANS_BUr] = TRANS_FDr,
407 [TRANS_BUm] = TRANS_FDm,
408 [TRANS_BRr] = TRANS_LDr,
409 [TRANS_BRm] = TRANS_RDm,
410 [TRANS_BDr] = TRANS_BDr,
411 [TRANS_BDm] = TRANS_BDm,
412 [TRANS_BLr] = TRANS_RDr,
413 [TRANS_BLm] = TRANS_LDm,
414};
415
416static uint8_t trans_move_table[48][3] = {
417 [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F },
418 [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F },
419 [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L },
420 [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R },
421 [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B },
422 [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B },
423 [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R },
424 [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L },
425 [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F },
426 [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F },
427 [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L },
428 [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R },
429 [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B },
430 [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B },
431 [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R },
432 [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L },
433 [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U },
434 [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U },
435 [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F },
436 [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F },
437 [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D },
438 [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D },
439 [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B },
440 [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B },
441 [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U },
442 [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U },
443 [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F },
444 [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F },
445 [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D },
446 [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D },
447 [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B },
448 [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B },
449 [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U },
450 [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U },
451 [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R },
452 [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L },
453 [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D },
454 [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D },
455 [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L },
456 [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R },
457 [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U },
458 [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U },
459 [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R },
460 [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L },
461 [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D },
462 [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D },
463 [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L },
464 [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R },
465};

Generated with cgit - Back to sebastiano.tronto.net