cubecore

A library of core functions for working with 3x3x3 Rubik's cubes
git clone https://git.tronto.net/cubecore
Download | Log | Files | Refs | README | LICENSE

commit ae055f1fc993d406939f57f11553d218e1efde82
parent 72e018b066bd5cc3ce0181b43865a227e8b9b6ec
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Sat, 13 Apr 2024 09:24:47 +0200

Simplified moves and trans

Diffstat:
Mcube.c | 717++++---------------------------------------------------------------------------
Atables.h | 720+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Autils/genmovecode.sh | 19+++++++++++++++++++
Autils/gentranscode.sh | 37+++++++++++++++++++++++++++++++++++++
Autils/h48_to_lst.c | 19+++++++++++++++++++
Autils/invert.c | 19+++++++++++++++++++
Autils/mirror.sh | 3+++
Autils/move_00_U.txt | 1+
Autils/move_01_U2.txt | 1+
Autils/move_02_U3.txt | 1+
Autils/move_03_D.txt | 1+
Autils/move_04_D2.txt | 1+
Autils/move_05_D3.txt | 1+
Autils/move_06_R.txt | 1+
Autils/move_07_R2.txt | 1+
Autils/move_08_R3.txt | 1+
Autils/move_09_L.txt | 1+
Autils/move_10_L2.txt | 1+
Autils/move_11_L3.txt | 1+
Autils/move_12_F.txt | 1+
Autils/move_13_F2.txt | 1+
Autils/move_14_F3.txt | 1+
Autils/move_15_B.txt | 1+
Autils/move_16_B2.txt | 1+
Autils/move_17_B3.txt | 1+
Autils/move_table.txt | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Autils/solved.txt | 1+
Autils/trans_table.txt | 480+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Autils/transform_00_UFr.txt | 1+
Autils/transform_01_ULr.txt | 1+
Autils/transform_02_UBr.txt | 1+
Autils/transform_03_URr.txt | 1+
Autils/transform_04_DFr.txt | 1+
Autils/transform_05_DLr.txt | 1+
Autils/transform_06_DBr.txt | 1+
Autils/transform_07_DRr.txt | 1+
Autils/transform_08_RUr.txt | 1+
Autils/transform_09_RFr.txt | 1+
Autils/transform_10_RDr.txt | 1+
Autils/transform_11_RBr.txt | 1+
Autils/transform_12_LUr.txt | 1+
Autils/transform_13_LFr.txt | 1+
Autils/transform_14_LDr.txt | 1+
Autils/transform_15_LBr.txt | 1+
Autils/transform_16_FUr.txt | 1+
Autils/transform_17_FRr.txt | 1+
Autils/transform_18_FDr.txt | 1+
Autils/transform_19_FLr.txt | 1+
Autils/transform_20_BUr.txt | 1+
Autils/transform_21_BRr.txt | 1+
Autils/transform_22_BDr.txt | 1+
Autils/transform_23_BLr.txt | 1+
Autils/transform_24_UFm.txt | 1+
Autils/transform_25_ULm.txt | 1+
Autils/transform_26_UBm.txt | 1+
Autils/transform_27_URm.txt | 1+
Autils/transform_28_DFm.txt | 1+
Autils/transform_29_DLm.txt | 1+
Autils/transform_30_DBm.txt | 1+
Autils/transform_31_DRm.txt | 1+
Autils/transform_32_RUm.txt | 1+
Autils/transform_33_RFm.txt | 1+
Autils/transform_34_RDm.txt | 1+
Autils/transform_35_RBm.txt | 1+
Autils/transform_36_LUm.txt | 1+
Autils/transform_37_LFm.txt | 1+
Autils/transform_38_LDm.txt | 1+
Autils/transform_39_LBm.txt | 1+
Autils/transform_40_FUm.txt | 1+
Autils/transform_41_FRm.txt | 1+
Autils/transform_42_FDm.txt | 1+
Autils/transform_43_FLm.txt | 1+
Autils/transform_44_BUm.txt | 1+
Autils/transform_45_BRm.txt | 1+
Autils/transform_46_BDm.txt | 1+
Autils/transform_47_BLm.txt | 1+
Autils/transform_moves.txt | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77 files changed, 1563 insertions(+), 685 deletions(-)

