constants.h (33544B)
1 #define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0}) 2 #define SOLVED_ORIENTED_CUBE \ 3 ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 }) 4 5 #define MOVE_CUBE_U STATIC_CUBE( \ 6 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11) 7 #define MOVE_CUBE_U2 STATIC_CUBE( \ 8 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11) 9 #define MOVE_CUBE_U3 STATIC_CUBE( \ 10 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11) 11 #define MOVE_CUBE_D STATIC_CUBE( \ 12 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11) 13 #define MOVE_CUBE_D2 STATIC_CUBE( \ 14 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11) 15 #define MOVE_CUBE_D3 STATIC_CUBE( \ 16 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11) 17 #define MOVE_CUBE_R STATIC_CUBE( \ 18 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4) 19 #define MOVE_CUBE_R2 STATIC_CUBE( \ 20 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8) 21 #define MOVE_CUBE_R3 STATIC_CUBE( \ 22 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7) 23 #define MOVE_CUBE_L STATIC_CUBE( \ 24 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11) 25 #define MOVE_CUBE_L2 STATIC_CUBE( \ 26 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11) 27 #define MOVE_CUBE_L3 STATIC_CUBE( \ 28 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11) 29 #define MOVE_CUBE_F STATIC_CUBE( \ 30 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11) 31 #define MOVE_CUBE_F2 STATIC_CUBE( \ 32 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11) 33 #define MOVE_CUBE_F3 STATIC_CUBE( \ 34 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11) 35 #define MOVE_CUBE_B STATIC_CUBE( \ 36 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18) 37 #define MOVE_CUBE_B2 STATIC_CUBE( \ 38 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10) 39 #define MOVE_CUBE_B3 STATIC_CUBE( \ 40 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17) 41 42 #define TRANS_CUBE_UFr STATIC_CUBE( \ 43 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) 44 #define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \ 45 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) 46 #define TRANS_CUBE_ULr STATIC_CUBE( \ 47 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) 48 #define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \ 49 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) 50 #define TRANS_CUBE_UBr STATIC_CUBE( \ 51 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) 52 #define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \ 53 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) 54 #define TRANS_CUBE_URr STATIC_CUBE( \ 55 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) 56 #define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \ 57 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) 58 #define TRANS_CUBE_DFr STATIC_CUBE( \ 59 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) 60 #define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \ 61 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) 62 #define TRANS_CUBE_DLr STATIC_CUBE( \ 63 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) 64 #define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \ 65 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) 66 #define TRANS_CUBE_DBr STATIC_CUBE( \ 67 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) 68 #define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \ 69 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) 70 #define TRANS_CUBE_DRr STATIC_CUBE( \ 71 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) 72 #define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \ 73 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) 74 #define TRANS_CUBE_RUr STATIC_CUBE( \ 75 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) 76 #define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \ 77 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) 78 #define TRANS_CUBE_RFr STATIC_CUBE( \ 79 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) 80 #define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \ 81 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) 82 #define TRANS_CUBE_RDr STATIC_CUBE( \ 83 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) 84 #define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \ 85 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) 86 #define TRANS_CUBE_RBr STATIC_CUBE( \ 87 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) 88 #define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \ 89 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) 90 #define TRANS_CUBE_LUr STATIC_CUBE( \ 91 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) 92 #define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \ 93 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) 94 #define TRANS_CUBE_LFr STATIC_CUBE( \ 95 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) 96 #define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \ 97 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) 98 #define TRANS_CUBE_LDr STATIC_CUBE( \ 99 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) 100 #define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \ 101 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) 102 #define TRANS_CUBE_LBr STATIC_CUBE( \ 103 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) 104 #define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \ 105 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) 106 #define TRANS_CUBE_FUr STATIC_CUBE( \ 107 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) 108 #define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \ 109 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) 110 #define TRANS_CUBE_FRr STATIC_CUBE( \ 111 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) 112 #define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \ 113 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) 114 #define TRANS_CUBE_FDr STATIC_CUBE( \ 115 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) 116 #define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \ 117 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) 118 #define TRANS_CUBE_FLr STATIC_CUBE( \ 119 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) 120 #define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \ 121 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) 122 #define TRANS_CUBE_BUr STATIC_CUBE( \ 123 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) 124 #define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \ 125 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) 126 #define TRANS_CUBE_BRr STATIC_CUBE( \ 127 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) 128 #define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \ 129 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) 130 #define TRANS_CUBE_BDr STATIC_CUBE( \ 131 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) 132 #define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \ 133 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) 134 #define TRANS_CUBE_BLr STATIC_CUBE( \ 135 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) 136 #define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \ 137 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) 138 #define TRANS_CUBE_UFm STATIC_CUBE( \ 139 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) 140 #define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \ 141 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) 142 #define TRANS_CUBE_ULm STATIC_CUBE( \ 143 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) 144 #define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \ 145 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) 146 #define TRANS_CUBE_UBm STATIC_CUBE( \ 147 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) 148 #define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \ 149 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) 150 #define TRANS_CUBE_URm STATIC_CUBE( \ 151 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) 152 #define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \ 153 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) 154 #define TRANS_CUBE_DFm STATIC_CUBE( \ 155 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) 156 #define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \ 157 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) 158 #define TRANS_CUBE_DLm STATIC_CUBE( \ 159 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) 160 #define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \ 161 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) 162 #define TRANS_CUBE_DBm STATIC_CUBE( \ 163 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) 164 #define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \ 165 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) 166 #define TRANS_CUBE_DRm STATIC_CUBE( \ 167 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) 168 #define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \ 169 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) 170 #define TRANS_CUBE_RUm STATIC_CUBE( \ 171 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) 172 #define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \ 173 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) 174 #define TRANS_CUBE_RFm STATIC_CUBE( \ 175 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) 176 #define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \ 177 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) 178 #define TRANS_CUBE_RDm STATIC_CUBE( \ 179 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) 180 #define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \ 181 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) 182 #define TRANS_CUBE_RBm STATIC_CUBE( \ 183 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) 184 #define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \ 185 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) 186 #define TRANS_CUBE_LUm STATIC_CUBE( \ 187 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) 188 #define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \ 189 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) 190 #define TRANS_CUBE_LFm STATIC_CUBE( \ 191 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) 192 #define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \ 193 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) 194 #define TRANS_CUBE_LDm STATIC_CUBE( \ 195 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) 196 #define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \ 197 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) 198 #define TRANS_CUBE_LBm STATIC_CUBE( \ 199 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) 200 #define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \ 201 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) 202 #define TRANS_CUBE_FUm STATIC_CUBE( \ 203 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) 204 #define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \ 205 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) 206 #define TRANS_CUBE_FRm STATIC_CUBE( \ 207 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) 208 #define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \ 209 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) 210 #define TRANS_CUBE_FDm STATIC_CUBE( \ 211 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) 212 #define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \ 213 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) 214 #define TRANS_CUBE_FLm STATIC_CUBE( \ 215 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) 216 #define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \ 217 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) 218 #define TRANS_CUBE_BUm STATIC_CUBE( \ 219 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) 220 #define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \ 221 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) 222 #define TRANS_CUBE_BRm STATIC_CUBE( \ 223 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) 224 #define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \ 225 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) 226 #define TRANS_CUBE_BDm STATIC_CUBE( \ 227 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) 228 #define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \ 229 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) 230 #define TRANS_CUBE_BLm STATIC_CUBE( \ 231 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) 232 #define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \ 233 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) 234 235 #define MOVE_U UINT8_C(0) 236 #define MOVE_U2 UINT8_C(1) 237 #define MOVE_U3 UINT8_C(2) 238 #define MOVE_D UINT8_C(3) 239 #define MOVE_D2 UINT8_C(4) 240 #define MOVE_D3 UINT8_C(5) 241 #define MOVE_R UINT8_C(6) 242 #define MOVE_R2 UINT8_C(7) 243 #define MOVE_R3 UINT8_C(8) 244 #define MOVE_L UINT8_C(9) 245 #define MOVE_L2 UINT8_C(10) 246 #define MOVE_L3 UINT8_C(11) 247 #define MOVE_F UINT8_C(12) 248 #define MOVE_F2 UINT8_C(13) 249 #define MOVE_F3 UINT8_C(14) 250 #define MOVE_B UINT8_C(15) 251 #define MOVE_B2 UINT8_C(16) 252 #define MOVE_B3 UINT8_C(17) 253 254 #define MOVE_Uw UINT8_C(18) 255 #define MOVE_Uw2 UINT8_C(19) 256 #define MOVE_Uw3 UINT8_C(20) 257 #define MOVE_Dw UINT8_C(21) 258 #define MOVE_Dw2 UINT8_C(22) 259 #define MOVE_Dw3 UINT8_C(23) 260 #define MOVE_Rw UINT8_C(24) 261 #define MOVE_Rw2 UINT8_C(25) 262 #define MOVE_Rw3 UINT8_C(26) 263 #define MOVE_Lw UINT8_C(27) 264 #define MOVE_Lw2 UINT8_C(28) 265 #define MOVE_Lw3 UINT8_C(29) 266 #define MOVE_Fw UINT8_C(30) 267 #define MOVE_Fw2 UINT8_C(31) 268 #define MOVE_Fw3 UINT8_C(32) 269 #define MOVE_Bw UINT8_C(33) 270 #define MOVE_Bw2 UINT8_C(34) 271 #define MOVE_Bw3 UINT8_C(35) 272 273 #define MOVE_M UINT8_C(36) 274 #define MOVE_M2 UINT8_C(37) 275 #define MOVE_M3 UINT8_C(38) 276 #define MOVE_S UINT8_C(39) 277 #define MOVE_S2 UINT8_C(40) 278 #define MOVE_S3 UINT8_C(41) 279 #define MOVE_E UINT8_C(42) 280 #define MOVE_E2 UINT8_C(43) 281 #define MOVE_E3 UINT8_C(44) 282 283 #define MOVE_x UINT8_C(45) 284 #define MOVE_x2 UINT8_C(46) 285 #define MOVE_x3 UINT8_C(47) 286 #define MOVE_y UINT8_C(48) 287 #define MOVE_y2 UINT8_C(49) 288 #define MOVE_y3 UINT8_C(50) 289 #define MOVE_z UINT8_C(51) 290 #define MOVE_z2 UINT8_C(52) 291 #define MOVE_z3 UINT8_C(53) 292 293 #define TRANS_UFr UINT8_C(0) 294 #define TRANS_ULr UINT8_C(1) 295 #define TRANS_UBr UINT8_C(2) 296 #define TRANS_URr UINT8_C(3) 297 #define TRANS_DFr UINT8_C(4) 298 #define TRANS_DLr UINT8_C(5) 299 #define TRANS_DBr UINT8_C(6) 300 #define TRANS_DRr UINT8_C(7) 301 #define TRANS_RUr UINT8_C(8) 302 #define TRANS_RFr UINT8_C(9) 303 #define TRANS_RDr UINT8_C(10) 304 #define TRANS_RBr UINT8_C(11) 305 #define TRANS_LUr UINT8_C(12) 306 #define TRANS_LFr UINT8_C(13) 307 #define TRANS_LDr UINT8_C(14) 308 #define TRANS_LBr UINT8_C(15) 309 #define TRANS_FUr UINT8_C(16) 310 #define TRANS_FRr UINT8_C(17) 311 #define TRANS_FDr UINT8_C(18) 312 #define TRANS_FLr UINT8_C(19) 313 #define TRANS_BUr UINT8_C(20) 314 #define TRANS_BRr UINT8_C(21) 315 #define TRANS_BDr UINT8_C(22) 316 #define TRANS_BLr UINT8_C(23) 317 318 #define TRANS_UFm UINT8_C(24) 319 #define TRANS_ULm UINT8_C(25) 320 #define TRANS_UBm UINT8_C(26) 321 #define TRANS_URm UINT8_C(27) 322 #define TRANS_DFm UINT8_C(28) 323 #define TRANS_DLm UINT8_C(29) 324 #define TRANS_DBm UINT8_C(30) 325 #define TRANS_DRm UINT8_C(31) 326 #define TRANS_RUm UINT8_C(32) 327 #define TRANS_RFm UINT8_C(33) 328 #define TRANS_RDm UINT8_C(34) 329 #define TRANS_RBm UINT8_C(35) 330 #define TRANS_LUm UINT8_C(36) 331 #define TRANS_LFm UINT8_C(37) 332 #define TRANS_LDm UINT8_C(38) 333 #define TRANS_LBm UINT8_C(39) 334 #define TRANS_FUm UINT8_C(40) 335 #define TRANS_FRm UINT8_C(41) 336 #define TRANS_FDm UINT8_C(42) 337 #define TRANS_FLm UINT8_C(43) 338 #define TRANS_BUm UINT8_C(44) 339 #define TRANS_BRm UINT8_C(45) 340 #define TRANS_BDm UINT8_C(46) 341 #define TRANS_BLm UINT8_C(47) 342 343 #define AXIS_UD UINT8_C(0) 344 #define AXIS_RL UINT8_C(1) 345 #define AXIS_FB UINT8_C(2) 346 347 #define NMOVES (1+MOVE_B3) 348 #define NMOVES_EXTENDED (1+MOVE_z3) 349 #define NTRANS (1+TRANS_BLm) 350 351 #define MM_SINGLE(m) (UINT64_C(1) << (uint64_t)(m)) 352 #define MM18_ALLMOVES UINT64_C(0x3FFFF) 353 #define MM18_NOHALFTURNS UINT64_C(0x2DB6D) 354 #define MM18_FACE(m) (UINT64_C(7) << (uint64_t)(m)) 355 #define MM18_EO (\ 356 MM18_FACE(MOVE_U) | MM18_FACE(MOVE_D) |\ 357 MM18_FACE(MOVE_R) | MM18_FACE(MOVE_L) |\ 358 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) 359 #define MM18_DR (\ 360 MM18_FACE(MOVE_U) | MM18_FACE(MOVE_D) |\ 361 MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\ 362 MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) 363 #define MM18_HTR (MM18_ALLMOVES & ~MM18_NOHALFTURNS) 364 365 #define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t)) 366 #define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF) 367 #define TM_UDRLFIX (\ 368 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \ 369 TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \ 370 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm)) 371 #define TM_UDFIX (\ 372 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \ 373 TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \ 374 TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \ 375 TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \ 376 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \ 377 TM_SINGLE(TRANS_DLm)) 378 379 #define CORNER_UFR UINT8_C(0) 380 #define CORNER_UBL UINT8_C(1) 381 #define CORNER_DFL UINT8_C(2) 382 #define CORNER_DBR UINT8_C(3) 383 #define CORNER_UFL UINT8_C(4) 384 #define CORNER_UBR UINT8_C(5) 385 #define CORNER_DFR UINT8_C(6) 386 #define CORNER_DBL UINT8_C(7) 387 388 #define EDGE_UF UINT8_C(0) 389 #define EDGE_UB UINT8_C(1) 390 #define EDGE_DB UINT8_C(2) 391 #define EDGE_DF UINT8_C(3) 392 #define EDGE_UR UINT8_C(4) 393 #define EDGE_UL UINT8_C(5) 394 #define EDGE_DL UINT8_C(6) 395 #define EDGE_DR UINT8_C(7) 396 #define EDGE_FR UINT8_C(8) 397 #define EDGE_FL UINT8_C(9) 398 #define EDGE_BL UINT8_C(10) 399 #define EDGE_BR UINT8_C(11) 400 401 #define ORIENTATION_UF UINT8_C(0) 402 #define ORIENTATION_UR UINT8_C(1) 403 #define ORIENTATION_UB UINT8_C(2) 404 #define ORIENTATION_UL UINT8_C(3) 405 #define ORIENTATION_DF UINT8_C(4) 406 #define ORIENTATION_DR UINT8_C(5) 407 #define ORIENTATION_DB UINT8_C(6) 408 #define ORIENTATION_DL UINT8_C(7) 409 #define ORIENTATION_RF UINT8_C(8) 410 #define ORIENTATION_RD UINT8_C(9) 411 #define ORIENTATION_RB UINT8_C(10) 412 #define ORIENTATION_RU UINT8_C(11) 413 #define ORIENTATION_LF UINT8_C(12) 414 #define ORIENTATION_LD UINT8_C(13) 415 #define ORIENTATION_LB UINT8_C(14) 416 #define ORIENTATION_LU UINT8_C(15) 417 #define ORIENTATION_FD UINT8_C(16) 418 #define ORIENTATION_FR UINT8_C(17) 419 #define ORIENTATION_FU UINT8_C(18) 420 #define ORIENTATION_FL UINT8_C(19) 421 #define ORIENTATION_BD UINT8_C(20) 422 #define ORIENTATION_BR UINT8_C(21) 423 #define ORIENTATION_BU UINT8_C(22) 424 #define ORIENTATION_BL UINT8_C(23) 425 426 /* This is only meant to work for the 18 base moves, for now */ 427 STATIC const uint64_t allowedmask[] = { 428 [MOVE_U / 3] = UINT64_C(0x3FFF8), 429 [MOVE_D / 3] = UINT64_C(0x3FFC0), 430 [MOVE_R / 3] = UINT64_C(0x3FE3F), 431 [MOVE_L / 3] = UINT64_C(0x3F03F), 432 [MOVE_F / 3] = UINT64_C(0x38FFF), 433 [MOVE_B / 3] = UINT64_C(0x00FFF), 434 [MOVE_Uw / 3] = 0, 435 [MOVE_Dw / 3] = 0, 436 [MOVE_Rw / 3] = 0, 437 [MOVE_Lw / 3] = 0, 438 [MOVE_Fw / 3] = 0, 439 [MOVE_Bw / 3] = 0, 440 [MOVE_M / 3] = 0, 441 [MOVE_S / 3] = 0, 442 [MOVE_E / 3] = 0, 443 [MOVE_x / 3] = 0, 444 [MOVE_y / 3] = 0, 445 [MOVE_z / 3] = 0, 446 }; 447 448 STATIC const char *cornerstr[] = { 449 [CORNER_UFR] = "UFR", 450 [CORNER_UBL] = "UBL", 451 [CORNER_DFL] = "DFL", 452 [CORNER_DBR] = "DBR", 453 [CORNER_UFL] = "UFL", 454 [CORNER_UBR] = "UBR", 455 [CORNER_DFR] = "DFR", 456 [CORNER_DBL] = "DBL" 457 }; 458 459 STATIC const char *cornerstralt[] = { 460 [CORNER_UFR] = "URF", 461 [CORNER_UBL] = "ULB", 462 [CORNER_DFL] = "DLF", 463 [CORNER_DBR] = "DRB", 464 [CORNER_UFL] = "ULF", 465 [CORNER_UBR] = "URB", 466 [CORNER_DFR] = "DRF", 467 [CORNER_DBL] = "DLB" 468 }; 469 470 STATIC const char *edgestr[] = { 471 [EDGE_UF] = "UF", 472 [EDGE_UB] = "UB", 473 [EDGE_DB] = "DB", 474 [EDGE_DF] = "DF", 475 [EDGE_UR] = "UR", 476 [EDGE_UL] = "UL", 477 [EDGE_DL] = "DL", 478 [EDGE_DR] = "DR", 479 [EDGE_FR] = "FR", 480 [EDGE_FL] = "FL", 481 [EDGE_BL] = "BL", 482 [EDGE_BR] = "BR" 483 }; 484 485 STATIC const char *movestr[] = { 486 [MOVE_U] = "U", 487 [MOVE_U2] = "U2", 488 [MOVE_U3] = "U'", 489 [MOVE_D] = "D", 490 [MOVE_D2] = "D2", 491 [MOVE_D3] = "D'", 492 [MOVE_R] = "R", 493 [MOVE_R2] = "R2", 494 [MOVE_R3] = "R'", 495 [MOVE_L] = "L", 496 [MOVE_L2] = "L2", 497 [MOVE_L3] = "L'", 498 [MOVE_F] = "F", 499 [MOVE_F2] = "F2", 500 [MOVE_F3] = "F'", 501 [MOVE_B] = "B", 502 [MOVE_B2] = "B2", 503 [MOVE_B3] = "B'", 504 505 [MOVE_Uw] = "Uw", 506 [MOVE_Uw2] = "Uw2", 507 [MOVE_Uw3] = "Uw'", 508 [MOVE_Dw] = "Dw", 509 [MOVE_Dw2] = "Dw2", 510 [MOVE_Dw3] = "Dw'", 511 [MOVE_Rw] = "Rw", 512 [MOVE_Rw2] = "Rw2", 513 [MOVE_Rw3] = "Rw'", 514 [MOVE_Lw] = "Lw", 515 [MOVE_Lw2] = "Lw2", 516 [MOVE_Lw3] = "Lw'", 517 [MOVE_Fw] = "Fw", 518 [MOVE_Fw2] = "Fw2", 519 [MOVE_Fw3] = "Fw'", 520 [MOVE_Bw] = "Bw", 521 [MOVE_Bw2] = "Bw2", 522 [MOVE_Bw3] = "Bw'", 523 524 [MOVE_M] = "M", 525 [MOVE_M2] = "M2", 526 [MOVE_M3] = "M'", 527 [MOVE_S] = "S", 528 [MOVE_S2] = "S2", 529 [MOVE_S3] = "S'", 530 [MOVE_E] = "E", 531 [MOVE_E2] = "E2", 532 [MOVE_E3] = "E'", 533 534 [MOVE_x] = "x", 535 [MOVE_x2] = "x2", 536 [MOVE_x3] = "x'", 537 [MOVE_y] = "y", 538 [MOVE_y2] = "y2", 539 [MOVE_y3] = "y'", 540 [MOVE_z] = "z", 541 [MOVE_z2] = "z2", 542 [MOVE_z3] = "z'", 543 }; 544 545 STATIC const char *transstr[] = { 546 [TRANS_UFr] = "rotation UF", 547 [TRANS_UFm] = "mirrored UF", 548 [TRANS_ULr] = "rotation UL", 549 [TRANS_ULm] = "mirrored UL", 550 [TRANS_UBr] = "rotation UB", 551 [TRANS_UBm] = "mirrored UB", 552 [TRANS_URr] = "rotation UR", 553 [TRANS_URm] = "mirrored UR", 554 [TRANS_DFr] = "rotation DF", 555 [TRANS_DFm] = "mirrored DF", 556 [TRANS_DLr] = "rotation DL", 557 [TRANS_DLm] = "mirrored DL", 558 [TRANS_DBr] = "rotation DB", 559 [TRANS_DBm] = "mirrored DB", 560 [TRANS_DRr] = "rotation DR", 561 [TRANS_DRm] = "mirrored DR", 562 [TRANS_RUr] = "rotation RU", 563 [TRANS_RUm] = "mirrored RU", 564 [TRANS_RFr] = "rotation RF", 565 [TRANS_RFm] = "mirrored RF", 566 [TRANS_RDr] = "rotation RD", 567 [TRANS_RDm] = "mirrored RD", 568 [TRANS_RBr] = "rotation RB", 569 [TRANS_RBm] = "mirrored RB", 570 [TRANS_LUr] = "rotation LU", 571 [TRANS_LUm] = "mirrored LU", 572 [TRANS_LFr] = "rotation LF", 573 [TRANS_LFm] = "mirrored LF", 574 [TRANS_LDr] = "rotation LD", 575 [TRANS_LDm] = "mirrored LD", 576 [TRANS_LBr] = "rotation LB", 577 [TRANS_LBm] = "mirrored LB", 578 [TRANS_FUr] = "rotation FU", 579 [TRANS_FUm] = "mirrored FU", 580 [TRANS_FRr] = "rotation FR", 581 [TRANS_FRm] = "mirrored FR", 582 [TRANS_FDr] = "rotation FD", 583 [TRANS_FDm] = "mirrored FD", 584 [TRANS_FLr] = "rotation FL", 585 [TRANS_FLm] = "mirrored FL", 586 [TRANS_BUr] = "rotation BU", 587 [TRANS_BUm] = "mirrored BU", 588 [TRANS_BRr] = "rotation BR", 589 [TRANS_BRm] = "mirrored BR", 590 [TRANS_BDr] = "rotation BD", 591 [TRANS_BDm] = "mirrored BD", 592 [TRANS_BLr] = "rotation BL", 593 [TRANS_BLm] = "mirrored BL", 594 }; 595 596 STATIC uint8_t inverse_trans_table[] = { 597 [TRANS_UFr] = TRANS_UFr, 598 [TRANS_UFm] = TRANS_UFm, 599 [TRANS_ULr] = TRANS_URr, 600 [TRANS_ULm] = TRANS_ULm, 601 [TRANS_UBr] = TRANS_UBr, 602 [TRANS_UBm] = TRANS_UBm, 603 [TRANS_URr] = TRANS_ULr, 604 [TRANS_URm] = TRANS_URm, 605 [TRANS_DFr] = TRANS_DFr, 606 [TRANS_DFm] = TRANS_DFm, 607 [TRANS_DLr] = TRANS_DLr, 608 [TRANS_DLm] = TRANS_DRm, 609 [TRANS_DBr] = TRANS_DBr, 610 [TRANS_DBm] = TRANS_DBm, 611 [TRANS_DRr] = TRANS_DRr, 612 [TRANS_DRm] = TRANS_DLm, 613 [TRANS_RUr] = TRANS_FRr, 614 [TRANS_RUm] = TRANS_FLm, 615 [TRANS_RFr] = TRANS_LFr, 616 [TRANS_RFm] = TRANS_RFm, 617 [TRANS_RDr] = TRANS_BLr, 618 [TRANS_RDm] = TRANS_BRm, 619 [TRANS_RBr] = TRANS_RBr, 620 [TRANS_RBm] = TRANS_LBm, 621 [TRANS_LUr] = TRANS_FLr, 622 [TRANS_LUm] = TRANS_FRm, 623 [TRANS_LFr] = TRANS_RFr, 624 [TRANS_LFm] = TRANS_LFm, 625 [TRANS_LDr] = TRANS_BRr, 626 [TRANS_LDm] = TRANS_BLm, 627 [TRANS_LBr] = TRANS_LBr, 628 [TRANS_LBm] = TRANS_RBm, 629 [TRANS_FUr] = TRANS_FUr, 630 [TRANS_FUm] = TRANS_FUm, 631 [TRANS_FRr] = TRANS_RUr, 632 [TRANS_FRm] = TRANS_LUm, 633 [TRANS_FDr] = TRANS_BUr, 634 [TRANS_FDm] = TRANS_BUm, 635 [TRANS_FLr] = TRANS_LUr, 636 [TRANS_FLm] = TRANS_RUm, 637 [TRANS_BUr] = TRANS_FDr, 638 [TRANS_BUm] = TRANS_FDm, 639 [TRANS_BRr] = TRANS_LDr, 640 [TRANS_BRm] = TRANS_RDm, 641 [TRANS_BDr] = TRANS_BDr, 642 [TRANS_BDm] = TRANS_BDm, 643 [TRANS_BLr] = TRANS_RDr, 644 [TRANS_BLm] = TRANS_LDm, 645 }; 646 647 STATIC uint8_t trans_move_table[][3] = { 648 [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F }, 649 [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F }, 650 [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L }, 651 [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R }, 652 [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B }, 653 [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B }, 654 [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R }, 655 [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L }, 656 [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F }, 657 [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F }, 658 [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L }, 659 [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R }, 660 [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B }, 661 [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B }, 662 [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R }, 663 [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L }, 664 [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U }, 665 [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U }, 666 [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F }, 667 [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F }, 668 [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D }, 669 [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D }, 670 [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B }, 671 [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B }, 672 [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U }, 673 [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U }, 674 [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F }, 675 [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F }, 676 [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D }, 677 [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D }, 678 [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B }, 679 [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B }, 680 [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U }, 681 [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U }, 682 [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R }, 683 [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L }, 684 [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D }, 685 [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D }, 686 [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L }, 687 [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R }, 688 [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U }, 689 [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U }, 690 [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R }, 691 [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L }, 692 [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D }, 693 [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D }, 694 [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L }, 695 [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R }, 696 }; 697 698 STATIC uint8_t orientation_moves[][3] = { 699 [ORIENTATION_UF] = { UINT8_MAX }, 700 [ORIENTATION_UR] = { MOVE_y, UINT8_MAX }, 701 [ORIENTATION_UB] = { MOVE_y2, UINT8_MAX }, 702 [ORIENTATION_UL] = { MOVE_y3, UINT8_MAX }, 703 [ORIENTATION_DF] = { MOVE_z2, UINT8_MAX }, 704 [ORIENTATION_DR] = { MOVE_y, MOVE_z2, UINT8_MAX }, 705 [ORIENTATION_DB] = { MOVE_y2, MOVE_z2, UINT8_MAX }, 706 [ORIENTATION_DL] = { MOVE_y3, MOVE_z2, UINT8_MAX }, 707 [ORIENTATION_RF] = { MOVE_z3, UINT8_MAX }, 708 [ORIENTATION_RD] = { MOVE_z3, MOVE_y, UINT8_MAX }, 709 [ORIENTATION_RB] = { MOVE_z3, MOVE_y2, UINT8_MAX }, 710 [ORIENTATION_RU] = { MOVE_z3, MOVE_y3, UINT8_MAX }, 711 [ORIENTATION_LF] = { MOVE_z, UINT8_MAX }, 712 [ORIENTATION_LD] = { MOVE_z, MOVE_y3, UINT8_MAX }, 713 [ORIENTATION_LB] = { MOVE_z, MOVE_y2, UINT8_MAX }, 714 [ORIENTATION_LU] = { MOVE_z, MOVE_y, UINT8_MAX }, 715 [ORIENTATION_FD] = { MOVE_x, UINT8_MAX }, 716 [ORIENTATION_FR] = { MOVE_x, MOVE_y, UINT8_MAX }, 717 [ORIENTATION_FU] = { MOVE_x, MOVE_y2, UINT8_MAX }, 718 [ORIENTATION_FL] = { MOVE_x, MOVE_y3, UINT8_MAX }, 719 [ORIENTATION_BD] = { MOVE_x3, MOVE_y2, UINT8_MAX }, 720 [ORIENTATION_BR] = { MOVE_x3, MOVE_y, UINT8_MAX }, 721 [ORIENTATION_BU] = { MOVE_x3, UINT8_MAX }, 722 [ORIENTATION_BL] = { MOVE_x3, MOVE_y3, UINT8_MAX }, 723 }; 724 725 STATIC uint8_t orientation_transition_table[][3] = { 726 [ORIENTATION_UF] = { ORIENTATION_FD, ORIENTATION_UR, ORIENTATION_LF }, 727 [ORIENTATION_UR] = { ORIENTATION_RD, ORIENTATION_UB, ORIENTATION_FR }, 728 [ORIENTATION_UB] = { ORIENTATION_BD, ORIENTATION_UL, ORIENTATION_RB }, 729 [ORIENTATION_UL] = { ORIENTATION_LD, ORIENTATION_UF, ORIENTATION_BL }, 730 [ORIENTATION_DF] = { ORIENTATION_FU, ORIENTATION_DL, ORIENTATION_RF }, 731 [ORIENTATION_DR] = { ORIENTATION_RU, ORIENTATION_DF, ORIENTATION_BR }, 732 [ORIENTATION_DB] = { ORIENTATION_BU, ORIENTATION_DR, ORIENTATION_LB }, 733 [ORIENTATION_DL] = { ORIENTATION_LU, ORIENTATION_DB, ORIENTATION_FL }, 734 [ORIENTATION_RF] = { ORIENTATION_FL, ORIENTATION_RD, ORIENTATION_UF }, 735 [ORIENTATION_RD] = { ORIENTATION_DL, ORIENTATION_RB, ORIENTATION_FD }, 736 [ORIENTATION_RB] = { ORIENTATION_BL, ORIENTATION_RU, ORIENTATION_DB }, 737 [ORIENTATION_RU] = { ORIENTATION_UL, ORIENTATION_RF, ORIENTATION_BU }, 738 [ORIENTATION_LF] = { ORIENTATION_FR, ORIENTATION_LU, ORIENTATION_DF }, 739 [ORIENTATION_LD] = { ORIENTATION_DR, ORIENTATION_LF, ORIENTATION_BD }, 740 [ORIENTATION_LB] = { ORIENTATION_BR, ORIENTATION_LD, ORIENTATION_UB }, 741 [ORIENTATION_LU] = { ORIENTATION_UR, ORIENTATION_LB, ORIENTATION_FU }, 742 [ORIENTATION_FD] = { ORIENTATION_DB, ORIENTATION_FR, ORIENTATION_LD }, 743 [ORIENTATION_FR] = { ORIENTATION_RB, ORIENTATION_FU, ORIENTATION_DR }, 744 [ORIENTATION_FU] = { ORIENTATION_UB, ORIENTATION_FL, ORIENTATION_RU }, 745 [ORIENTATION_FL] = { ORIENTATION_LB, ORIENTATION_FD, ORIENTATION_UL }, 746 [ORIENTATION_BD] = { ORIENTATION_DF, ORIENTATION_BL, ORIENTATION_RD }, 747 [ORIENTATION_BR] = { ORIENTATION_RF, ORIENTATION_BD, ORIENTATION_UR }, 748 [ORIENTATION_BU] = { ORIENTATION_UF, ORIENTATION_BR, ORIENTATION_LU }, 749 [ORIENTATION_BL] = { ORIENTATION_LF, ORIENTATION_BU, ORIENTATION_DL }, 750 }; 751 752 STATIC uint8_t orientation_trans[] = { 753 [ORIENTATION_UF] = TRANS_UFr, 754 [ORIENTATION_UR] = TRANS_URr, 755 [ORIENTATION_UB] = TRANS_UBr, 756 [ORIENTATION_UL] = TRANS_ULr, 757 [ORIENTATION_DF] = TRANS_DFr, 758 [ORIENTATION_DR] = TRANS_DRr, 759 [ORIENTATION_DB] = TRANS_DBr, 760 [ORIENTATION_DL] = TRANS_DLr, 761 [ORIENTATION_RF] = TRANS_RFr, 762 [ORIENTATION_RD] = TRANS_RDr, 763 [ORIENTATION_RB] = TRANS_RBr, 764 [ORIENTATION_RU] = TRANS_RUr, 765 [ORIENTATION_LF] = TRANS_LFr, 766 [ORIENTATION_LD] = TRANS_LDr, 767 [ORIENTATION_LB] = TRANS_LBr, 768 [ORIENTATION_LU] = TRANS_LUr, 769 [ORIENTATION_FD] = TRANS_FDr, 770 [ORIENTATION_FR] = TRANS_FRr, 771 [ORIENTATION_FU] = TRANS_FUr, 772 [ORIENTATION_FL] = TRANS_FLr, 773 [ORIENTATION_BD] = TRANS_BDr, 774 [ORIENTATION_BR] = TRANS_BRr, 775 [ORIENTATION_BU] = TRANS_BUr, 776 [ORIENTATION_BL] = TRANS_BLr, 777 }; 778 779 typedef struct { 780 uint8_t move[3]; 781 uint8_t rotation[4]; 782 } equivalent_moves_t; 783 784 STATIC equivalent_moves_t equivalent_moves_table[] = { 785 [MOVE_U] = {{MOVE_U, UINT8_MAX}, {UINT8_MAX}}, 786 [MOVE_U2] = {{MOVE_U2, UINT8_MAX}, {UINT8_MAX}}, 787 [MOVE_U3] = {{MOVE_U3, UINT8_MAX}, {UINT8_MAX}}, 788 [MOVE_D] = {{MOVE_D, UINT8_MAX}, {UINT8_MAX}}, 789 [MOVE_D2] = {{MOVE_D2, UINT8_MAX}, {UINT8_MAX}}, 790 [MOVE_D3] = {{MOVE_D3, UINT8_MAX}, {UINT8_MAX}}, 791 [MOVE_R] = {{MOVE_R, UINT8_MAX}, {UINT8_MAX}}, 792 [MOVE_R2] = {{MOVE_R2, UINT8_MAX}, {UINT8_MAX}}, 793 [MOVE_R3] = {{MOVE_R3, UINT8_MAX}, {UINT8_MAX}}, 794 [MOVE_L] = {{MOVE_L, UINT8_MAX}, {UINT8_MAX}}, 795 [MOVE_L2] = {{MOVE_L2, UINT8_MAX}, {UINT8_MAX}}, 796 [MOVE_L3] = {{MOVE_L3, UINT8_MAX}, {UINT8_MAX}}, 797 [MOVE_F] = {{MOVE_F, UINT8_MAX}, {UINT8_MAX}}, 798 [MOVE_F2] = {{MOVE_F2, UINT8_MAX}, {UINT8_MAX}}, 799 [MOVE_F3] = {{MOVE_F3, UINT8_MAX}, {UINT8_MAX}}, 800 [MOVE_B] = {{MOVE_B, UINT8_MAX}, {UINT8_MAX}}, 801 [MOVE_B2] = {{MOVE_B2, UINT8_MAX}, {UINT8_MAX}}, 802 [MOVE_B3] = {{MOVE_B3, UINT8_MAX}, {UINT8_MAX}}, 803 804 [MOVE_Uw] = {{MOVE_D, UINT8_MAX}, {1, UINT8_MAX}}, 805 [MOVE_Uw2] = {{MOVE_D2, UINT8_MAX}, {1, 1, UINT8_MAX}}, 806 [MOVE_Uw3] = {{MOVE_D3, UINT8_MAX}, {1, 1, 1, UINT8_MAX}}, 807 [MOVE_Dw] = {{MOVE_U, UINT8_MAX}, {1, 1, 1, UINT8_MAX}}, 808 [MOVE_Dw2] = {{MOVE_U2, UINT8_MAX}, {1, 1, UINT8_MAX}}, 809 [MOVE_Dw3] = {{MOVE_U3, UINT8_MAX}, {1, UINT8_MAX}}, 810 [MOVE_Rw] = {{MOVE_L, UINT8_MAX}, {0, UINT8_MAX}}, 811 [MOVE_Rw2] = {{MOVE_L2, UINT8_MAX}, {0, 0, UINT8_MAX}}, 812 [MOVE_Rw3] = {{MOVE_L3, UINT8_MAX}, {0, 0, 0, UINT8_MAX}}, 813 [MOVE_Lw] = {{MOVE_R, UINT8_MAX}, {0, 0, 0, UINT8_MAX}}, 814 [MOVE_Lw2] = {{MOVE_R2, UINT8_MAX}, {0, 0, UINT8_MAX}}, 815 [MOVE_Lw3] = {{MOVE_R3, UINT8_MAX}, {0, UINT8_MAX}}, 816 [MOVE_Fw] = {{MOVE_B, UINT8_MAX}, {2, UINT8_MAX}}, 817 [MOVE_Fw2] = {{MOVE_B2, UINT8_MAX}, {2, 2, UINT8_MAX}}, 818 [MOVE_Fw3] = {{MOVE_B3, UINT8_MAX}, {2, 2, 2, UINT8_MAX}}, 819 [MOVE_Bw] = {{MOVE_F, UINT8_MAX}, {2, 2, 2, UINT8_MAX}}, 820 [MOVE_Bw2] = {{MOVE_F2, UINT8_MAX}, {2, 2, UINT8_MAX}}, 821 [MOVE_Bw3] = {{MOVE_F3, UINT8_MAX}, {2, UINT8_MAX}}, 822 823 [MOVE_M] = {{MOVE_R, MOVE_L3, UINT8_MAX}, {0, 0, 0, UINT8_MAX}}, 824 [MOVE_M2] = {{MOVE_R2, MOVE_L2, UINT8_MAX}, {0, 0, UINT8_MAX}}, 825 [MOVE_M3] = {{MOVE_R3, MOVE_L, UINT8_MAX}, {0, UINT8_MAX}}, 826 [MOVE_S] = {{MOVE_F3, MOVE_B, UINT8_MAX}, {2, UINT8_MAX}}, 827 [MOVE_S2] = {{MOVE_F2, MOVE_B2, UINT8_MAX}, {2, 2, UINT8_MAX}}, 828 [MOVE_S3] = {{MOVE_F, MOVE_B3, UINT8_MAX}, {2, 2, 2, UINT8_MAX}}, 829 [MOVE_E] = {{MOVE_U, MOVE_D3, UINT8_MAX}, {1, 1, 1, UINT8_MAX}}, 830 [MOVE_E2] = {{MOVE_U2, MOVE_D2, UINT8_MAX}, {1, 1, UINT8_MAX}}, 831 [MOVE_E3] = {{MOVE_U3, MOVE_D, UINT8_MAX}, {1, UINT8_MAX}}, 832 833 [MOVE_x] = {{UINT8_MAX}, {0, UINT8_MAX}}, 834 [MOVE_x2] = {{UINT8_MAX}, {0, 0, UINT8_MAX}}, 835 [MOVE_x3] = {{UINT8_MAX}, {0, 0, 0, UINT8_MAX}}, 836 [MOVE_y] = {{UINT8_MAX}, {1, UINT8_MAX}}, 837 [MOVE_y2] = {{UINT8_MAX}, {1, 1, UINT8_MAX}}, 838 [MOVE_y3] = {{UINT8_MAX}, {1, 1, 1, UINT8_MAX}}, 839 [MOVE_z] = {{UINT8_MAX}, {2, UINT8_MAX}}, 840 [MOVE_z2] = {{UINT8_MAX}, {2, 2, UINT8_MAX}}, 841 [MOVE_z3] = {{UINT8_MAX}, {2, 2, 2, UINT8_MAX}}, 842 };