nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

commit 77fbe3d7cbd8448f8124dba143bc5110344c6b49
parent bab22e1946a656088804b61cf765461b48744971
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Tue, 22 Apr 2025 18:45:12 +0200

Progress

Diffstat:
MREADME.md | 24++++++++++++++++++++----
Msrc/arch/common.h | 14++++++++++++++
Dsrc/core/constant_cubes.h | 229-------------------------------------------------------------------------------
Asrc/core/constants.h | 655+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/core/core.h | 2+-
Msrc/core/cube.h | 4----
Msrc/utils/constants.h | 363+------------------------------------------------------------------------------
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 }, -};