diff --git a/cube.c b/cube.c @@ -27,10 +27,6 @@ #endif -/****************************************************************************** -Section: mathematical constants -******************************************************************************/ - #define _2p11 2048U #define _2p12 4096U #define _3p7 2187U @@ -38,94 +34,6 @@ Section: mathematical constants #define _12c4 495U #define _8c4 70U -_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}, - {1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {1, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0}, - {1, 4, 6, 4, 1, 0, 0, 0, 0, 0, 0, 0}, - {1, 5, 10, 10, 5, 1, 0, 0, 0, 0, 0, 0}, - {1, 6, 15, 20, 15, 6, 1, 0, 0, 0, 0, 0}, - {1, 7, 21, 35, 35, 21, 7, 1, 0, 0, 0, 0}, - {1, 8, 28, 56, 70, 56, 28, 8, 1, 0, 0, 0}, - {1, 9, 36, 84, 126, 126, 84, 36, 9, 1, 0, 0}, - {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0}, - {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1}, -}; - -/****************************************************************************** -Section: moves definitions and tables -******************************************************************************/ - -#define U 0U -#define U2 1U -#define U3 2U -#define D 3U -#define D2 4U -#define D3 5U -#define R 6U -#define R2 7U -#define R3 8U -#define L 9U -#define L2 10U -#define L3 11U -#define F 12U -#define F2 13U -#define F3 14U -#define B 15U -#define B2 16U -#define B3 17U - -#define UFr 0 -#define ULr 1 -#define UBr 2 -#define URr 3 -#define DFr 4 -#define DLr 5 -#define DBr 6 -#define DRr 7 -#define RUr 8 -#define RFr 9 -#define RDr 10 -#define RBr 11 -#define LUr 12 -#define LFr 13 -#define LDr 14 -#define LBr 15 -#define FUr 16 -#define FRr 17 -#define FDr 18 -#define FLr 19 -#define BUr 20 -#define BRr 21 -#define BDr 22 -#define BLr 23 - -#define UFm 24 -#define ULm 25 -#define UBm 26 -#define URm 27 -#define DFm 28 -#define DLm 29 -#define DBm 30 -#define DRm 31 -#define RUm 32 -#define RFm 33 -#define RDm 34 -#define RBm 35 -#define LUm 36 -#define LFm 37 -#define LDm 38 -#define LBm 39 -#define FUm 40 -#define FRm 41 -#define FDm 42 -#define FLm 43 -#define BUm 44 -#define BRm 45 -#define BDm 46 -#define BLm 47 - #define _c_ufr 0U #define _c_ubl 1U #define _c_dfl 2U @@ -163,406 +71,29 @@ Section: moves definitions and tables #define _eflip 0x10U #define _error 0xFFU +typedef enum { + U, U2, U3, D, D2, D3, + R, R2, R3, L, L2, L3, + F, F2, F3, B, B2, B3 +} move_t; + +typedef enum { + UFr, ULr, UBr, URr, DFr, DLr, DBr, DRr, + RUr, RFr, RDr, RBr, LUr, LFr, LDr, LBr, + FUr, FRr, FDr, FLr, BUr, BRr, BDr, BLr, + + UFm, ULm, UBm, URm, DFm, DLm, DBm, DRm, + RUm, RFm, RDm, RBm, LUm, LFm, LDm, LBm, + FUm, FRm, FDm, FLm, BUm, BRm, BDm, BLm +} trans_t; + _static cube_t zero = { .corner = {0}, .edge = {0} }; _static cube_t solved = { .corner = {0, 1, 2, 3, 4, 5, 6, 7}, .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} }; -#define zero_fast fastcube( \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) -#define solved_fast fastcube( \ - 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) - -#define _move_cube_U fastcube( \ - 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11) -#define _move_cube_U2 fastcube( \ - 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11) -#define _move_cube_U3 fastcube( \ - 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11) -#define _move_cube_D fastcube( \ - 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11) -#define _move_cube_D2 fastcube( \ - 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11) -#define _move_cube_D3 fastcube( \ - 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11) -#define _move_cube_R fastcube( \ - 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4) -#define _move_cube_R2 fastcube( \ - 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8) -#define _move_cube_R3 fastcube( \ - 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7) -#define _move_cube_L fastcube( \ - 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11) -#define _move_cube_L2 fastcube( \ - 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11) -#define _move_cube_L3 fastcube( \ - 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11) -#define _move_cube_F fastcube( \ - 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11) -#define _move_cube_F2 fastcube( \ - 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11) -#define _move_cube_F3 fastcube( \ - 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11) -#define _move_cube_B fastcube( \ - 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18) -#define _move_cube_B2 fastcube( \ - 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10) -#define _move_cube_B3 fastcube( \ - 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17) - -#define _trans_cube_UFr fastcube( \ - 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 fastcube( \ - 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) -#define _trans_cube_ULr fastcube( \ - 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 fastcube( \ - 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) -#define _trans_cube_UBr fastcube( \ - 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 fastcube( \ - 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) -#define _trans_cube_URr fastcube( \ - 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 fastcube( \ - 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) -#define _trans_cube_DFr fastcube( \ - 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 fastcube( \ - 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) -#define _trans_cube_DLr fastcube( \ - 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 fastcube( \ - 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) -#define _trans_cube_DBr fastcube( \ - 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 fastcube( \ - 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) -#define _trans_cube_DRr fastcube( \ - 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 fastcube( \ - 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) -#define _trans_cube_RUr fastcube( \ - 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 fastcube( \ - 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) -#define _trans_cube_RFr fastcube( \ - 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 fastcube( \ - 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) -#define _trans_cube_RDr fastcube( \ - 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 fastcube( \ - 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) -#define _trans_cube_RBr fastcube( \ - 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 fastcube( \ - 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) -#define _trans_cube_LUr fastcube( \ - 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 fastcube( \ - 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) -#define _trans_cube_LFr fastcube( \ - 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 fastcube( \ - 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) -#define _trans_cube_LDr fastcube( \ - 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 fastcube( \ - 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) -#define _trans_cube_LBr fastcube( \ - 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 fastcube( \ - 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) -#define _trans_cube_FUr fastcube( \ - 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 fastcube( \ - 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) -#define _trans_cube_FRr fastcube( \ - 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 fastcube( \ - 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) -#define _trans_cube_FDr fastcube( \ - 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 fastcube( \ - 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) -#define _trans_cube_FLr fastcube( \ - 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 fastcube( \ - 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) -#define _trans_cube_BUr fastcube( \ - 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 fastcube( \ - 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) -#define _trans_cube_BRr fastcube( \ - 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 fastcube( \ - 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) -#define _trans_cube_BDr fastcube( \ - 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 fastcube( \ - 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) -#define _trans_cube_BLr fastcube( \ - 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 fastcube( \ - 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) -#define _trans_cube_UFm fastcube( \ - 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 fastcube( \ - 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) -#define _trans_cube_ULm fastcube( \ - 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 fastcube( \ - 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) -#define _trans_cube_UBm fastcube( \ - 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 fastcube( \ - 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) -#define _trans_cube_URm fastcube( \ - 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 fastcube( \ - 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) -#define _trans_cube_DFm fastcube( \ - 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 fastcube( \ - 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) -#define _trans_cube_DLm fastcube( \ - 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 fastcube( \ - 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) -#define _trans_cube_DBm fastcube( \ - 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 fastcube( \ - 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) -#define _trans_cube_DRm fastcube( \ - 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 fastcube( \ - 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) -#define _trans_cube_RUm fastcube( \ - 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 fastcube( \ - 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) -#define _trans_cube_RFm fastcube( \ - 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 fastcube( \ - 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) -#define _trans_cube_RDm fastcube( \ - 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 fastcube( \ - 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) -#define _trans_cube_RBm fastcube( \ - 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 fastcube( \ - 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) -#define _trans_cube_LUm fastcube( \ - 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 fastcube( \ - 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) -#define _trans_cube_LFm fastcube( \ - 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 fastcube( \ - 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) -#define _trans_cube_LDm fastcube( \ - 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 fastcube( \ - 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) -#define _trans_cube_LBm fastcube( \ - 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 fastcube( \ - 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) -#define _trans_cube_FUm fastcube( \ - 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 fastcube( \ - 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) -#define _trans_cube_FRm fastcube( \ - 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 fastcube( \ - 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) -#define _trans_cube_FDm fastcube( \ - 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 fastcube( \ - 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) -#define _trans_cube_FLm fastcube( \ - 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 fastcube( \ - 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) -#define _trans_cube_BUm fastcube( \ - 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 fastcube( \ - 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) -#define _trans_cube_BRm fastcube( \ - 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 fastcube( \ - 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) -#define _trans_cube_BDm fastcube( \ - 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 fastcube( \ - 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) -#define _trans_cube_BLm fastcube( \ - 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 fastcube( \ - 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) - -_static char *cornerstr[] = { - [_c_ufr] = "UFR", - [_c_ubl] = "UBL", - [_c_dfl] = "DFL", - [_c_dbr] = "DBR", - [_c_ufl] = "UFL", - [_c_ubr] = "UBR", - [_c_dfr] = "DFR", - [_c_dbl] = "DBL" -}; - -_static char *cornerstralt[] = { - [_c_ufr] = "URF", - [_c_ubl] = "ULB", - [_c_dfl] = "DLF", - [_c_dbr] = "DRB", - [_c_ufl] = "ULF", - [_c_ubr] = "URB", - [_c_dfr] = "DRF", - [_c_dbl] = "DLB" -}; - -_static char *edgestr[] = { - [_e_uf] = "UF", - [_e_ub] = "UB", - [_e_db] = "DB", - [_e_df] = "DF", - [_e_ur] = "UR", - [_e_ul] = "UL", - [_e_dl] = "DL", - [_e_dr] = "DR", - [_e_fr] = "FR", - [_e_fl] = "FL", - [_e_bl] = "BL", - [_e_br] = "BR" -}; - -_static char *movestr[] = { - [U] = "U", - [U2] = "U2", - [U3] = "U'", - [D] = "D", - [D2] = "D2", - [D3] = "D'", - [R] = "R", - [R2] = "R2", - [R3] = "R'", - [L] = "L", - [L2] = "L2", - [L3] = "L'", - [F] = "F", - [F2] = "F2", - [F3] = "F'", - [B] = "B", - [B2] = "B2", - [B3] = "B'", -}; - -_static char *transstr[] = { - [UFr] = "rotation UF", - [UFm] = "mirrored UF", - [ULr] = "rotation UL", - [ULm] = "mirrored UL", - [UBr] = "rotation UB", - [UBm] = "mirrored UB", - [URr] = "rotation UR", - [URm] = "mirrored UR", - [DFr] = "rotation DF", - [DFm] = "mirrored DF", - [DLr] = "rotation DL", - [DLm] = "mirrored DL", - [DBr] = "rotation DB", - [DBm] = "mirrored DB", - [DRr] = "rotation DR", - [DRm] = "mirrored DR", - [RUr] = "rotation RU", - [RUm] = "mirrored RU", - [RFr] = "rotation RF", - [RFm] = "mirrored RF", - [RDr] = "rotation RD", - [RDm] = "mirrored RD", - [RBr] = "rotation RB", - [RBm] = "mirrored RB", - [LUr] = "rotation LU", - [LUm] = "mirrored LU", - [LFr] = "rotation LF", - [LFm] = "mirrored LF", - [LDr] = "rotation LD", - [LDm] = "mirrored LD", - [LBr] = "rotation LB", - [LBm] = "mirrored LB", - [FUr] = "rotation FU", - [FUm] = "mirrored FU", - [FRr] = "rotation FR", - [FRm] = "mirrored FR", - [FDr] = "rotation FD", - [FDm] = "mirrored FD", - [FLr] = "rotation FL", - [FLm] = "mirrored FL", - [BUr] = "rotation BU", - [BUm] = "mirrored BU", - [BRr] = "rotation BR", - [BRm] = "mirrored BR", - [BDr] = "rotation BD", - [BDm] = "mirrored BD", - [BLr] = "rotation BL", - [BLm] = "mirrored BL", -}; - -static uint8_t inverse_trans_table[48] = { - [UFr] = UFr, - [UFm] = UFm, - [ULr] = URr, - [ULm] = ULm, - [UBr] = UBr, - [UBm] = UBm, - [URr] = ULr, - [URm] = URm, - [DFr] = DFr, - [DFm] = DFm, - [DLr] = DLr, - [DLm] = DRm, - [DBr] = DBr, - [DBm] = DBm, - [DRr] = DRr, - [DRm] = DLm, - [RUr] = FRr, - [RUm] = FLm, - [RFr] = LFr, - [RFm] = RFm, - [RDr] = BLr, - [RDm] = BRm, - [RBr] = RBr, - [RBm] = LBm, - [LUr] = FLr, - [LUm] = FRm, - [LFr] = RFr, - [LFm] = LFm, - [LDr] = BRr, - [LDm] = BLm, - [LBr] = LBr, - [LBm] = RBm, - [FUr] = FUr, - [FUm] = FUm, - [FRr] = RUr, - [FRm] = LUm, - [FDr] = BUr, - [FDm] = BUm, - [FLr] = LUr, - [FLm] = RUm, - [BUr] = FDr, - [BUm] = FDm, - [BRr] = LDr, - [BRm] = RDm, - [BDr] = BDr, - [BDm] = BDm, - [BLr] = RDr, - [BLm] = LDm, -}; +#include "tables.h" /****************************************************************************** Section: portable fast methods @@ -574,12 +105,6 @@ in the previous section(s) for unsupported architectures. typedef cube_t cube_fast_t; -_static_inline cube_fast_t fastcube( - uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, - uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, - uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, - uint8_t, uint8_t, uint8_t, uint8_t, uint8_t -); _static cube_fast_t cubetofast(cube_t); _static cube_t fasttocube(cube_fast_t); _static_inline bool equal_fast(cube_fast_t, cube_fast_t); @@ -590,44 +115,6 @@ _static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); _static_inline int64_t coord_fast_co(cube_fast_t); _static_inline int64_t coord_fast_eo(cube_fast_t); -_static_inline cube_fast_t -fastcube( - uint8_t c_ufr, - uint8_t c_ubl, - uint8_t c_dfl, - uint8_t c_dbr, - uint8_t c_ufl, - uint8_t c_ubr, - uint8_t c_dfr, - uint8_t c_dbl, - - uint8_t e_uf, - uint8_t e_ub, - uint8_t e_db, - uint8_t e_df, - uint8_t e_ur, - uint8_t e_ul, - uint8_t e_dl, - uint8_t e_dr, - uint8_t e_fr, - uint8_t e_fl, - uint8_t e_bl, - uint8_t e_br -) -{ - cube_fast_t cube = { - .corner = { - c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl - }, - .edge = { - e_uf, e_ub, e_db, e_df, e_ur, e_ul, - e_dl, e_dr, e_fr, e_fl, e_bl, e_br - } - }; - - return cube; -} - _static cube_fast_t cubetofast(cube_t cube) { @@ -662,7 +149,7 @@ equal_fast(cube_fast_t c1, cube_fast_t c2) _static_inline bool issolved_fast(cube_fast_t cube) { - return equal_fast(cube, solved_fast); + return equal_fast(cube, solved); } _static_inline cube_fast_t @@ -687,7 +174,7 @@ compose_fast(cube_fast_t c1, cube_fast_t c2) cube_fast_t ret; uint8_t i, piece1, piece2, p, orien, aux, auy; - ret = zero_fast; + ret = zero; for (i = 0; i < 12; i++) { piece2 = c2.edge[i]; @@ -742,14 +229,7 @@ Some of these routines depend on the efficient functions implemented in the previous sections, while some other operate directly on the cube. ******************************************************************************/ -#define _move(M, c) compose_fast(c, _move_cube_ ## M) #define _premove(M, c) compose_fast(_move_cube_ ## M, c) -#define _trans_rotation(T, c) \ - compose_fast(compose_fast(_trans_cube_ ## T, c), \ - _trans_cube_ ## T ## _inverse) -#define _trans_mirrored(T, c) \ - invertco_fast(compose_fast(compose_fast(_trans_cube_ ## T, c), \ - _trans_cube_ ## T ## _inverse)) #define _foreach_move(_m, _c, _d, instruction) \ for (_m = 0; _m < 18; _m++) { _d = move(_c, _m); instruction } @@ -785,8 +265,8 @@ _static uint8_t readmodifier(char); _static uint8_t readtrans(char *); _static int writemoves(uint8_t *, int, char *); _static void writetrans(uint8_t, char *); -_static cube_fast_t move(cube_fast_t, uint8_t); -_static cube_fast_t transform(cube_fast_t, uint8_t); +_static cube_fast_t move(cube_fast_t, move_t); +_static cube_fast_t transform(cube_fast_t, trans_t); cube_t solvedcube(void) @@ -1339,155 +819,22 @@ writetrans(uint8_t t, char *buf) } _static cube_fast_t -move(cube_fast_t c, uint8_t m) +move(cube_fast_t c, move_t m) { - switch (m) { - case U: - return _move(U, c); - case U2: - return _move(U2, c); - case U3: - return _move(U3, c); - case D: - return _move(D, c); - case D2: - return _move(D2, c); - case D3: - return _move(D3, c); - case R: - return _move(R, c); - case R2: - return _move(R2, c); - case R3: - return _move(R3, c); - case L: - return _move(L, c); - case L2: - return _move(L2, c); - case L3: - return _move(L3, c); - case F: - return _move(F, c); - case F2: - return _move(F2, c); - case F3: - return _move(F3, c); - case B: - return _move(B, c); - case B2: - return _move(B2, c); - case B3: - return _move(B3, c); - default: - DBG_LOG("move error, unknown move\n"); - return zero_fast; - } + return compose_fast(c, move_table[m]); } _static cube_fast_t -transform(cube_fast_t c, uint8_t t) +transform(cube_fast_t c, trans_t t) { - switch (t) { - case UFr: - return _trans_rotation(UFr, c); - case ULr: - return _trans_rotation(ULr, c); - case UBr: - return _trans_rotation(UBr, c); - case URr: - return _trans_rotation(URr, c); - case DFr: - return _trans_rotation(DFr, c); - case DLr: - return _trans_rotation(DLr, c); - case DBr: - return _trans_rotation(DBr, c); - case DRr: - return _trans_rotation(DRr, c); - case RUr: - return _trans_rotation(RUr, c); - case RFr: - return _trans_rotation(RFr, c); - case RDr: - return _trans_rotation(RDr, c); - case RBr: - return _trans_rotation(RBr, c); - case LUr: - return _trans_rotation(LUr, c); - case LFr: - return _trans_rotation(LFr, c); - case LDr: - return _trans_rotation(LDr, c); - case LBr: - return _trans_rotation(LBr, c); - case FUr: - return _trans_rotation(FUr, c); - case FRr: - return _trans_rotation(FRr, c); - case FDr: - return _trans_rotation(FDr, c); - case FLr: - return _trans_rotation(FLr, c); - case BUr: - return _trans_rotation(BUr, c); - case BRr: - return _trans_rotation(BRr, c); - case BDr: - return _trans_rotation(BDr, c); - case BLr: - return _trans_rotation(BLr, c); - case UFm: - return _trans_mirrored(UFm, c); - case ULm: - return _trans_mirrored(ULm, c); - case UBm: - return _trans_mirrored(UBm, c); - case URm: - return _trans_mirrored(URm, c); - case DFm: - return _trans_mirrored(DFm, c); - case DLm: - return _trans_mirrored(DLm, c); - case DBm: - return _trans_mirrored(DBm, c); - case DRm: - return _trans_mirrored(DRm, c); - case RUm: - return _trans_mirrored(RUm, c); - case RFm: - return _trans_mirrored(RFm, c); - case RDm: - return _trans_mirrored(RDm, c); - case RBm: - return _trans_mirrored(RBm, c); - case LUm: - return _trans_mirrored(LUm, c); - case LFm: - return _trans_mirrored(LFm, c); - case LDm: - return _trans_mirrored(LDm, c); - case LBm: - return _trans_mirrored(LBm, c); - case FUm: - return _trans_mirrored(FUm, c); - case FRm: - return _trans_mirrored(FRm, c); - case FDm: - return _trans_mirrored(FDm, c); - case FLm: - return _trans_mirrored(FLm, c); - case BUm: - return _trans_mirrored(BUm, c); - case BRm: - return _trans_mirrored(BRm, c); - case BDm: - return _trans_mirrored(BDm, c); - case BLm: - return _trans_mirrored(BLm, c); - default: - DBG_LOG("transform error, unknown transformation\n"); - return zero_fast; - } + cube_t tcube, tinv; + + tcube = trans_table[t][NORMAL]; + tinv = trans_table[t][INVERSE]; + + return t < 24 ? + compose_fast(compose_fast(tcube, c), tinv) : + invertco_fast(compose_fast(compose_fast(tcube, c), tinv)); } /****************************************************************************** diff --git a/tables.h b/tables.h @@ -0,0 +1,720 @@ +#define NORMAL 0 +#define INVERSE 1 + +_static cube_t move_table[] = { + [U] = { + .corner = {5, 4, 2, 3, 0, 1, 6, 7}, + .edge = {4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11} + }, + [U2] = { + .corner = {1, 0, 2, 3, 5, 4, 6, 7}, + .edge = {1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11} + }, + [U3] = { + .corner = {4, 5, 2, 3, 1, 0, 6, 7}, + .edge = {5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11} + }, + [D] = { + .corner = {0, 1, 7, 6, 4, 5, 2, 3}, + .edge = {0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11} + }, + [D2] = { + .corner = {0, 1, 3, 2, 4, 5, 7, 6}, + .edge = {0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11} + }, + [D3] = { + .corner = {0, 1, 6, 7, 4, 5, 3, 2}, + .edge = {0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11} + }, + [R] = { + .corner = {70, 1, 2, 69, 4, 32, 35, 7}, + .edge = {0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4} + }, + [R2] = { + .corner = {3, 1, 2, 0, 4, 6, 5, 7}, + .edge = {0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8} + }, + [R3] = { + .corner = {69, 1, 2, 70, 4, 35, 32, 7}, + .edge = {0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7} + }, + [L] = { + .corner = {0, 71, 68, 3, 33, 5, 6, 34}, + .edge = {0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11} + }, + [L2] = { + .corner = {0, 2, 1, 3, 7, 5, 6, 4}, + .edge = {0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11} + }, + [L3] = { + .corner = {0, 68, 71, 3, 34, 5, 6, 33}, + .edge = {0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11} + }, + [F] = { + .corner = {36, 1, 38, 3, 66, 5, 64, 7}, + .edge = {25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11} + }, + [F2] = { + .corner = {2, 1, 0, 3, 6, 5, 4, 7}, + .edge = {3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11} + }, + [F3] = { + .corner = {38, 1, 36, 3, 64, 5, 66, 7}, + .edge = {24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11} + }, + [B] = { + .corner = {0, 37, 2, 39, 4, 67, 6, 65}, + .edge = {0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18} + }, + [B2] = { + .corner = {0, 3, 2, 1, 4, 7, 6, 5}, + .edge = {0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10} + }, + [B3] = { + .corner = {0, 39, 2, 37, 4, 65, 6, 67}, + .edge = {0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17} + }, +}; + +_static cube_t trans_table[][2] = { + [UFr] = { + [NORMAL] = { + .corner = {0, 1, 2, 3, 4, 5, 6, 7}, + .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} + }, + [INVERSE] = { + .corner = {0, 1, 2, 3, 4, 5, 6, 7}, + .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} + } + }, + [ULr] = { + [NORMAL] = { + .corner = {4, 5, 7, 6, 1, 0, 2, 3}, + .edge = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24} + }, + [INVERSE] = { + .corner = {5, 4, 6, 7, 0, 1, 3, 2}, + .edge = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26} + } + }, + [UBr] = { + [NORMAL] = { + .corner = {1, 0, 3, 2, 5, 4, 7, 6}, + .edge = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9} + }, + [INVERSE] = { + .corner = {1, 0, 3, 2, 5, 4, 7, 6}, + .edge = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9} + } + }, + [URr] = { + [NORMAL] = { + .corner = {5, 4, 6, 7, 0, 1, 3, 2}, + .edge = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26} + }, + [INVERSE] = { + .corner = {4, 5, 7, 6, 1, 0, 2, 3}, + .edge = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24} + } + }, + [DFr] = { + [NORMAL] = { + .corner = {2, 3, 0, 1, 6, 7, 4, 5}, + .edge = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10} + }, + [INVERSE] = { + .corner = {2, 3, 0, 1, 6, 7, 4, 5}, + .edge = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10} + } + }, + [DLr] = { + [NORMAL] = { + .corner = {7, 6, 4, 5, 2, 3, 1, 0}, + .edge = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27} + }, + [INVERSE] = { + .corner = {7, 6, 4, 5, 2, 3, 1, 0}, + .edge = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27} + } + }, + [DBr] = { + [NORMAL] = { + .corner = {3, 2, 1, 0, 7, 6, 5, 4}, + .edge = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8} + }, + [INVERSE] = { + .corner = {3, 2, 1, 0, 7, 6, 5, 4}, + .edge = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8} + } + }, + [DRr] = { + [NORMAL] = { + .corner = {6, 7, 5, 4, 3, 2, 0, 1}, + .edge = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25} + }, + [INVERSE] = { + .corner = {6, 7, 5, 4, 3, 2, 0, 1}, + .edge = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25} + } + }, + [RUr] = { + [NORMAL] = { + .corner = {64, 67, 65, 66, 37, 38, 36, 39}, + .edge = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3} + }, + [INVERSE] = { + .corner = {32, 34, 35, 33, 70, 68, 69, 71}, + .edge = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21} + } + }, + [RFr] = { + [NORMAL] = { + .corner = {38, 37, 36, 39, 64, 67, 66, 65}, + .edge = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18} + }, + [INVERSE] = { + .corner = {36, 39, 38, 37, 66, 65, 64, 67}, + .edge = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17} + } + }, + [RDr] = { + [NORMAL] = { + .corner = {67, 64, 66, 65, 38, 37, 39, 36}, + .edge = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1} + }, + [INVERSE] = { + .corner = {33, 35, 34, 32, 71, 69, 68, 70}, + .edge = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20} + } + }, + [RBr] = { + [NORMAL] = { + .corner = {37, 38, 39, 36, 67, 64, 65, 66}, + .edge = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16} + }, + [INVERSE] = { + .corner = {37, 38, 39, 36, 67, 64, 65, 66}, + .edge = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16} + } + }, + [LUr] = { + [NORMAL] = { + .corner = {65, 66, 64, 67, 36, 39, 37, 38}, + .edge = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2} + }, + [INVERSE] = { + .corner = {34, 32, 33, 35, 68, 70, 71, 69}, + .edge = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23} + } + }, + [LFr] = { + [NORMAL] = { + .corner = {36, 39, 38, 37, 66, 65, 64, 67}, + .edge = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17} + }, + [INVERSE] = { + .corner = {38, 37, 36, 39, 64, 67, 66, 65}, + .edge = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18} + } + }, + [LDr] = { + [NORMAL] = { + .corner = {66, 65, 67, 64, 39, 36, 38, 37}, + .edge = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0} + }, + [INVERSE] = { + .corner = {35, 33, 32, 34, 69, 71, 70, 68}, + .edge = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22} + } + }, + [LBr] = { + [NORMAL] = { + .corner = {39, 36, 37, 38, 65, 66, 67, 64}, + .edge = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19} + }, + [INVERSE] = { + .corner = {39, 36, 37, 38, 65, 66, 67, 64}, + .edge = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19} + } + }, + [FUr] = { + [NORMAL] = { + .corner = {68, 70, 69, 71, 32, 34, 33, 35}, + .edge = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6} + }, + [INVERSE] = { + .corner = {68, 70, 69, 71, 32, 34, 33, 35}, + .edge = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6} + } + }, + [FRr] = { + [NORMAL] = { + .corner = {32, 34, 35, 33, 70, 68, 69, 71}, + .edge = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21} + }, + [INVERSE] = { + .corner = {64, 67, 65, 66, 37, 38, 36, 39}, + .edge = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3} + } + }, + [FDr] = { + [NORMAL] = { + .corner = {70, 68, 71, 69, 34, 32, 35, 33}, + .edge = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4} + }, + [INVERSE] = { + .corner = {69, 71, 68, 70, 33, 35, 32, 34}, + .edge = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7} + } + }, + [FLr] = { + [NORMAL] = { + .corner = {34, 32, 33, 35, 68, 70, 71, 69}, + .edge = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23} + }, + [INVERSE] = { + .corner = {65, 66, 64, 67, 36, 39, 37, 38}, + .edge = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2} + } + }, + [BUr] = { + [NORMAL] = { + .corner = {69, 71, 68, 70, 33, 35, 32, 34}, + .edge = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7} + }, + [INVERSE] = { + .corner = {70, 68, 71, 69, 34, 32, 35, 33}, + .edge = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4} + } + }, + [BRr] = { + [NORMAL] = { + .corner = {35, 33, 32, 34, 69, 71, 70, 68}, + .edge = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22} + }, + [INVERSE] = { + .corner = {66, 65, 67, 64, 39, 36, 38, 37}, + .edge = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0} + } + }, + [BDr] = { + [NORMAL] = { + .corner = {71, 69, 70, 68, 35, 33, 34, 32}, + .edge = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5} + }, + [INVERSE] = { + .corner = {71, 69, 70, 68, 35, 33, 34, 32}, + .edge = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5} + } + }, + [BLr] = { + [NORMAL] = { + .corner = {33, 35, 34, 32, 71, 69, 68, 70}, + .edge = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20} + }, + [INVERSE] = { + .corner = {67, 64, 66, 65, 38, 37, 39, 36}, + .edge = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1} + } + }, + [UFm] = { + [NORMAL] = { + .corner = {4, 5, 6, 7, 0, 1, 2, 3}, + .edge = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10} + }, + [INVERSE] = { + .corner = {4, 5, 6, 7, 0, 1, 2, 3}, + .edge = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10} + } + }, + [ULm] = { + [NORMAL] = { + .corner = {0, 1, 3, 2, 5, 4, 6, 7}, + .edge = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25} + }, + [INVERSE] = { + .corner = {0, 1, 3, 2, 5, 4, 6, 7}, + .edge = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25} + } + }, + [UBm] = { + [NORMAL] = { + .corner = {5, 4, 7, 6, 1, 0, 3, 2}, + .edge = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8} + }, + [INVERSE] = { + .corner = {5, 4, 7, 6, 1, 0, 3, 2}, + .edge = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8} + } + }, + [URm] = { + [NORMAL] = { + .corner = {1, 0, 2, 3, 4, 5, 7, 6}, + .edge = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27} + }, + [INVERSE] = { + .corner = {1, 0, 2, 3, 4, 5, 7, 6}, + .edge = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27} + } + }, + [DFm] = { + [NORMAL] = { + .corner = {6, 7, 4, 5, 2, 3, 0, 1}, + .edge = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11} + }, + [INVERSE] = { + .corner = {6, 7, 4, 5, 2, 3, 0, 1}, + .edge = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11} + } + }, + [DLm] = { + [NORMAL] = { + .corner = {3, 2, 0, 1, 6, 7, 5, 4}, + .edge = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26} + }, + [INVERSE] = { + .corner = {2, 3, 1, 0, 7, 6, 4, 5}, + .edge = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24} + } + }, + [DBm] = { + [NORMAL] = { + .corner = {7, 6, 5, 4, 3, 2, 1, 0}, + .edge = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9} + }, + [INVERSE] = { + .corner = {7, 6, 5, 4, 3, 2, 1, 0}, + .edge = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9} + } + }, + [DRm] = { + [NORMAL] = { + .corner = {2, 3, 1, 0, 7, 6, 4, 5}, + .edge = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24} + }, + [INVERSE] = { + .corner = {3, 2, 0, 1, 6, 7, 5, 4}, + .edge = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26} + } + }, + [RUm] = { + [NORMAL] = { + .corner = {68, 71, 69, 70, 33, 34, 32, 35}, + .edge = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3} + }, + [INVERSE] = { + .corner = {70, 68, 69, 71, 32, 34, 35, 33}, + .edge = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22} + } + }, + [RFm] = { + [NORMAL] = { + .corner = {34, 33, 32, 35, 68, 71, 70, 69}, + .edge = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18} + }, + [INVERSE] = { + .corner = {66, 65, 64, 67, 36, 39, 38, 37}, + .edge = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18} + } + }, + [RDm] = { + [NORMAL] = { + .corner = {71, 68, 70, 69, 34, 33, 35, 32}, + .edge = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1} + }, + [INVERSE] = { + .corner = {71, 69, 68, 70, 33, 35, 34, 32}, + .edge = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23} + } + }, + [RBm] = { + [NORMAL] = { + .corner = {33, 34, 35, 32, 71, 68, 69, 70}, + .edge = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16} + }, + [INVERSE] = { + .corner = {67, 64, 65, 66, 37, 38, 39, 36}, + .edge = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19} + } + }, + [LUm] = { + [NORMAL] = { + .corner = {69, 70, 68, 71, 32, 35, 33, 34}, + .edge = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2} + }, + [INVERSE] = { + .corner = {68, 70, 71, 69, 34, 32, 33, 35}, + .edge = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20} + } + }, + [LFm] = { + [NORMAL] = { + .corner = {32, 35, 34, 33, 70, 69, 68, 71}, + .edge = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17} + }, + [INVERSE] = { + .corner = {64, 67, 66, 65, 38, 37, 36, 39}, + .edge = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17} + } + }, + [LDm] = { + [NORMAL] = { + .corner = {70, 69, 71, 68, 35, 32, 34, 33}, + .edge = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0} + }, + [INVERSE] = { + .corner = {69, 71, 70, 68, 35, 33, 32, 34}, + .edge = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21} + } + }, + [LBm] = { + [NORMAL] = { + .corner = {35, 32, 33, 34, 69, 70, 71, 68}, + .edge = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19} + }, + [INVERSE] = { + .corner = {65, 66, 67, 64, 39, 36, 37, 38}, + .edge = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16} + } + }, + [FUm] = { + [NORMAL] = { + .corner = {64, 66, 65, 67, 36, 38, 37, 39}, + .edge = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7} + }, + [INVERSE] = { + .corner = {32, 34, 33, 35, 68, 70, 69, 71}, + .edge = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7} + } + }, + [FRm] = { + [NORMAL] = { + .corner = {36, 38, 39, 37, 66, 64, 65, 67}, + .edge = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20} + }, + [INVERSE] = { + .corner = {37, 38, 36, 39, 64, 67, 65, 66}, + .edge = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2} + } + }, + [FDm] = { + [NORMAL] = { + .corner = {66, 64, 67, 65, 38, 36, 39, 37}, + .edge = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5} + }, + [INVERSE] = { + .corner = {33, 35, 32, 34, 69, 71, 68, 70}, + .edge = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6} + } + }, + [FLm] = { + [NORMAL] = { + .corner = {38, 36, 37, 39, 64, 66, 67, 65}, + .edge = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22} + }, + [INVERSE] = { + .corner = {36, 39, 37, 38, 65, 66, 64, 67}, + .edge = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3} + } + }, + [BUm] = { + [NORMAL] = { + .corner = {65, 67, 64, 66, 37, 39, 36, 38}, + .edge = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6} + }, + [INVERSE] = { + .corner = {34, 32, 35, 33, 70, 68, 71, 69}, + .edge = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5} + } + }, + [BRm] = { + [NORMAL] = { + .corner = {39, 37, 36, 38, 65, 67, 66, 64}, + .edge = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23} + }, + [INVERSE] = { + .corner = {39, 36, 38, 37, 66, 65, 67, 64}, + .edge = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1} + } + }, + [BDm] = { + [NORMAL] = { + .corner = {67, 65, 66, 64, 39, 37, 38, 36}, + .edge = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4} + }, + [INVERSE] = { + .corner = {35, 33, 34, 32, 71, 69, 70, 68}, + .edge = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4} + } + }, + [BLm] = { + [NORMAL] = { + .corner = {37, 39, 38, 36, 67, 65, 64, 66}, + .edge = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21} + }, + [INVERSE] = { + .corner = {38, 37, 39, 36, 67, 64, 66, 65}, + .edge = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0} + } + }, +}; + +_static char *cornerstr[] = { + [_c_ufr] = "UFR", + [_c_ubl] = "UBL", + [_c_dfl] = "DFL", + [_c_dbr] = "DBR", + [_c_ufl] = "UFL", + [_c_ubr] = "UBR", + [_c_dfr] = "DFR", + [_c_dbl] = "DBL" +}; + +_static char *cornerstralt[] = { + [_c_ufr] = "URF", + [_c_ubl] = "ULB", + [_c_dfl] = "DLF", + [_c_dbr] = "DRB", + [_c_ufl] = "ULF", + [_c_ubr] = "URB", + [_c_dfr] = "DRF", + [_c_dbl] = "DLB" +}; + +_static char *edgestr[] = { + [_e_uf] = "UF", + [_e_ub] = "UB", + [_e_db] = "DB", + [_e_df] = "DF", + [_e_ur] = "UR", + [_e_ul] = "UL", + [_e_dl] = "DL", + [_e_dr] = "DR", + [_e_fr] = "FR", + [_e_fl] = "FL", + [_e_bl] = "BL", + [_e_br] = "BR" +}; + +_static char *movestr[] = { + [U] = "U", + [U2] = "U2", + [U3] = "U'", + [D] = "D", + [D2] = "D2", + [D3] = "D'", + [R] = "R", + [R2] = "R2", + [R3] = "R'", + [L] = "L", + [L2] = "L2", + [L3] = "L'", + [F] = "F", + [F2] = "F2", + [F3] = "F'", + [B] = "B", + [B2] = "B2", + [B3] = "B'", +}; + +_static char *transstr[] = { + [UFr] = "rotation UF", + [UFm] = "mirrored UF", + [ULr] = "rotation UL", + [ULm] = "mirrored UL", + [UBr] = "rotation UB", + [UBm] = "mirrored UB", + [URr] = "rotation UR", + [URm] = "mirrored UR", + [DFr] = "rotation DF", + [DFm] = "mirrored DF", + [DLr] = "rotation DL", + [DLm] = "mirrored DL", + [DBr] = "rotation DB", + [DBm] = "mirrored DB", + [DRr] = "rotation DR", + [DRm] = "mirrored DR", + [RUr] = "rotation RU", + [RUm] = "mirrored RU", + [RFr] = "rotation RF", + [RFm] = "mirrored RF", + [RDr] = "rotation RD", + [RDm] = "mirrored RD", + [RBr] = "rotation RB", + [RBm] = "mirrored RB", + [LUr] = "rotation LU", + [LUm] = "mirrored LU", + [LFr] = "rotation LF", + [LFm] = "mirrored LF", + [LDr] = "rotation LD", + [LDm] = "mirrored LD", + [LBr] = "rotation LB", + [LBm] = "mirrored LB", + [FUr] = "rotation FU", + [FUm] = "mirrored FU", + [FRr] = "rotation FR", + [FRm] = "mirrored FR", + [FDr] = "rotation FD", + [FDm] = "mirrored FD", + [FLr] = "rotation FL", + [FLm] = "mirrored FL", + [BUr] = "rotation BU", + [BUm] = "mirrored BU", + [BRr] = "rotation BR", + [BRm] = "mirrored BR", + [BDr] = "rotation BD", + [BDm] = "mirrored BD", + [BLr] = "rotation BL", + [BLm] = "mirrored BL", +}; + +static uint8_t inverse_trans_table[48] = { + [UFr] = UFr, + [UFm] = UFm, + [ULr] = URr, + [ULm] = ULm, + [UBr] = UBr, + [UBm] = UBm, + [URr] = ULr, + [URm] = URm, + [DFr] = DFr, + [DFm] = DFm, + [DLr] = DLr, + [DLm] = DRm, + [DBr] = DBr, + [DBm] = DBm, + [DRr] = DRr, + [DRm] = DLm, + [RUr] = FRr, + [RUm] = FLm, + [RFr] = LFr, + [RFm] = RFm, + [RDr] = BLr, + [RDm] = BRm, + [RBr] = RBr, + [RBm] = LBm, + [LUr] = FLr, + [LUm] = FRm, + [LFr] = RFr, + [LFm] = LFm, + [LDr] = BRr, + [LDm] = BLm, + [LBr] = LBr, + [LBm] = RBm, + [FUr] = FUr, + [FUm] = FUm, + [FRr] = RUr, + [FRm] = LUm, + [FDr] = BUr, + [FDm] = BUm, + [FLr] = LUr, + [FLm] = RUm, + [BUr] = FDr, + [BUm] = FDm, + [BRr] = LDr, + [BRm] = RDm, + [BDr] = BDr, + [BDm] = BDm, + [BLr] = RDr, + [BLm] = LDm, +}; diff --git a/utils/genmovecode.sh b/utils/genmovecode.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +gcc -DDEBUG h48_to_lst.c ../cube.c -o h48_to_lst + +gen() { + for f in move_??_*.txt; do + move="$(echo $f | sed 's/.*_// ; s/\.txt//')" + lst="$(./h48_to_lst <$f)" + c="$(echo $lst | cut -d ' ' -f -8 | rev | cut -c 2- | rev)" + e="$(echo $lst | cut -d ' ' -f 9-)" + printf '[%s] = {\n' "$move" + printf '\t.corner = {%s},\n' "$c" + printf '\t.edge = {%s}\n' "$e" + printf '},\n' + done +} + +gen +rm -f h48_to_lst invert diff --git a/utils/gentranscode.sh b/utils/gentranscode.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +gcc -DDEBUG h48_to_lst.c ../cube.c -o h48_to_lst +gcc -DDEBUG invert.c ../cube.c -o invert + +lineavx() { printf '#define _trans_cube_%s ' "$1"; } +linesrc() { printf '_static cube_fast_t _trans_cube_%s = ' "$1"; } +sedavx() { sed '1,2s/$/ \\/ ; 3s/$/)/ ; 3q'; } +sedsrc() { sed '3s/$/ };/ ; 3q'; } + +gen() { + for f in transform_??_???.txt; do + trans="$(echo $f | sed 's/.*_// ; s/\.txt//')" + printf '[%s] = {\n' "$trans" + + printf '\t[NORMAL] = {\n' + lst="$(./h48_to_lst <"$f")" + c="$(echo $lst | cut -d ' ' -f -8 | rev | cut -c 2- | rev)" + e="$(echo $lst | cut -d ' ' -f 9-)" + printf '\t\t.corner = {%s},\n' "$c" + printf '\t\t.edge = {%s}\n' "$e" + printf '\t},\n' + + printf '\t[INVERSE] = {\n' + inv="$(./invert <"$f" | ./h48_to_lst)" + c="$(echo $inv | cut -d ' ' -f -8 | rev | cut -c 2- | rev)" + e="$(echo $inv | cut -d ' ' -f 9-)" + printf '\t\t.corner = {%s},\n' "$c" + printf '\t\t.edge = {%s}\n' "$e" + printf '\t}\n' + + printf '},\n' + done +} + +gen +rm -f h48_to_lst invert diff --git a/utils/h48_to_lst.c b/utils/h48_to_lst.c @@ -0,0 +1,19 @@ +#include <stdio.h> +#include <inttypes.h> +#include <stdbool.h> + +#include "../cube.h" + +#define STRLENMAX 1000 + +int main(void) { + char str[STRLENMAX]; + cube_t cube; + + fgets(str, STRLENMAX, stdin); + cube = readcube("H48", str); + writecube("LST", cube, str); + fputs(str, stdout); + + return 0; +} diff --git a/utils/invert.c b/utils/invert.c @@ -0,0 +1,19 @@ +#include <stdio.h> +#include <inttypes.h> +#include <stdbool.h> + +#include "../cube.h" + +#define STRLENMAX 1000 + +int main(void) { + char str[STRLENMAX]; + cube_t cube; + + fgets(str, STRLENMAX, stdin); + cube = readcube("H48", str); + writecube("H48", inverse(cube), str); + fputs(str, stdout); + + return 0; +} diff --git a/utils/mirror.sh b/utils/mirror.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +tr 'LR' 'RL' diff --git a/utils/move_00_U.txt b/utils/move_00_U.txt @@ -0,0 +1 @@ +UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0 diff --git a/utils/move_01_U2.txt b/utils/move_01_U2.txt @@ -0,0 +1 @@ +UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0 diff --git a/utils/move_02_U3.txt b/utils/move_02_U3.txt @@ -0,0 +1 @@ +UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0 diff --git a/utils/move_03_D.txt b/utils/move_03_D.txt @@ -0,0 +1 @@ +UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0 diff --git a/utils/move_04_D2.txt b/utils/move_04_D2.txt @@ -0,0 +1 @@ +UF0 UB0 DF0 DB0 UR0 UL0 DR0 DL0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBR0 DFL0 UFL0 UBR0 DBL0 DFR0 diff --git a/utils/move_05_D3.txt b/utils/move_05_D3.txt @@ -0,0 +1 @@ +UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0 diff --git a/utils/move_06_R.txt b/utils/move_06_R.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0 diff --git a/utils/move_07_R2.txt b/utils/move_07_R2.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 DR0 UL0 DL0 UR0 BR0 FL0 BL0 FR0 DBR0 UBL0 DFL0 UFR0 UFL0 DFR0 UBR0 DBL0 diff --git a/utils/move_08_R3.txt b/utils/move_08_R3.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0 diff --git a/utils/move_09_L.txt b/utils/move_09_L.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1 diff --git a/utils/move_10_L2.txt b/utils/move_10_L2.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 DL0 UL0 DR0 FR0 BL0 FL0 BR0 UFR0 DFL0 UBL0 DBR0 DBL0 UBR0 DFR0 UFL0 diff --git a/utils/move_11_L3.txt b/utils/move_11_L3.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1 diff --git a/utils/move_12_F.txt b/utils/move_12_F.txt @@ -0,0 +1 @@ +FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0 diff --git a/utils/move_13_F2.txt b/utils/move_13_F2.txt @@ -0,0 +1 @@ +DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0 diff --git a/utils/move_14_F3.txt b/utils/move_14_F3.txt @@ -0,0 +1 @@ +FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0 diff --git a/utils/move_15_B.txt b/utils/move_15_B.txt @@ -0,0 +1 @@ +UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2 diff --git a/utils/move_16_B2.txt b/utils/move_16_B2.txt @@ -0,0 +1 @@ +UF0 DB0 UB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BR0 BL0 UFR0 DBR0 DFL0 UBL0 UFL0 DBL0 DFR0 UBR0 diff --git a/utils/move_17_B3.txt b/utils/move_17_B3.txt @@ -0,0 +1 @@ +UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2 diff --git a/utils/move_table.txt b/utils/move_table.txt @@ -0,0 +1,72 @@ +[U] = { + .corner = {5, 4, 2, 3, 0, 1, 6, 7}, + .edge = {4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11} +}, +[U2] = { + .corner = {1, 0, 2, 3, 5, 4, 6, 7}, + .edge = {1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11} +}, +[U3] = { + .corner = {4, 5, 2, 3, 1, 0, 6, 7}, + .edge = {5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11} +}, +[D] = { + .corner = {0, 1, 7, 6, 4, 5, 2, 3}, + .edge = {0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11} +}, +[D2] = { + .corner = {0, 1, 3, 2, 4, 5, 7, 6}, + .edge = {0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11} +}, +[D3] = { + .corner = {0, 1, 6, 7, 4, 5, 3, 2}, + .edge = {0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11} +}, +[R] = { + .corner = {70, 1, 2, 69, 4, 32, 35, 7}, + .edge = {0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4} +}, +[R2] = { + .corner = {3, 1, 2, 0, 4, 6, 5, 7}, + .edge = {0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8} +}, +[R3] = { + .corner = {69, 1, 2, 70, 4, 35, 32, 7}, + .edge = {0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7} +}, +[L] = { + .corner = {0, 71, 68, 3, 33, 5, 6, 34}, + .edge = {0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11} +}, +[L2] = { + .corner = {0, 2, 1, 3, 7, 5, 6, 4}, + .edge = {0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11} +}, +[L3] = { + .corner = {0, 68, 71, 3, 34, 5, 6, 33}, + .edge = {0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11} +}, +[F] = { + .corner = {36, 1, 38, 3, 66, 5, 64, 7}, + .edge = {25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11} +}, +[F2] = { + .corner = {2, 1, 0, 3, 6, 5, 4, 7}, + .edge = {3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11} +}, +[F3] = { + .corner = {38, 1, 36, 3, 64, 5, 66, 7}, + .edge = {24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11} +}, +[B] = { + .corner = {0, 37, 2, 39, 4, 67, 6, 65}, + .edge = {0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18} +}, +[B2] = { + .corner = {0, 3, 2, 1, 4, 7, 6, 5}, + .edge = {0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10} +}, +[B3] = { + .corner = {0, 39, 2, 37, 4, 65, 6, 67}, + .edge = {0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17} +}, diff --git a/utils/solved.txt b/utils/solved.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/utils/trans_table.txt b/utils/trans_table.txt @@ -0,0 +1,480 @@ +[UFr] = { + [NORMAL] = { + .corner = {0, 1, 2, 3, 4, 5, 6, 7}, + .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} + }, + [INVERSE] = { + .corner = {0, 1, 2, 3, 4, 5, 6, 7}, + .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} + } +}, +[ULr] = { + [NORMAL] = { + .corner = {4, 5, 7, 6, 1, 0, 2, 3}, + .edge = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24} + }, + [INVERSE] = { + .corner = {5, 4, 6, 7, 0, 1, 3, 2}, + .edge = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26} + } +}, +[UBr] = { + [NORMAL] = { + .corner = {1, 0, 3, 2, 5, 4, 7, 6}, + .edge = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9} + }, + [INVERSE] = { + .corner = {1, 0, 3, 2, 5, 4, 7, 6}, + .edge = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9} + } +}, +[URr] = { + [NORMAL] = { + .corner = {5, 4, 6, 7, 0, 1, 3, 2}, + .edge = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26} + }, + [INVERSE] = { + .corner = {4, 5, 7, 6, 1, 0, 2, 3}, + .edge = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24} + } +}, +[DFr] = { + [NORMAL] = { + .corner = {2, 3, 0, 1, 6, 7, 4, 5}, + .edge = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10} + }, + [INVERSE] = { + .corner = {2, 3, 0, 1, 6, 7, 4, 5}, + .edge = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10} + } +}, +[DLr] = { + [NORMAL] = { + .corner = {7, 6, 4, 5, 2, 3, 1, 0}, + .edge = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27} + }, + [INVERSE] = { + .corner = {7, 6, 4, 5, 2, 3, 1, 0}, + .edge = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27} + } +}, +[DBr] = { + [NORMAL] = { + .corner = {3, 2, 1, 0, 7, 6, 5, 4}, + .edge = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8} + }, + [INVERSE] = { + .corner = {3, 2, 1, 0, 7, 6, 5, 4}, + .edge = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8} + } +}, +[DRr] = { + [NORMAL] = { + .corner = {6, 7, 5, 4, 3, 2, 0, 1}, + .edge = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25} + }, + [INVERSE] = { + .corner = {6, 7, 5, 4, 3, 2, 0, 1}, + .edge = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25} + } +}, +[RUr] = { + [NORMAL] = { + .corner = {64, 67, 65, 66, 37, 38, 36, 39}, + .edge = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3} + }, + [INVERSE] = { + .corner = {32, 34, 35, 33, 70, 68, 69, 71}, + .edge = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21} + } +}, +[RFr] = { + [NORMAL] = { + .corner = {38, 37, 36, 39, 64, 67, 66, 65}, + .edge = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18} + }, + [INVERSE] = { + .corner = {36, 39, 38, 37, 66, 65, 64, 67}, + .edge = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17} + } +}, +[RDr] = { + [NORMAL] = { + .corner = {67, 64, 66, 65, 38, 37, 39, 36}, + .edge = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1} + }, + [INVERSE] = { + .corner = {33, 35, 34, 32, 71, 69, 68, 70}, + .edge = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20} + } +}, +[RBr] = { + [NORMAL] = { + .corner = {37, 38, 39, 36, 67, 64, 65, 66}, + .edge = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16} + }, + [INVERSE] = { + .corner = {37, 38, 39, 36, 67, 64, 65, 66}, + .edge = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16} + } +}, +[LUr] = { + [NORMAL] = { + .corner = {65, 66, 64, 67, 36, 39, 37, 38}, + .edge = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2} + }, + [INVERSE] = { + .corner = {34, 32, 33, 35, 68, 70, 71, 69}, + .edge = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23} + } +}, +[LFr] = { + [NORMAL] = { + .corner = {36, 39, 38, 37, 66, 65, 64, 67}, + .edge = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17} + }, + [INVERSE] = { + .corner = {38, 37, 36, 39, 64, 67, 66, 65}, + .edge = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18} + } +}, +[LDr] = { + [NORMAL] = { + .corner = {66, 65, 67, 64, 39, 36, 38, 37}, + .edge = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0} + }, + [INVERSE] = { + .corner = {35, 33, 32, 34, 69, 71, 70, 68}, + .edge = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22} + } +}, +[LBr] = { + [NORMAL] = { + .corner = {39, 36, 37, 38, 65, 66, 67, 64}, + .edge = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19} + }, + [INVERSE] = { + .corner = {39, 36, 37, 38, 65, 66, 67, 64}, + .edge = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19} + } +}, +[FUr] = { + [NORMAL] = { + .corner = {68, 70, 69, 71, 32, 34, 33, 35}, + .edge = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6} + }, + [INVERSE] = { + .corner = {68, 70, 69, 71, 32, 34, 33, 35}, + .edge = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6} + } +}, +[FRr] = { + [NORMAL] = { + .corner = {32, 34, 35, 33, 70, 68, 69, 71}, + .edge = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21} + }, + [INVERSE] = { + .corner = {64, 67, 65, 66, 37, 38, 36, 39}, + .edge = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3} + } +}, +[FDr] = { + [NORMAL] = { + .corner = {70, 68, 71, 69, 34, 32, 35, 33}, + .edge = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4} + }, + [INVERSE] = { + .corner = {69, 71, 68, 70, 33, 35, 32, 34}, + .edge = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7} + } +}, +[FLr] = { + [NORMAL] = { + .corner = {34, 32, 33, 35, 68, 70, 71, 69}, + .edge = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23} + }, + [INVERSE] = { + .corner = {65, 66, 64, 67, 36, 39, 37, 38}, + .edge = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2} + } +}, +[BUr] = { + [NORMAL] = { + .corner = {69, 71, 68, 70, 33, 35, 32, 34}, + .edge = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7} + }, + [INVERSE] = { + .corner = {70, 68, 71, 69, 34, 32, 35, 33}, + .edge = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4} + } +}, +[BRr] = { + [NORMAL] = { + .corner = {35, 33, 32, 34, 69, 71, 70, 68}, + .edge = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22} + }, + [INVERSE] = { + .corner = {66, 65, 67, 64, 39, 36, 38, 37}, + .edge = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0} + } +}, +[BDr] = { + [NORMAL] = { + .corner = {71, 69, 70, 68, 35, 33, 34, 32}, + .edge = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5} + }, + [INVERSE] = { + .corner = {71, 69, 70, 68, 35, 33, 34, 32}, + .edge = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5} + } +}, +[BLr] = { + [NORMAL] = { + .corner = {33, 35, 34, 32, 71, 69, 68, 70}, + .edge = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20} + }, + [INVERSE] = { + .corner = {67, 64, 66, 65, 38, 37, 39, 36}, + .edge = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1} + } +}, +[UFm] = { + [NORMAL] = { + .corner = {4, 5, 6, 7, 0, 1, 2, 3}, + .edge = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10} + }, + [INVERSE] = { + .corner = {4, 5, 6, 7, 0, 1, 2, 3}, + .edge = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10} + } +}, +[ULm] = { + [NORMAL] = { + .corner = {0, 1, 3, 2, 5, 4, 6, 7}, + .edge = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25} + }, + [INVERSE] = { + .corner = {0, 1, 3, 2, 5, 4, 6, 7}, + .edge = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25} + } +}, +[UBm] = { + [NORMAL] = { + .corner = {5, 4, 7, 6, 1, 0, 3, 2}, + .edge = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8} + }, + [INVERSE] = { + .corner = {5, 4, 7, 6, 1, 0, 3, 2}, + .edge = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8} + } +}, +[URm] = { + [NORMAL] = { + .corner = {1, 0, 2, 3, 4, 5, 7, 6}, + .edge = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27} + }, + [INVERSE] = { + .corner = {1, 0, 2, 3, 4, 5, 7, 6}, + .edge = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27} + } +}, +[DFm] = { + [NORMAL] = { + .corner = {6, 7, 4, 5, 2, 3, 0, 1}, + .edge = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11} + }, + [INVERSE] = { + .corner = {6, 7, 4, 5, 2, 3, 0, 1}, + .edge = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11} + } +}, +[DLm] = { + [NORMAL] = { + .corner = {3, 2, 0, 1, 6, 7, 5, 4}, + .edge = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26} + }, + [INVERSE] = { + .corner = {2, 3, 1, 0, 7, 6, 4, 5}, + .edge = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24} + } +}, +[DBm] = { + [NORMAL] = { + .corner = {7, 6, 5, 4, 3, 2, 1, 0}, + .edge = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9} + }, + [INVERSE] = { + .corner = {7, 6, 5, 4, 3, 2, 1, 0}, + .edge = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9} + } +}, +[DRm] = { + [NORMAL] = { + .corner = {2, 3, 1, 0, 7, 6, 4, 5}, + .edge = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24} + }, + [INVERSE] = { + .corner = {3, 2, 0, 1, 6, 7, 5, 4}, + .edge = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26} + } +}, +[RUm] = { + [NORMAL] = { + .corner = {68, 71, 69, 70, 33, 34, 32, 35}, + .edge = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3} + }, + [INVERSE] = { + .corner = {70, 68, 69, 71, 32, 34, 35, 33}, + .edge = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22} + } +}, +[RFm] = { + [NORMAL] = { + .corner = {34, 33, 32, 35, 68, 71, 70, 69}, + .edge = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18} + }, + [INVERSE] = { + .corner = {66, 65, 64, 67, 36, 39, 38, 37}, + .edge = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18} + } +}, +[RDm] = { + [NORMAL] = { + .corner = {71, 68, 70, 69, 34, 33, 35, 32}, + .edge = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1} + }, + [INVERSE] = { + .corner = {71, 69, 68, 70, 33, 35, 34, 32}, + .edge = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23} + } +}, +[RBm] = { + [NORMAL] = { + .corner = {33, 34, 35, 32, 71, 68, 69, 70}, + .edge = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16} + }, + [INVERSE] = { + .corner = {67, 64, 65, 66, 37, 38, 39, 36}, + .edge = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19} + } +}, +[LUm] = { + [NORMAL] = { + .corner = {69, 70, 68, 71, 32, 35, 33, 34}, + .edge = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2} + }, + [INVERSE] = { + .corner = {68, 70, 71, 69, 34, 32, 33, 35}, + .edge = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20} + } +}, +[LFm] = { + [NORMAL] = { + .corner = {32, 35, 34, 33, 70, 69, 68, 71}, + .edge = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17} + }, + [INVERSE] = { + .corner = {64, 67, 66, 65, 38, 37, 36, 39}, + .edge = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17} + } +}, +[LDm] = { + [NORMAL] = { + .corner = {70, 69, 71, 68, 35, 32, 34, 33}, + .edge = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0} + }, + [INVERSE] = { + .corner = {69, 71, 70, 68, 35, 33, 32, 34}, + .edge = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21} + } +}, +[LBm] = { + [NORMAL] = { + .corner = {35, 32, 33, 34, 69, 70, 71, 68}, + .edge = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19} + }, + [INVERSE] = { + .corner = {65, 66, 67, 64, 39, 36, 37, 38}, + .edge = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16} + } +}, +[FUm] = { + [NORMAL] = { + .corner = {64, 66, 65, 67, 36, 38, 37, 39}, + .edge = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7} + }, + [INVERSE] = { + .corner = {32, 34, 33, 35, 68, 70, 69, 71}, + .edge = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7} + } +}, +[FRm] = { + [NORMAL] = { + .corner = {36, 38, 39, 37, 66, 64, 65, 67}, + .edge = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20} + }, + [INVERSE] = { + .corner = {37, 38, 36, 39, 64, 67, 65, 66}, + .edge = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2} + } +}, +[FDm] = { + [NORMAL] = { + .corner = {66, 64, 67, 65, 38, 36, 39, 37}, + .edge = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5} + }, + [INVERSE] = { + .corner = {33, 35, 32, 34, 69, 71, 68, 70}, + .edge = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6} + } +}, +[FLm] = { + [NORMAL] = { + .corner = {38, 36, 37, 39, 64, 66, 67, 65}, + .edge = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22} + }, + [INVERSE] = { + .corner = {36, 39, 37, 38, 65, 66, 64, 67}, + .edge = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3} + } +}, +[BUm] = { + [NORMAL] = { + .corner = {65, 67, 64, 66, 37, 39, 36, 38}, + .edge = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6} + }, + [INVERSE] = { + .corner = {34, 32, 35, 33, 70, 68, 71, 69}, + .edge = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5} + } +}, +[BRm] = { + [NORMAL] = { + .corner = {39, 37, 36, 38, 65, 67, 66, 64}, + .edge = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23} + }, + [INVERSE] = { + .corner = {39, 36, 38, 37, 66, 65, 67, 64}, + .edge = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1} + } +}, +[BDm] = { + [NORMAL] = { + .corner = {67, 65, 66, 64, 39, 37, 38, 36}, + .edge = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4} + }, + [INVERSE] = { + .corner = {35, 33, 34, 32, 71, 69, 70, 68}, + .edge = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4} + } +}, +[BLm] = { + [NORMAL] = { + .corner = {37, 39, 38, 36, 67, 65, 64, 66}, + .edge = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21} + }, + [INVERSE] = { + .corner = {38, 37, 39, 36, 67, 64, 66, 65}, + .edge = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0} + } +}, diff --git a/utils/transform_00_UFr.txt b/utils/transform_00_UFr.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/utils/transform_01_ULr.txt b/utils/transform_01_ULr.txt @@ -0,0 +1 @@ +UL0 UR0 DR0 DL0 UF0 UB0 DB0 DF0 FL1 BL1 BR1 FR1 UFL0 UBR0 DBL0 DFR0 UBL0 UFR0 DFL0 DBR0 diff --git a/utils/transform_02_UBr.txt b/utils/transform_02_UBr.txt @@ -0,0 +1 @@ +UB0 UF0 DF0 DB0 UL0 UR0 DR0 DL0 BL0 BR0 FR0 FL0 UBL0 UFR0 DBR0 DFL0 UBR0 UFL0 DBL0 DFR0 diff --git a/utils/transform_03_URr.txt b/utils/transform_03_URr.txt @@ -0,0 +1 @@ +UR0 UL0 DL0 DR0 UB0 UF0 DF0 DB0 BR1 FR1 FL1 BL1 UBR0 UFL0 DFR0 DBL0 UFR0 UBL0 DBR0 DFL0 diff --git a/utils/transform_04_DFr.txt b/utils/transform_04_DFr.txt @@ -0,0 +1 @@ +DF0 DB0 UB0 UF0 DL0 DR0 UR0 UL0 FL0 FR0 BR0 BL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 diff --git a/utils/transform_05_DLr.txt b/utils/transform_05_DLr.txt @@ -0,0 +1 @@ +DL0 DR0 UR0 UL0 DB0 DF0 UF0 UB0 BL1 FL1 FR1 BR1 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 diff --git a/utils/transform_06_DBr.txt b/utils/transform_06_DBr.txt @@ -0,0 +1 @@ +DB0 DF0 UF0 UB0 DR0 DL0 UL0 UR0 BR0 BL0 FL0 FR0 DBR0 DFL0 UBL0 UFR0 DBL0 DFR0 UBR0 UFL0 diff --git a/utils/transform_07_DRr.txt b/utils/transform_07_DRr.txt @@ -0,0 +1 @@ +DR0 DL0 UL0 UR0 DF0 DB0 UB0 UF0 FR1 BR1 BL1 FL1 DFR0 DBL0 UBR0 UFL0 DBR0 DFL0 UFR0 UBL0 diff --git a/utils/transform_08_RUr.txt b/utils/transform_08_RUr.txt @@ -0,0 +1 @@ +UR1 DR1 DL1 UL1 FR1 BR1 BL1 FL1 UF0 UB0 DB0 DF0 UFR2 DBR2 UBL2 DFL2 UBR1 DFR1 UFL1 DBL1 diff --git a/utils/transform_09_RFr.txt b/utils/transform_09_RFr.txt @@ -0,0 +1 @@ +FR1 BR1 BL1 FL1 DR1 UR1 UL1 DL1 DF1 UF1 UB1 DB1 DFR1 UBR1 UFL1 DBL1 UFR2 DBR2 DFL2 UBL2 diff --git a/utils/transform_10_RDr.txt b/utils/transform_10_RDr.txt @@ -0,0 +1 @@ +DR1 UR1 UL1 DL1 BR1 FR1 FL1 BL1 DB0 DF0 UF0 UB0 DBR2 UFR2 DFL2 UBL2 DFR1 UBR1 DBL1 UFL1 diff --git a/utils/transform_11_RBr.txt b/utils/transform_11_RBr.txt @@ -0,0 +1 @@ +BR1 FR1 FL1 BL1 UR1 DR1 DL1 UL1 UB1 DB1 DF1 UF1 UBR1 DFR1 DBL1 UFL1 DBR2 UFR2 UBL2 DFL2 diff --git a/utils/transform_12_LUr.txt b/utils/transform_12_LUr.txt @@ -0,0 +1 @@ +UL1 DL1 DR1 UR1 BL1 FL1 FR1 BR1 UB0 UF0 DF0 DB0 UBL2 DFL2 UFR2 DBR2 UFL1 DBL1 UBR1 DFR1 diff --git a/utils/transform_13_LFr.txt b/utils/transform_13_LFr.txt @@ -0,0 +1 @@ +FL1 BL1 BR1 FR1 UL1 DL1 DR1 UR1 UF1 DF1 DB1 UB1 UFL1 DBL1 DFR1 UBR1 DFL2 UBL2 UFR2 DBR2 diff --git a/utils/transform_14_LDr.txt b/utils/transform_14_LDr.txt @@ -0,0 +1 @@ +DL1 UL1 UR1 DR1 FL1 BL1 BR1 FR1 DF0 DB0 UB0 UF0 DFL2 UBL2 DBR2 UFR2 DBL1 UFL1 DFR1 UBR1 diff --git a/utils/transform_15_LBr.txt b/utils/transform_15_LBr.txt @@ -0,0 +1 @@ +BL1 FL1 FR1 BR1 DL1 UL1 UR1 DR1 DB1 UB1 UF1 DF1 DBL1 UFL1 UBR1 DFR1 UBL2 DFL2 DBR2 UFR2 diff --git a/utils/transform_16_FUr.txt b/utils/transform_16_FUr.txt @@ -0,0 +1 @@ +UF1 DF1 DB1 UB1 FL0 FR0 BR0 BL0 UL0 UR0 DR0 DL0 UFL2 DFR2 UBR2 DBL2 UFR1 DFL1 UBL1 DBR1 diff --git a/utils/transform_17_FRr.txt b/utils/transform_17_FRr.txt @@ -0,0 +1 @@ +FR0 FL0 BL0 BR0 UF1 DF1 DB1 UB1 UR1 DR1 DL1 UL1 UFR1 DFL1 DBR1 UBL1 DFR2 UFL2 UBR2 DBL2 diff --git a/utils/transform_18_FDr.txt b/utils/transform_18_FDr.txt @@ -0,0 +1 @@ +DF1 UF1 UB1 DB1 FR0 FL0 BL0 BR0 DR0 DL0 UL0 UR0 DFR2 UFL2 DBL2 UBR2 DFL1 UFR1 DBR1 UBL1 diff --git a/utils/transform_19_FLr.txt b/utils/transform_19_FLr.txt @@ -0,0 +1 @@ +FL0 FR0 BR0 BL0 DF1 UF1 UB1 DB1 DL1 UL1 UR1 DR1 DFL1 UFR1 UBL1 DBR1 UFL2 DFR2 DBL2 UBR2 diff --git a/utils/transform_20_BUr.txt b/utils/transform_20_BUr.txt @@ -0,0 +1 @@ +UB1 DB1 DF1 UF1 BR0 BL0 FL0 FR0 UR0 UL0 DL0 DR0 UBR2 DBL2 UFL2 DFR2 UBL1 DBR1 UFR1 DFL1 diff --git a/utils/transform_21_BRr.txt b/utils/transform_21_BRr.txt @@ -0,0 +1 @@ +BR0 BL0 FL0 FR0 DB1 UB1 UF1 DF1 DR1 UR1 UL1 DL1 DBR1 UBL1 UFR1 DFL1 UBR2 DBL2 DFR2 UFL2 diff --git a/utils/transform_22_BDr.txt b/utils/transform_22_BDr.txt @@ -0,0 +1 @@ +DB1 UB1 UF1 DF1 BL0 BR0 FR0 FL0 DL0 DR0 UR0 UL0 DBL2 UBR2 DFR2 UFL2 DBR1 UBL1 DFL1 UFR1 diff --git a/utils/transform_23_BLr.txt b/utils/transform_23_BLr.txt @@ -0,0 +1 @@ +BL0 BR0 FR0 FL0 UB1 DB1 DF1 UF1 UL1 DL1 DR1 UR1 UBL1 DBR1 DFL1 UFR1 DBL2 UBR2 UFL2 DFR2 diff --git a/utils/transform_24_UFm.txt b/utils/transform_24_UFm.txt @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UL0 UR0 DR0 DL0 FL0 FR0 BR0 BL0 UFL0 UBR0 DFR0 DBL0 UFR0 UBL0 DFL0 DBR0 diff --git a/utils/transform_25_ULm.txt b/utils/transform_25_ULm.txt @@ -0,0 +1 @@ +UR0 UL0 DL0 DR0 UF0 UB0 DB0 DF0 FR1 BR1 BL1 FL1 UFR0 UBL0 DBR0 DFL0 UBR0 UFL0 DFR0 DBL0 diff --git a/utils/transform_26_UBm.txt b/utils/transform_26_UBm.txt @@ -0,0 +1 @@ +UB0 UF0 DF0 DB0 UR0 UL0 DL0 DR0 BR0 BL0 FL0 FR0 UBR0 UFL0 DBL0 DFR0 UBL0 UFR0 DBR0 DFL0 diff --git a/utils/transform_27_URm.txt b/utils/transform_27_URm.txt @@ -0,0 +1 @@ +UL0 UR0 DR0 DL0 UB0 UF0 DF0 DB0 BL1 FL1 FR1 BR1 UBL0 UFR0 DFL0 DBR0 UFL0 UBR0 DBL0 DFR0 diff --git a/utils/transform_28_DFm.txt b/utils/transform_28_DFm.txt @@ -0,0 +1 @@ +DF0 DB0 UB0 UF0 DR0 DL0 UL0 UR0 FR0 FL0 BL0 BR0 DFR0 DBL0 UFL0 UBR0 DFL0 DBR0 UFR0 UBL0 diff --git a/utils/transform_29_DLm.txt b/utils/transform_29_DLm.txt @@ -0,0 +1 @@ +DR0 DL0 UL0 UR0 DB0 DF0 UF0 UB0 BR1 FR1 FL1 BL1 DBR0 DFL0 UFR0 UBL0 DFR0 DBL0 UBR0 UFL0 diff --git a/utils/transform_30_DBm.txt b/utils/transform_30_DBm.txt @@ -0,0 +1 @@ +DB0 DF0 UF0 UB0 DL0 DR0 UR0 UL0 BL0 BR0 FR0 FL0 DBL0 DFR0 UBR0 UFL0 DBR0 DFL0 UBL0 UFR0 diff --git a/utils/transform_31_DRm.txt b/utils/transform_31_DRm.txt @@ -0,0 +1 @@ +DL0 DR0 UR0 UL0 DF0 DB0 UB0 UF0 FL1 BL1 BR1 FR1 DFL0 DBR0 UBL0 UFR0 DBL0 DFR0 UFL0 UBR0 diff --git a/utils/transform_32_RUm.txt b/utils/transform_32_RUm.txt @@ -0,0 +1 @@ +UL1 DL1 DR1 UR1 FL1 BL1 BR1 FR1 UF0 UB0 DB0 DF0 UFL2 DBL2 UBR2 DFR2 UBL1 DFL1 UFR1 DBR1 diff --git a/utils/transform_33_RFm.txt b/utils/transform_33_RFm.txt @@ -0,0 +1 @@ +FL1 BL1 BR1 FR1 DL1 UL1 UR1 DR1 DF1 UF1 UB1 DB1 DFL1 UBL1 UFR1 DBR1 UFL2 DBL2 DFR2 UBR2 diff --git a/utils/transform_34_RDm.txt b/utils/transform_34_RDm.txt @@ -0,0 +1 @@ +DL1 UL1 UR1 DR1 BL1 FL1 FR1 BR1 DB0 DF0 UF0 UB0 DBL2 UFL2 DFR2 UBR2 DFL1 UBL1 DBR1 UFR1 diff --git a/utils/transform_35_RBm.txt b/utils/transform_35_RBm.txt @@ -0,0 +1 @@ +BL1 FL1 FR1 BR1 UL1 DL1 DR1 UR1 UB1 DB1 DF1 UF1 UBL1 DFL1 DBR1 UFR1 DBL2 UFL2 UBR2 DFR2 diff --git a/utils/transform_36_LUm.txt b/utils/transform_36_LUm.txt @@ -0,0 +1 @@ +UR1 DR1 DL1 UL1 BR1 FR1 FL1 BL1 UB0 UF0 DF0 DB0 UBR2 DFR2 UFL2 DBL2 UFR1 DBR1 UBL1 DFL1 diff --git a/utils/transform_37_LFm.txt b/utils/transform_37_LFm.txt @@ -0,0 +1 @@ +FR1 BR1 BL1 FL1 UR1 DR1 DL1 UL1 UF1 DF1 DB1 UB1 UFR1 DBR1 DFL1 UBL1 DFR2 UBR2 UFL2 DBL2 diff --git a/utils/transform_38_LDm.txt b/utils/transform_38_LDm.txt @@ -0,0 +1 @@ +DR1 UR1 UL1 DL1 FR1 BR1 BL1 FL1 DF0 DB0 UB0 UF0 DFR2 UBR2 DBL2 UFL2 DBR1 UFR1 DFL1 UBL1 diff --git a/utils/transform_39_LBm.txt b/utils/transform_39_LBm.txt @@ -0,0 +1 @@ +BR1 FR1 FL1 BL1 DR1 UR1 UL1 DL1 DB1 UB1 UF1 DF1 DBR1 UFR1 UBL1 DFL1 UBR2 DFR2 DBL2 UFL2 diff --git a/utils/transform_40_FUm.txt b/utils/transform_40_FUm.txt @@ -0,0 +1 @@ +UF1 DF1 DB1 UB1 FR0 FL0 BL0 BR0 UR0 UL0 DL0 DR0 UFR2 DFL2 UBL2 DBR2 UFL1 DFR1 UBR1 DBL1 diff --git a/utils/transform_41_FRm.txt b/utils/transform_41_FRm.txt @@ -0,0 +1 @@ +FL0 FR0 BR0 BL0 UF1 DF1 DB1 UB1 UL1 DL1 DR1 UR1 UFL1 DFR1 DBL1 UBR1 DFL2 UFR2 UBL2 DBR2 diff --git a/utils/transform_42_FDm.txt b/utils/transform_42_FDm.txt @@ -0,0 +1 @@ +DF1 UF1 UB1 DB1 FL0 FR0 BR0 BL0 DL0 DR0 UR0 UL0 DFL2 UFR2 DBR2 UBL2 DFR1 UFL1 DBL1 UBR1 diff --git a/utils/transform_43_FLm.txt b/utils/transform_43_FLm.txt @@ -0,0 +1 @@ +FR0 FL0 BL0 BR0 DF1 UF1 UB1 DB1 DR1 UR1 UL1 DL1 DFR1 UFL1 UBR1 DBL1 UFR2 DFL2 DBR2 UBL2 diff --git a/utils/transform_44_BUm.txt b/utils/transform_44_BUm.txt @@ -0,0 +1 @@ +UB1 DB1 DF1 UF1 BL0 BR0 FR0 FL0 UL0 UR0 DR0 DL0 UBL2 DBR2 UFR2 DFL2 UBR1 DBL1 UFL1 DFR1 diff --git a/utils/transform_45_BRm.txt b/utils/transform_45_BRm.txt @@ -0,0 +1 @@ +BL0 BR0 FR0 FL0 DB1 UB1 UF1 DF1 DL1 UL1 UR1 DR1 DBL1 UBR1 UFL1 DFR1 UBL2 DBR2 DFL2 UFR2 diff --git a/utils/transform_46_BDm.txt b/utils/transform_46_BDm.txt @@ -0,0 +1 @@ +DB1 UB1 UF1 DF1 BR0 BL0 FL0 FR0 DR0 DL0 UL0 UR0 DBR2 UBL2 DFL2 UFR2 DBL1 UBR1 DFR1 UFL1 diff --git a/utils/transform_47_BLm.txt b/utils/transform_47_BLm.txt @@ -0,0 +1 @@ +BR0 BL0 FL0 FR0 UB1 DB1 DF1 UF1 UR1 DR1 DL1 UL1 UBR1 DBL1 DFR1 UFL1 DBR2 UBL2 UFR2 DFL2 diff --git a/utils/transform_moves.txt b/utils/transform_moves.txt @@ -0,0 +1,95 @@ +UFr U U +UFr R R +UFr F F + +ULr U U +ULr R F +ULr F L + +UBr U U +UBr R L +UBr F B + +URr U U +URr R B +URr F R + +DFr U D +DFr R L +DFr F F + +DLr U D +DLr R B +DLr F L + +DBr U D +DBr R R +DBr F B + +DRr U D +DRr R F +DRr F R + +RUr U R +RUr R F +RUr F U + +RFr U R +RFr R D +RFr F F + +RDr U R +RDr R B +RDr F D + +RBr U R +RBr R U +RBr F B + +LUr U L +LUr R B +LUr F U + +LFr U L +LFr R U +LFr F F + +LDr U L +LDr R F +LDr F D + +LBr U L +LBr R D +LBr F B + +FUr U F +FUr R L +FUr F U + +FRr U F +FRr R U +FRr F R + +FDr U F +FDr R R +FDr F D + +FLr U F +FLr R D +FLr F L + +BUr U B +BUr R R +BUr F U + +BRr U B +BRr R D +BRr F R + +BDr U B +BDr R L +BDr F D + +BLr U B +BLr R U +BLr F L