commit 77fbe3d7cbd8448f8124dba143bc5110344c6b49
parent bab22e1946a656088804b61cf765461b48744971
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date: Tue, 22 Apr 2025 18:45:12 +0200
Progress
Diffstat:
7 files changed, 692 insertions(+), 599 deletions(-)
diff --git a/README.md b/README.md
@@ -282,14 +282,30 @@ Edges are numbered as follows (see also constants.h):
UF=0 UB=1 DB=2 DF=3 UR=4 UL=5 DL=6 DR=7 FR=8 FL=9 BL=10 BR=11
```
+If the edge is misoriented with respect to the F/B axis, the value
+is increased by 16.
+
Corners are numbered as follows:
```
UFR=0 UBL=1 DFL=2 DBR=3 UFL=4 UBR=5 DFR=6 DBL=7
```
-At the moment, the only orientation supported is the standard one, as wide
-moves, rotations and slice moves are not supported.
+If the corner is twisted clockwise with respect to the U/D
+axis orientation, the value is increased by 8. If it is twisted
+counter-clowsie, the value is increased by 16.
+
+The orientations of the cube are numbered as follows, where e.g. "RB"
+means that the R face in on top and the B face is on front:
+
+```
+UF=0 UR=1 UB=2 UL=3
+DF=4 DR=5 DB=6 DL=7
+RF=8 RD=9 RB=10 RU=11
+LF=12 LD=13 LB=14 LU=15
+FD=16 FR=17 FU=18 FL=19
+BD=20 BR=21 BU=22 BL=23
+```
In this format, the solved cube looks like this:
@@ -297,10 +313,10 @@ In this format, the solved cube looks like this:
ABCDEFGH=ABCDEFGHIJKL=A
```
-The cube after the move F looks like this:
+The cube after the move Fw looks like this:
```
-MBODSFQH=ZBCYEFGHQTKL=A
+ANCPETGR=AbaDEFGHIJRS=L
```
A cube in B32 format is always 23 characters long (24 if the terminating
diff --git a/src/arch/common.h b/src/arch/common.h
@@ -1,3 +1,17 @@
+#define EOSHIFT UINT8_C(4)
+#define COSHIFT UINT8_C(5)
+
+#define PBITS UINT8_C(0xF)
+#define ESEPBIT_1 UINT8_C(0x4)
+#define ESEPBIT_2 UINT8_C(0x8)
+#define CSEPBIT UINT8_C(0x4)
+#define EOBIT UINT8_C(0x10)
+#define COBITS UINT8_C(0xF0)
+#define COBITS_2 UINT8_C(0x60)
+#define CTWIST_CW UINT8_C(0x20)
+#define CTWIST_CCW UINT8_C(0x40)
+#define EFLIP UINT8_C(0x10)
+
STATIC_INLINE int popcount_u32(uint32_t);
STATIC 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
@@ -1,229 +0,0 @@
-#define MOVE_CUBE_U STATIC_CUBE( \
- 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
-#define MOVE_CUBE_U2 STATIC_CUBE( \
- 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
-#define MOVE_CUBE_U3 STATIC_CUBE( \
- 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
-#define MOVE_CUBE_D STATIC_CUBE( \
- 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
-#define MOVE_CUBE_D2 STATIC_CUBE( \
- 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
-#define MOVE_CUBE_D3 STATIC_CUBE( \
- 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
-#define MOVE_CUBE_R STATIC_CUBE( \
- 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
-#define MOVE_CUBE_R2 STATIC_CUBE( \
- 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
-#define MOVE_CUBE_R3 STATIC_CUBE( \
- 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
-#define MOVE_CUBE_L STATIC_CUBE( \
- 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
-#define MOVE_CUBE_L2 STATIC_CUBE( \
- 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
-#define MOVE_CUBE_L3 STATIC_CUBE( \
- 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
-#define MOVE_CUBE_F STATIC_CUBE( \
- 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
-#define MOVE_CUBE_F2 STATIC_CUBE( \
- 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
-#define MOVE_CUBE_F3 STATIC_CUBE( \
- 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
-#define MOVE_CUBE_B STATIC_CUBE( \
- 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
-#define MOVE_CUBE_B2 STATIC_CUBE( \
- 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
-#define MOVE_CUBE_B3 STATIC_CUBE( \
- 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
-
-#define TRANS_CUBE_UFr STATIC_CUBE( \
- 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
-#define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \
- 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
-#define TRANS_CUBE_ULr STATIC_CUBE( \
- 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
-#define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \
- 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
-#define TRANS_CUBE_UBr STATIC_CUBE( \
- 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
-#define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \
- 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
-#define TRANS_CUBE_URr STATIC_CUBE( \
- 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
-#define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \
- 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
-#define TRANS_CUBE_DFr STATIC_CUBE( \
- 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
-#define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \
- 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
-#define TRANS_CUBE_DLr STATIC_CUBE( \
- 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
-#define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \
- 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
-#define TRANS_CUBE_DBr STATIC_CUBE( \
- 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
-#define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \
- 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
-#define TRANS_CUBE_DRr STATIC_CUBE( \
- 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
-#define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \
- 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
-#define TRANS_CUBE_RUr STATIC_CUBE( \
- 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
-#define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \
- 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
-#define TRANS_CUBE_RFr STATIC_CUBE( \
- 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
-#define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \
- 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
-#define TRANS_CUBE_RDr STATIC_CUBE( \
- 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
-#define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \
- 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
-#define TRANS_CUBE_RBr STATIC_CUBE( \
- 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
-#define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \
- 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
-#define TRANS_CUBE_LUr STATIC_CUBE( \
- 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
-#define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \
- 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
-#define TRANS_CUBE_LFr STATIC_CUBE( \
- 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
-#define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \
- 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
-#define TRANS_CUBE_LDr STATIC_CUBE( \
- 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
-#define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \
- 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
-#define TRANS_CUBE_LBr STATIC_CUBE( \
- 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
-#define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \
- 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
-#define TRANS_CUBE_FUr STATIC_CUBE( \
- 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
-#define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \
- 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
-#define TRANS_CUBE_FRr STATIC_CUBE( \
- 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
-#define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \
- 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
-#define TRANS_CUBE_FDr STATIC_CUBE( \
- 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
-#define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \
- 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
-#define TRANS_CUBE_FLr STATIC_CUBE( \
- 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
-#define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \
- 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
-#define TRANS_CUBE_BUr STATIC_CUBE( \
- 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
-#define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \
- 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
-#define TRANS_CUBE_BRr STATIC_CUBE( \
- 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
-#define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \
- 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
-#define TRANS_CUBE_BDr STATIC_CUBE( \
- 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
-#define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \
- 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
-#define TRANS_CUBE_BLr STATIC_CUBE( \
- 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
-#define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \
- 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
-#define TRANS_CUBE_UFm STATIC_CUBE( \
- 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
-#define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \
- 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
-#define TRANS_CUBE_ULm STATIC_CUBE( \
- 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
-#define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \
- 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
-#define TRANS_CUBE_UBm STATIC_CUBE( \
- 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
-#define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \
- 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
-#define TRANS_CUBE_URm STATIC_CUBE( \
- 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
-#define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \
- 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
-#define TRANS_CUBE_DFm STATIC_CUBE( \
- 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
-#define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \
- 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
-#define TRANS_CUBE_DLm STATIC_CUBE( \
- 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
-#define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \
- 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
-#define TRANS_CUBE_DBm STATIC_CUBE( \
- 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
-#define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \
- 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
-#define TRANS_CUBE_DRm STATIC_CUBE( \
- 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
-#define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \
- 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
-#define TRANS_CUBE_RUm STATIC_CUBE( \
- 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
-#define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \
- 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
-#define TRANS_CUBE_RFm STATIC_CUBE( \
- 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
-#define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \
- 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
-#define TRANS_CUBE_RDm STATIC_CUBE( \
- 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
-#define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \
- 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
-#define TRANS_CUBE_RBm STATIC_CUBE( \
- 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
-#define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \
- 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
-#define TRANS_CUBE_LUm STATIC_CUBE( \
- 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
-#define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \
- 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
-#define TRANS_CUBE_LFm STATIC_CUBE( \
- 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
-#define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \
- 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
-#define TRANS_CUBE_LDm STATIC_CUBE( \
- 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
-#define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \
- 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
-#define TRANS_CUBE_LBm STATIC_CUBE( \
- 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
-#define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \
- 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
-#define TRANS_CUBE_FUm STATIC_CUBE( \
- 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
-#define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \
- 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
-#define TRANS_CUBE_FRm STATIC_CUBE( \
- 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
-#define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \
- 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
-#define TRANS_CUBE_FDm STATIC_CUBE( \
- 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
-#define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \
- 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
-#define TRANS_CUBE_FLm STATIC_CUBE( \
- 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
-#define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \
- 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
-#define TRANS_CUBE_BUm STATIC_CUBE( \
- 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
-#define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \
- 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
-#define TRANS_CUBE_BRm STATIC_CUBE( \
- 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
-#define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \
- 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
-#define TRANS_CUBE_BDm STATIC_CUBE( \
- 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
-#define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \
- 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
-#define TRANS_CUBE_BLm STATIC_CUBE( \
- 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
-#define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \
- 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
@@ -0,0 +1,655 @@
+#define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0})
+#define SOLVED_ORIENTED_CUBE \
+ ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 })
+
+#define MOVE_CUBE_U STATIC_CUBE( \
+ 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
+#define MOVE_CUBE_U2 STATIC_CUBE( \
+ 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
+#define MOVE_CUBE_U3 STATIC_CUBE( \
+ 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
+#define MOVE_CUBE_D STATIC_CUBE( \
+ 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
+#define MOVE_CUBE_D2 STATIC_CUBE( \
+ 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
+#define MOVE_CUBE_D3 STATIC_CUBE( \
+ 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
+#define MOVE_CUBE_R STATIC_CUBE( \
+ 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
+#define MOVE_CUBE_R2 STATIC_CUBE( \
+ 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
+#define MOVE_CUBE_R3 STATIC_CUBE( \
+ 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
+#define MOVE_CUBE_L STATIC_CUBE( \
+ 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
+#define MOVE_CUBE_L2 STATIC_CUBE( \
+ 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
+#define MOVE_CUBE_L3 STATIC_CUBE( \
+ 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
+#define MOVE_CUBE_F STATIC_CUBE( \
+ 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
+#define MOVE_CUBE_F2 STATIC_CUBE( \
+ 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
+#define MOVE_CUBE_F3 STATIC_CUBE( \
+ 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
+#define MOVE_CUBE_B STATIC_CUBE( \
+ 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
+#define MOVE_CUBE_B2 STATIC_CUBE( \
+ 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
+#define MOVE_CUBE_B3 STATIC_CUBE( \
+ 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
+
+#define TRANS_CUBE_UFr STATIC_CUBE( \
+ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
+#define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \
+ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
+#define TRANS_CUBE_ULr STATIC_CUBE( \
+ 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
+#define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \
+ 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
+#define TRANS_CUBE_UBr STATIC_CUBE( \
+ 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
+#define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \
+ 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
+#define TRANS_CUBE_URr STATIC_CUBE( \
+ 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
+#define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \
+ 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
+#define TRANS_CUBE_DFr STATIC_CUBE( \
+ 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
+#define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \
+ 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
+#define TRANS_CUBE_DLr STATIC_CUBE( \
+ 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
+#define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \
+ 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
+#define TRANS_CUBE_DBr STATIC_CUBE( \
+ 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
+#define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \
+ 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
+#define TRANS_CUBE_DRr STATIC_CUBE( \
+ 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
+#define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \
+ 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
+#define TRANS_CUBE_RUr STATIC_CUBE( \
+ 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
+#define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \
+ 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
+#define TRANS_CUBE_RFr STATIC_CUBE( \
+ 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
+#define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \
+ 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
+#define TRANS_CUBE_RDr STATIC_CUBE( \
+ 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
+#define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \
+ 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
+#define TRANS_CUBE_RBr STATIC_CUBE( \
+ 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
+#define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \
+ 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
+#define TRANS_CUBE_LUr STATIC_CUBE( \
+ 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
+#define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \
+ 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
+#define TRANS_CUBE_LFr STATIC_CUBE( \
+ 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
+#define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \
+ 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
+#define TRANS_CUBE_LDr STATIC_CUBE( \
+ 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
+#define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \
+ 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
+#define TRANS_CUBE_LBr STATIC_CUBE( \
+ 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
+#define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \
+ 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
+#define TRANS_CUBE_FUr STATIC_CUBE( \
+ 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
+#define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \
+ 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
+#define TRANS_CUBE_FRr STATIC_CUBE( \
+ 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
+#define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \
+ 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
+#define TRANS_CUBE_FDr STATIC_CUBE( \
+ 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
+#define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \
+ 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
+#define TRANS_CUBE_FLr STATIC_CUBE( \
+ 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
+#define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \
+ 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
+#define TRANS_CUBE_BUr STATIC_CUBE( \
+ 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
+#define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \
+ 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
+#define TRANS_CUBE_BRr STATIC_CUBE( \
+ 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
+#define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \
+ 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
+#define TRANS_CUBE_BDr STATIC_CUBE( \
+ 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
+#define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \
+ 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
+#define TRANS_CUBE_BLr STATIC_CUBE( \
+ 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
+#define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \
+ 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
+#define TRANS_CUBE_UFm STATIC_CUBE( \
+ 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
+#define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \
+ 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
+#define TRANS_CUBE_ULm STATIC_CUBE( \
+ 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
+#define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \
+ 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
+#define TRANS_CUBE_UBm STATIC_CUBE( \
+ 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
+#define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \
+ 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
+#define TRANS_CUBE_URm STATIC_CUBE( \
+ 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
+#define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \
+ 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
+#define TRANS_CUBE_DFm STATIC_CUBE( \
+ 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
+#define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \
+ 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
+#define TRANS_CUBE_DLm STATIC_CUBE( \
+ 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
+#define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \
+ 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
+#define TRANS_CUBE_DBm STATIC_CUBE( \
+ 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
+#define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \
+ 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
+#define TRANS_CUBE_DRm STATIC_CUBE( \
+ 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
+#define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \
+ 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
+#define TRANS_CUBE_RUm STATIC_CUBE( \
+ 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
+#define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \
+ 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
+#define TRANS_CUBE_RFm STATIC_CUBE( \
+ 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
+#define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \
+ 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
+#define TRANS_CUBE_RDm STATIC_CUBE( \
+ 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
+#define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \
+ 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
+#define TRANS_CUBE_RBm STATIC_CUBE( \
+ 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
+#define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \
+ 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
+#define TRANS_CUBE_LUm STATIC_CUBE( \
+ 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
+#define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \
+ 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
+#define TRANS_CUBE_LFm STATIC_CUBE( \
+ 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
+#define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \
+ 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
+#define TRANS_CUBE_LDm STATIC_CUBE( \
+ 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
+#define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \
+ 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
+#define TRANS_CUBE_LBm STATIC_CUBE( \
+ 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
+#define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \
+ 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
+#define TRANS_CUBE_FUm STATIC_CUBE( \
+ 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
+#define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \
+ 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
+#define TRANS_CUBE_FRm STATIC_CUBE( \
+ 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
+#define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \
+ 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
+#define TRANS_CUBE_FDm STATIC_CUBE( \
+ 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
+#define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \
+ 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
+#define TRANS_CUBE_FLm STATIC_CUBE( \
+ 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
+#define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \
+ 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
+#define TRANS_CUBE_BUm STATIC_CUBE( \
+ 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
+#define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \
+ 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
+#define TRANS_CUBE_BRm STATIC_CUBE( \
+ 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
+#define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \
+ 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
+#define TRANS_CUBE_BDm STATIC_CUBE( \
+ 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
+#define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \
+ 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
+#define TRANS_CUBE_BLm STATIC_CUBE( \
+ 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
+#define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \
+ 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
+
+#define MOVE_U UINT8_C(0)
+#define MOVE_U2 UINT8_C(1)
+#define MOVE_U3 UINT8_C(2)
+#define MOVE_D UINT8_C(3)
+#define MOVE_D2 UINT8_C(4)
+#define MOVE_D3 UINT8_C(5)
+#define MOVE_R UINT8_C(6)
+#define MOVE_R2 UINT8_C(7)
+#define MOVE_R3 UINT8_C(8)
+#define MOVE_L UINT8_C(9)
+#define MOVE_L2 UINT8_C(10)
+#define MOVE_L3 UINT8_C(11)
+#define MOVE_F UINT8_C(12)
+#define MOVE_F2 UINT8_C(13)
+#define MOVE_F3 UINT8_C(14)
+#define MOVE_B UINT8_C(15)
+#define MOVE_B2 UINT8_C(16)
+#define MOVE_B3 UINT8_C(17)
+
+#define TRANS_UFr UINT8_C(0)
+#define TRANS_ULr UINT8_C(1)
+#define TRANS_UBr UINT8_C(2)
+#define TRANS_URr UINT8_C(3)
+#define TRANS_DFr UINT8_C(4)
+#define TRANS_DLr UINT8_C(5)
+#define TRANS_DBr UINT8_C(6)
+#define TRANS_DRr UINT8_C(7)
+#define TRANS_RUr UINT8_C(8)
+#define TRANS_RFr UINT8_C(9)
+#define TRANS_RDr UINT8_C(10)
+#define TRANS_RBr UINT8_C(11)
+#define TRANS_LUr UINT8_C(12)
+#define TRANS_LFr UINT8_C(13)
+#define TRANS_LDr UINT8_C(14)
+#define TRANS_LBr UINT8_C(15)
+#define TRANS_FUr UINT8_C(16)
+#define TRANS_FRr UINT8_C(17)
+#define TRANS_FDr UINT8_C(18)
+#define TRANS_FLr UINT8_C(19)
+#define TRANS_BUr UINT8_C(20)
+#define TRANS_BRr UINT8_C(21)
+#define TRANS_BDr UINT8_C(22)
+#define TRANS_BLr UINT8_C(23)
+
+#define TRANS_UFm UINT8_C(24)
+#define TRANS_ULm UINT8_C(25)
+#define TRANS_UBm UINT8_C(26)
+#define TRANS_URm UINT8_C(27)
+#define TRANS_DFm UINT8_C(28)
+#define TRANS_DLm UINT8_C(29)
+#define TRANS_DBm UINT8_C(30)
+#define TRANS_DRm UINT8_C(31)
+#define TRANS_RUm UINT8_C(32)
+#define TRANS_RFm UINT8_C(33)
+#define TRANS_RDm UINT8_C(34)
+#define TRANS_RBm UINT8_C(35)
+#define TRANS_LUm UINT8_C(36)
+#define TRANS_LFm UINT8_C(37)
+#define TRANS_LDm UINT8_C(38)
+#define TRANS_LBm UINT8_C(39)
+#define TRANS_FUm UINT8_C(40)
+#define TRANS_FRm UINT8_C(41)
+#define TRANS_FDm UINT8_C(42)
+#define TRANS_FLm UINT8_C(43)
+#define TRANS_BUm UINT8_C(44)
+#define TRANS_BRm UINT8_C(45)
+#define TRANS_BDm UINT8_C(46)
+#define TRANS_BLm UINT8_C(47)
+
+#define AXIS_UD UINT8_C(0)
+#define AXIS_RL UINT8_C(1)
+#define AXIS_FB UINT8_C(2)
+
+#define NMOVES (1+MOVE_B3)
+#define NTRANS (1+TRANS_BLm)
+
+#define MM_ALLMOVES UINT32_C(0x3FFFF)
+#define MM_NOHALFTURNS UINT32_C(0x2DB6D)
+#define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m))
+#define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m))
+#define MM_EO (\
+ MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
+ MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\
+ MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
+#define MM_DR (\
+ MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
+ MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\
+ MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
+#define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS)
+
+#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
+#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t))
+#define TM_UDRLFIX (\
+ TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \
+ TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \
+ TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm))
+#define TM_UDFIX (\
+ TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
+ TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
+ TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
+ TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
+ TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
+ TM_SINGLE(TRANS_DLm))
+
+#define CORNER_UFR UINT8_C(0)
+#define CORNER_UBL UINT8_C(1)
+#define CORNER_DFL UINT8_C(2)
+#define CORNER_DBR UINT8_C(3)
+#define CORNER_UFL UINT8_C(4)
+#define CORNER_UBR UINT8_C(5)
+#define CORNER_DFR UINT8_C(6)
+#define CORNER_DBL UINT8_C(7)
+
+#define EDGE_UF UINT8_C(0)
+#define EDGE_UB UINT8_C(1)
+#define EDGE_DB UINT8_C(2)
+#define EDGE_DF UINT8_C(3)
+#define EDGE_UR UINT8_C(4)
+#define EDGE_UL UINT8_C(5)
+#define EDGE_DL UINT8_C(6)
+#define EDGE_DR UINT8_C(7)
+#define EDGE_FR UINT8_C(8)
+#define EDGE_FL UINT8_C(9)
+#define EDGE_BL UINT8_C(10)
+#define EDGE_BR UINT8_C(11)
+
+#define ORIENTATION_UF UINT8_C(0)
+#define ORIENTATION_UR UINT8_C(1)
+#define ORIENTATION_UB UINT8_C(2)
+#define ORIENTATION_UL UINT8_C(3)
+#define ORIENTATION_DF UINT8_C(4)
+#define ORIENTATION_DR UINT8_C(5)
+#define ORIENTATION_DB UINT8_C(6)
+#define ORIENTATION_DL UINT8_C(7)
+#define ORIENTATION_RF UINT8_C(8)
+#define ORIENTATION_RD UINT8_C(9)
+#define ORIENTATION_RB UINT8_C(10)
+#define ORIENTATION_RU UINT8_C(11)
+#define ORIENTATION_LF UINT8_C(12)
+#define ORIENTATION_LD UINT8_C(13)
+#define ORIENTATION_LB UINT8_C(14)
+#define ORIENTATION_LU UINT8_C(15)
+#define ORIENTATION_FD UINT8_C(16)
+#define ORIENTATION_FR UINT8_C(17)
+#define ORIENTATION_FU UINT8_C(18)
+#define ORIENTATION_FL UINT8_C(19)
+#define ORIENTATION_BD UINT8_C(20)
+#define ORIENTATION_BR UINT8_C(21)
+#define ORIENTATION_BU UINT8_C(22)
+#define ORIENTATION_BL UINT8_C(23)
+
+STATIC const uint32_t allowedmask[] = {
+ UINT32_C(0x3FFF8),
+ UINT32_C(0x3FFC0),
+ UINT32_C(0x3FE3F),
+ UINT32_C(0x3F03F),
+ UINT32_C(0x38FFF),
+ UINT32_C(0x00FFF)
+};
+
+STATIC const char *cornerstr[] = {
+ [CORNER_UFR] = "UFR",
+ [CORNER_UBL] = "UBL",
+ [CORNER_DFL] = "DFL",
+ [CORNER_DBR] = "DBR",
+ [CORNER_UFL] = "UFL",
+ [CORNER_UBR] = "UBR",
+ [CORNER_DFR] = "DFR",
+ [CORNER_DBL] = "DBL"
+};
+
+STATIC const char *cornerstralt[] = {
+ [CORNER_UFR] = "URF",
+ [CORNER_UBL] = "ULB",
+ [CORNER_DFL] = "DLF",
+ [CORNER_DBR] = "DRB",
+ [CORNER_UFL] = "ULF",
+ [CORNER_UBR] = "URB",
+ [CORNER_DFR] = "DRF",
+ [CORNER_DBL] = "DLB"
+};
+
+STATIC const char *edgestr[] = {
+ [EDGE_UF] = "UF",
+ [EDGE_UB] = "UB",
+ [EDGE_DB] = "DB",
+ [EDGE_DF] = "DF",
+ [EDGE_UR] = "UR",
+ [EDGE_UL] = "UL",
+ [EDGE_DL] = "DL",
+ [EDGE_DR] = "DR",
+ [EDGE_FR] = "FR",
+ [EDGE_FL] = "FL",
+ [EDGE_BL] = "BL",
+ [EDGE_BR] = "BR"
+};
+
+STATIC const char *movestr[] = {
+ [MOVE_U] = "U",
+ [MOVE_U2] = "U2",
+ [MOVE_U3] = "U'",
+ [MOVE_D] = "D",
+ [MOVE_D2] = "D2",
+ [MOVE_D3] = "D'",
+ [MOVE_R] = "R",
+ [MOVE_R2] = "R2",
+ [MOVE_R3] = "R'",
+ [MOVE_L] = "L",
+ [MOVE_L2] = "L2",
+ [MOVE_L3] = "L'",
+ [MOVE_F] = "F",
+ [MOVE_F2] = "F2",
+ [MOVE_F3] = "F'",
+ [MOVE_B] = "B",
+ [MOVE_B2] = "B2",
+ [MOVE_B3] = "B'",
+};
+
+STATIC const char *transstr[] = {
+ [TRANS_UFr] = "rotation UF",
+ [TRANS_UFm] = "mirrored UF",
+ [TRANS_ULr] = "rotation UL",
+ [TRANS_ULm] = "mirrored UL",
+ [TRANS_UBr] = "rotation UB",
+ [TRANS_UBm] = "mirrored UB",
+ [TRANS_URr] = "rotation UR",
+ [TRANS_URm] = "mirrored UR",
+ [TRANS_DFr] = "rotation DF",
+ [TRANS_DFm] = "mirrored DF",
+ [TRANS_DLr] = "rotation DL",
+ [TRANS_DLm] = "mirrored DL",
+ [TRANS_DBr] = "rotation DB",
+ [TRANS_DBm] = "mirrored DB",
+ [TRANS_DRr] = "rotation DR",
+ [TRANS_DRm] = "mirrored DR",
+ [TRANS_RUr] = "rotation RU",
+ [TRANS_RUm] = "mirrored RU",
+ [TRANS_RFr] = "rotation RF",
+ [TRANS_RFm] = "mirrored RF",
+ [TRANS_RDr] = "rotation RD",
+ [TRANS_RDm] = "mirrored RD",
+ [TRANS_RBr] = "rotation RB",
+ [TRANS_RBm] = "mirrored RB",
+ [TRANS_LUr] = "rotation LU",
+ [TRANS_LUm] = "mirrored LU",
+ [TRANS_LFr] = "rotation LF",
+ [TRANS_LFm] = "mirrored LF",
+ [TRANS_LDr] = "rotation LD",
+ [TRANS_LDm] = "mirrored LD",
+ [TRANS_LBr] = "rotation LB",
+ [TRANS_LBm] = "mirrored LB",
+ [TRANS_FUr] = "rotation FU",
+ [TRANS_FUm] = "mirrored FU",
+ [TRANS_FRr] = "rotation FR",
+ [TRANS_FRm] = "mirrored FR",
+ [TRANS_FDr] = "rotation FD",
+ [TRANS_FDm] = "mirrored FD",
+ [TRANS_FLr] = "rotation FL",
+ [TRANS_FLm] = "mirrored FL",
+ [TRANS_BUr] = "rotation BU",
+ [TRANS_BUm] = "mirrored BU",
+ [TRANS_BRr] = "rotation BR",
+ [TRANS_BRm] = "mirrored BR",
+ [TRANS_BDr] = "rotation BD",
+ [TRANS_BDm] = "mirrored BD",
+ [TRANS_BLr] = "rotation BL",
+ [TRANS_BLm] = "mirrored BL",
+};
+
+static uint8_t inverse_trans_table[] = {
+ [TRANS_UFr] = TRANS_UFr,
+ [TRANS_UFm] = TRANS_UFm,
+ [TRANS_ULr] = TRANS_URr,
+ [TRANS_ULm] = TRANS_ULm,
+ [TRANS_UBr] = TRANS_UBr,
+ [TRANS_UBm] = TRANS_UBm,
+ [TRANS_URr] = TRANS_ULr,
+ [TRANS_URm] = TRANS_URm,
+ [TRANS_DFr] = TRANS_DFr,
+ [TRANS_DFm] = TRANS_DFm,
+ [TRANS_DLr] = TRANS_DLr,
+ [TRANS_DLm] = TRANS_DRm,
+ [TRANS_DBr] = TRANS_DBr,
+ [TRANS_DBm] = TRANS_DBm,
+ [TRANS_DRr] = TRANS_DRr,
+ [TRANS_DRm] = TRANS_DLm,
+ [TRANS_RUr] = TRANS_FRr,
+ [TRANS_RUm] = TRANS_FLm,
+ [TRANS_RFr] = TRANS_LFr,
+ [TRANS_RFm] = TRANS_RFm,
+ [TRANS_RDr] = TRANS_BLr,
+ [TRANS_RDm] = TRANS_BRm,
+ [TRANS_RBr] = TRANS_RBr,
+ [TRANS_RBm] = TRANS_LBm,
+ [TRANS_LUr] = TRANS_FLr,
+ [TRANS_LUm] = TRANS_FRm,
+ [TRANS_LFr] = TRANS_RFr,
+ [TRANS_LFm] = TRANS_LFm,
+ [TRANS_LDr] = TRANS_BRr,
+ [TRANS_LDm] = TRANS_BLm,
+ [TRANS_LBr] = TRANS_LBr,
+ [TRANS_LBm] = TRANS_RBm,
+ [TRANS_FUr] = TRANS_FUr,
+ [TRANS_FUm] = TRANS_FUm,
+ [TRANS_FRr] = TRANS_RUr,
+ [TRANS_FRm] = TRANS_LUm,
+ [TRANS_FDr] = TRANS_BUr,
+ [TRANS_FDm] = TRANS_BUm,
+ [TRANS_FLr] = TRANS_LUr,
+ [TRANS_FLm] = TRANS_RUm,
+ [TRANS_BUr] = TRANS_FDr,
+ [TRANS_BUm] = TRANS_FDm,
+ [TRANS_BRr] = TRANS_LDr,
+ [TRANS_BRm] = TRANS_RDm,
+ [TRANS_BDr] = TRANS_BDr,
+ [TRANS_BDm] = TRANS_BDm,
+ [TRANS_BLr] = TRANS_RDr,
+ [TRANS_BLm] = TRANS_LDm,
+};
+
+static uint8_t trans_move_table[][3] = {
+ [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F },
+ [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F },
+ [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L },
+ [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R },
+ [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B },
+ [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B },
+ [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R },
+ [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L },
+ [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F },
+ [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F },
+ [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L },
+ [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R },
+ [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B },
+ [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B },
+ [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R },
+ [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L },
+ [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U },
+ [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U },
+ [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F },
+ [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F },
+ [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D },
+ [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D },
+ [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B },
+ [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B },
+ [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U },
+ [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U },
+ [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F },
+ [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F },
+ [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D },
+ [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D },
+ [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B },
+ [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B },
+ [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U },
+ [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U },
+ [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R },
+ [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L },
+ [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D },
+ [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D },
+ [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L },
+ [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R },
+ [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U },
+ [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U },
+ [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R },
+ [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L },
+ [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D },
+ [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D },
+ [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L },
+ [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R },
+};
+
+static uint8_t orientation_transition_table[][3] = {
+ [ORIENTATION_UF] = { ORIENTATION_FD, ORIENTATION_UR, ORIENTATION_LF },
+ [ORIENTATION_UR] = { ORIENTATION_RD, ORIENTATION_UB, ORIENTATION_FR },
+ [ORIENTATION_UB] = { ORIENTATION_BD, ORIENTATION_UL, ORIENTATION_RB },
+ [ORIENTATION_UL] = { ORIENTATION_LD, ORIENTATION_UF, ORIENTATION_BL },
+ [ORIENTATION_DF] = { ORIENTATION_FU, ORIENTATION_DL, ORIENTATION_RF },
+ [ORIENTATION_DR] = { ORIENTATION_RU, ORIENTATION_DF, ORIENTATION_BR },
+ [ORIENTATION_DB] = { ORIENTATION_BU, ORIENTATION_DR, ORIENTATION_LB },
+ [ORIENTATION_DL] = { ORIENTATION_LU, ORIENTATION_DB, ORIENTATION_FL },
+ [ORIENTATION_RF] = { ORIENTATION_FL, ORIENTATION_RD, ORIENTATION_UF },
+ [ORIENTATION_RD] = { ORIENTATION_DL, ORIENTATION_RB, ORIENTATION_FD },
+ [ORIENTATION_RB] = { ORIENTATION_BL, ORIENTATION_RU, ORIENTATION_DB },
+ [ORIENTATION_RU] = { ORIENTATION_UL, ORIENTATION_RF, ORIENTATION_BU },
+ [ORIENTATION_LF] = { ORIENTATION_FR, ORIENTATION_LU, ORIENTATION_DF },
+ [ORIENTATION_LD] = { ORIENTATION_DR, ORIENTATION_LB, ORIENTATION_BD },
+ [ORIENTATION_LB] = { ORIENTATION_BR, ORIENTATION_LD, ORIENTATION_UB },
+ [ORIENTATION_LU] = { ORIENTATION_UR, ORIENTATION_LF, ORIENTATION_FU },
+ [ORIENTATION_FD] = { ORIENTATION_DB, ORIENTATION_FR, ORIENTATION_LD },
+ [ORIENTATION_FR] = { ORIENTATION_RB, ORIENTATION_FU, ORIENTATION_DR },
+ [ORIENTATION_FU] = { ORIENTATION_UB, ORIENTATION_FL, ORIENTATION_RU },
+ [ORIENTATION_FL] = { ORIENTATION_LB, ORIENTATION_FD, ORIENTATION_UL },
+ [ORIENTATION_BD] = { ORIENTATION_DF, ORIENTATION_BL, ORIENTATION_RD },
+ [ORIENTATION_BR] = { ORIENTATION_RF, ORIENTATION_BU, ORIENTATION_UR },
+ [ORIENTATION_BU] = { ORIENTATION_UF, ORIENTATION_BR, ORIENTATION_LU },
+ [ORIENTATION_BL] = { ORIENTATION_LF, ORIENTATION_BD, ORIENTATION_DL },
+};
+
+static struct {
+ uint8_t moves[3];
+ uint8_t rotations[6];
+} equivalent_move_table[] = {
+ [MOVE_U] = { { MOVE_U, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_U2] = { { MOVE_U2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_U3] = { { MOVE_U3, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_D] = { { MOVE_D, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_D2] = { { MOVE_D2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_D3] = { { MOVE_D3, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_R] = { { MOVE_R, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_R2] = { { MOVE_R2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_R3] = { { MOVE_R3, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_L] = { { MOVE_L, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_L2] = { { MOVE_L2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_L3] = { { MOVE_L3, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_F] = { { MOVE_F, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_F2] = { { MOVE_F2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_F3] = { { MOVE_F3, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_B] = { { MOVE_B, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_B2] = { { MOVE_B2, UINT8_MAX }, {UINT8_MAX} },
+ [MOVE_B3] = { { MOVE_B3, UINT8_MAX }, {UINT8_MAX} },
+};
diff --git a/src/core/core.h b/src/core/core.h
@@ -1,5 +1,5 @@
#include "core_types.h"
-#include "constant_cubes.h"
+#include "constants.h"
#include "cube.h"
#include "moves.h"
#include "transform.h"
diff --git a/src/core/cube.h b/src/core/cube.h
@@ -1,7 +1,3 @@
-#define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0})
-#define SOLVED_ORIENTED_CUBE \
- ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 })
-
STATIC oriented_cube_t solvedcube(void);
STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]);
STATIC bool isconsistent(oriented_cube_t);
diff --git a/src/utils/constants.h b/src/utils/constants.h
@@ -9,6 +9,8 @@
#define COMB_12_4 INT64_C(495)
#define COMB_8_4 INT64_C(70)
+#define UINT8_ERROR UINT8_MAX
+
STATIC int64_t binomial[12][12] = {
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -23,364 +25,3 @@ STATIC int64_t binomial[12][12] = {
{1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0},
{1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1},
};
-
-#define MOVE_U UINT8_C(0)
-#define MOVE_U2 UINT8_C(1)
-#define MOVE_U3 UINT8_C(2)
-#define MOVE_D UINT8_C(3)
-#define MOVE_D2 UINT8_C(4)
-#define MOVE_D3 UINT8_C(5)
-#define MOVE_R UINT8_C(6)
-#define MOVE_R2 UINT8_C(7)
-#define MOVE_R3 UINT8_C(8)
-#define MOVE_L UINT8_C(9)
-#define MOVE_L2 UINT8_C(10)
-#define MOVE_L3 UINT8_C(11)
-#define MOVE_F UINT8_C(12)
-#define MOVE_F2 UINT8_C(13)
-#define MOVE_F3 UINT8_C(14)
-#define MOVE_B UINT8_C(15)
-#define MOVE_B2 UINT8_C(16)
-#define MOVE_B3 UINT8_C(17)
-
-#define TRANS_UFr UINT8_C(0)
-#define TRANS_ULr UINT8_C(1)
-#define TRANS_UBr UINT8_C(2)
-#define TRANS_URr UINT8_C(3)
-#define TRANS_DFr UINT8_C(4)
-#define TRANS_DLr UINT8_C(5)
-#define TRANS_DBr UINT8_C(6)
-#define TRANS_DRr UINT8_C(7)
-#define TRANS_RUr UINT8_C(8)
-#define TRANS_RFr UINT8_C(9)
-#define TRANS_RDr UINT8_C(10)
-#define TRANS_RBr UINT8_C(11)
-#define TRANS_LUr UINT8_C(12)
-#define TRANS_LFr UINT8_C(13)
-#define TRANS_LDr UINT8_C(14)
-#define TRANS_LBr UINT8_C(15)
-#define TRANS_FUr UINT8_C(16)
-#define TRANS_FRr UINT8_C(17)
-#define TRANS_FDr UINT8_C(18)
-#define TRANS_FLr UINT8_C(19)
-#define TRANS_BUr UINT8_C(20)
-#define TRANS_BRr UINT8_C(21)
-#define TRANS_BDr UINT8_C(22)
-#define TRANS_BLr UINT8_C(23)
-
-#define TRANS_UFm UINT8_C(24)
-#define TRANS_ULm UINT8_C(25)
-#define TRANS_UBm UINT8_C(26)
-#define TRANS_URm UINT8_C(27)
-#define TRANS_DFm UINT8_C(28)
-#define TRANS_DLm UINT8_C(29)
-#define TRANS_DBm UINT8_C(30)
-#define TRANS_DRm UINT8_C(31)
-#define TRANS_RUm UINT8_C(32)
-#define TRANS_RFm UINT8_C(33)
-#define TRANS_RDm UINT8_C(34)
-#define TRANS_RBm UINT8_C(35)
-#define TRANS_LUm UINT8_C(36)
-#define TRANS_LFm UINT8_C(37)
-#define TRANS_LDm UINT8_C(38)
-#define TRANS_LBm UINT8_C(39)
-#define TRANS_FUm UINT8_C(40)
-#define TRANS_FRm UINT8_C(41)
-#define TRANS_FDm UINT8_C(42)
-#define TRANS_FLm UINT8_C(43)
-#define TRANS_BUm UINT8_C(44)
-#define TRANS_BRm UINT8_C(45)
-#define TRANS_BDm UINT8_C(46)
-#define TRANS_BLm UINT8_C(47)
-
-#define AXIS_UD UINT8_C(0)
-#define AXIS_RL UINT8_C(1)
-#define AXIS_FB UINT8_C(2)
-
-#define NMOVES (1+MOVE_B3)
-#define NTRANS (1+TRANS_BLm)
-
-#define MM_ALLMOVES UINT32_C(0x3FFFF)
-#define MM_NOHALFTURNS UINT32_C(0x2DB6D)
-#define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m))
-#define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m))
-#define MM_EO (\
- MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
- MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\
- MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
-#define MM_DR (\
- MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\
- MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\
- MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
-#define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS)
-
-#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
-#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t))
-#define TM_UDRLFIX (\
- TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \
- TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \
- TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm))
-#define TM_UDFIX (\
- TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
- TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
- TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
- TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
- TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
- TM_SINGLE(TRANS_DLm))
-
-#define CORNER_UFR UINT8_C(0)
-#define CORNER_UBL UINT8_C(1)
-#define CORNER_DFL UINT8_C(2)
-#define CORNER_DBR UINT8_C(3)
-#define CORNER_UFL UINT8_C(4)
-#define CORNER_UBR UINT8_C(5)
-#define CORNER_DFR UINT8_C(6)
-#define CORNER_DBL UINT8_C(7)
-
-#define EDGE_UF UINT8_C(0)
-#define EDGE_UB UINT8_C(1)
-#define EDGE_DB UINT8_C(2)
-#define EDGE_DF UINT8_C(3)
-#define EDGE_UR UINT8_C(4)
-#define EDGE_UL UINT8_C(5)
-#define EDGE_DL UINT8_C(6)
-#define EDGE_DR UINT8_C(7)
-#define EDGE_FR UINT8_C(8)
-#define EDGE_FL UINT8_C(9)
-#define EDGE_BL UINT8_C(10)
-#define EDGE_BR UINT8_C(11)
-
-#define EOSHIFT UINT8_C(4)
-#define COSHIFT UINT8_C(5)
-
-#define PBITS UINT8_C(0xF)
-#define ESEPBIT_1 UINT8_C(0x4)
-#define ESEPBIT_2 UINT8_C(0x8)
-#define CSEPBIT UINT8_C(0x4)
-#define EOBIT UINT8_C(0x10)
-#define COBITS UINT8_C(0xF0)
-#define COBITS_2 UINT8_C(0x60)
-#define CTWIST_CW UINT8_C(0x20)
-#define CTWIST_CCW UINT8_C(0x40)
-#define EFLIP UINT8_C(0x10)
-#define UINT8_ERROR UINT8_MAX
-
-STATIC const uint32_t allowedmask[] = {
- UINT32_C(0x3FFF8),
- UINT32_C(0x3FFC0),
- UINT32_C(0x3FE3F),
- UINT32_C(0x3F03F),
- UINT32_C(0x38FFF),
- UINT32_C(0x00FFF)
-};
-
-STATIC const char *cornerstr[] = {
- [CORNER_UFR] = "UFR",
- [CORNER_UBL] = "UBL",
- [CORNER_DFL] = "DFL",
- [CORNER_DBR] = "DBR",
- [CORNER_UFL] = "UFL",
- [CORNER_UBR] = "UBR",
- [CORNER_DFR] = "DFR",
- [CORNER_DBL] = "DBL"
-};
-
-STATIC const char *cornerstralt[] = {
- [CORNER_UFR] = "URF",
- [CORNER_UBL] = "ULB",
- [CORNER_DFL] = "DLF",
- [CORNER_DBR] = "DRB",
- [CORNER_UFL] = "ULF",
- [CORNER_UBR] = "URB",
- [CORNER_DFR] = "DRF",
- [CORNER_DBL] = "DLB"
-};
-
-STATIC const char *edgestr[] = {
- [EDGE_UF] = "UF",
- [EDGE_UB] = "UB",
- [EDGE_DB] = "DB",
- [EDGE_DF] = "DF",
- [EDGE_UR] = "UR",
- [EDGE_UL] = "UL",
- [EDGE_DL] = "DL",
- [EDGE_DR] = "DR",
- [EDGE_FR] = "FR",
- [EDGE_FL] = "FL",
- [EDGE_BL] = "BL",
- [EDGE_BR] = "BR"
-};
-
-STATIC const char *movestr[] = {
- [MOVE_U] = "U",
- [MOVE_U2] = "U2",
- [MOVE_U3] = "U'",
- [MOVE_D] = "D",
- [MOVE_D2] = "D2",
- [MOVE_D3] = "D'",
- [MOVE_R] = "R",
- [MOVE_R2] = "R2",
- [MOVE_R3] = "R'",
- [MOVE_L] = "L",
- [MOVE_L2] = "L2",
- [MOVE_L3] = "L'",
- [MOVE_F] = "F",
- [MOVE_F2] = "F2",
- [MOVE_F3] = "F'",
- [MOVE_B] = "B",
- [MOVE_B2] = "B2",
- [MOVE_B3] = "B'",
-};
-
-STATIC const char *transstr[] = {
- [TRANS_UFr] = "rotation UF",
- [TRANS_UFm] = "mirrored UF",
- [TRANS_ULr] = "rotation UL",
- [TRANS_ULm] = "mirrored UL",
- [TRANS_UBr] = "rotation UB",
- [TRANS_UBm] = "mirrored UB",
- [TRANS_URr] = "rotation UR",
- [TRANS_URm] = "mirrored UR",
- [TRANS_DFr] = "rotation DF",
- [TRANS_DFm] = "mirrored DF",
- [TRANS_DLr] = "rotation DL",
- [TRANS_DLm] = "mirrored DL",
- [TRANS_DBr] = "rotation DB",
- [TRANS_DBm] = "mirrored DB",
- [TRANS_DRr] = "rotation DR",
- [TRANS_DRm] = "mirrored DR",
- [TRANS_RUr] = "rotation RU",
- [TRANS_RUm] = "mirrored RU",
- [TRANS_RFr] = "rotation RF",
- [TRANS_RFm] = "mirrored RF",
- [TRANS_RDr] = "rotation RD",
- [TRANS_RDm] = "mirrored RD",
- [TRANS_RBr] = "rotation RB",
- [TRANS_RBm] = "mirrored RB",
- [TRANS_LUr] = "rotation LU",
- [TRANS_LUm] = "mirrored LU",
- [TRANS_LFr] = "rotation LF",
- [TRANS_LFm] = "mirrored LF",
- [TRANS_LDr] = "rotation LD",
- [TRANS_LDm] = "mirrored LD",
- [TRANS_LBr] = "rotation LB",
- [TRANS_LBm] = "mirrored LB",
- [TRANS_FUr] = "rotation FU",
- [TRANS_FUm] = "mirrored FU",
- [TRANS_FRr] = "rotation FR",
- [TRANS_FRm] = "mirrored FR",
- [TRANS_FDr] = "rotation FD",
- [TRANS_FDm] = "mirrored FD",
- [TRANS_FLr] = "rotation FL",
- [TRANS_FLm] = "mirrored FL",
- [TRANS_BUr] = "rotation BU",
- [TRANS_BUm] = "mirrored BU",
- [TRANS_BRr] = "rotation BR",
- [TRANS_BRm] = "mirrored BR",
- [TRANS_BDr] = "rotation BD",
- [TRANS_BDm] = "mirrored BD",
- [TRANS_BLr] = "rotation BL",
- [TRANS_BLm] = "mirrored BL",
-};
-
-static uint8_t inverse_trans_table[48] = {
- [TRANS_UFr] = TRANS_UFr,
- [TRANS_UFm] = TRANS_UFm,
- [TRANS_ULr] = TRANS_URr,
- [TRANS_ULm] = TRANS_ULm,
- [TRANS_UBr] = TRANS_UBr,
- [TRANS_UBm] = TRANS_UBm,
- [TRANS_URr] = TRANS_ULr,
- [TRANS_URm] = TRANS_URm,
- [TRANS_DFr] = TRANS_DFr,
- [TRANS_DFm] = TRANS_DFm,
- [TRANS_DLr] = TRANS_DLr,
- [TRANS_DLm] = TRANS_DRm,
- [TRANS_DBr] = TRANS_DBr,
- [TRANS_DBm] = TRANS_DBm,
- [TRANS_DRr] = TRANS_DRr,
- [TRANS_DRm] = TRANS_DLm,
- [TRANS_RUr] = TRANS_FRr,
- [TRANS_RUm] = TRANS_FLm,
- [TRANS_RFr] = TRANS_LFr,
- [TRANS_RFm] = TRANS_RFm,
- [TRANS_RDr] = TRANS_BLr,
- [TRANS_RDm] = TRANS_BRm,
- [TRANS_RBr] = TRANS_RBr,
- [TRANS_RBm] = TRANS_LBm,
- [TRANS_LUr] = TRANS_FLr,
- [TRANS_LUm] = TRANS_FRm,
- [TRANS_LFr] = TRANS_RFr,
- [TRANS_LFm] = TRANS_LFm,
- [TRANS_LDr] = TRANS_BRr,
- [TRANS_LDm] = TRANS_BLm,
- [TRANS_LBr] = TRANS_LBr,
- [TRANS_LBm] = TRANS_RBm,
- [TRANS_FUr] = TRANS_FUr,
- [TRANS_FUm] = TRANS_FUm,
- [TRANS_FRr] = TRANS_RUr,
- [TRANS_FRm] = TRANS_LUm,
- [TRANS_FDr] = TRANS_BUr,
- [TRANS_FDm] = TRANS_BUm,
- [TRANS_FLr] = TRANS_LUr,
- [TRANS_FLm] = TRANS_RUm,
- [TRANS_BUr] = TRANS_FDr,
- [TRANS_BUm] = TRANS_FDm,
- [TRANS_BRr] = TRANS_LDr,
- [TRANS_BRm] = TRANS_RDm,
- [TRANS_BDr] = TRANS_BDr,
- [TRANS_BDm] = TRANS_BDm,
- [TRANS_BLr] = TRANS_RDr,
- [TRANS_BLm] = TRANS_LDm,
-};
-
-static uint8_t trans_move_table[48][3] = {
- [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F },
- [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F },
- [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L },
- [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R },
- [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B },
- [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B },
- [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R },
- [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L },
- [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F },
- [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F },
- [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L },
- [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R },
- [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B },
- [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B },
- [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R },
- [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L },
- [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U },
- [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U },
- [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F },
- [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F },
- [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D },
- [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D },
- [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B },
- [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B },
- [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U },
- [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U },
- [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F },
- [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F },
- [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D },
- [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D },
- [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B },
- [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B },
- [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U },
- [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U },
- [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R },
- [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L },
- [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D },
- [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D },
- [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L },
- [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R },
- [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U },
- [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U },
- [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R },
- [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L },
- [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D },
- [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D },
- [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L },
- [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R },
-};