dr.h (2814B)
1 #define DREOESEP_CLASSES UINT64_C(64430) 2 #define DREOESEP_MAX (POW_2_11 * COMB_12_4) 3 4 STATIC uint64_t coord_dreoesep_nosym(cube_t); 5 STATIC cube_t invcoord_dreoesep_nosym(uint64_t); 6 STATIC cube_t coordinate_dr_merge(cube_t, cube_t); 7 8 STATIC uint64_t coordinate_dr_coord(cube_t, const unsigned char *); 9 STATIC cube_t coordinate_dr_cube(uint64_t, const unsigned char *); 10 STATIC bool coordinate_dr_isnasty(uint64_t, const unsigned char *); 11 STATIC size_t coordinate_dr_gendata(unsigned char *); 12 13 STATIC bool is_eoco_solvable(cube_t); 14 15 /* TODO: remove the following two when all coordinates are converted to unsigned */ 16 STATIC uint64_t coord_co_u(cube_t c) { return (uint64_t)coord_co(c); } 17 STATIC cube_t invcoord_co_u(uint64_t i) { return invcoord_co((int64_t)i); } 18 19 STATIC coord_t coordinate_dr = { 20 .name = "DR", 21 .coord = &coordinate_dr_coord, 22 .cube = &coordinate_dr_cube, 23 .isnasty = &coordinate_dr_isnasty, 24 .gendata = coordinate_dr_gendata, 25 .max = DREOESEP_CLASSES * POW_3_7, 26 .trans_mask = TM_UDFIX, 27 .moves_mask = MM_ALLMOVES, 28 .axistrans = { 29 [AXIS_UD] = TRANS_UFr, 30 [AXIS_RL] = TRANS_RFr, 31 [AXIS_FB] = TRANS_FDr, 32 }, 33 .is_admissible = &solution_lastqt_cw, 34 .is_solvable = &is_eoco_solvable, 35 .sym = { 36 .classes = DREOESEP_CLASSES, 37 .max = DREOESEP_MAX, 38 .coord = &coord_dreoesep_nosym, 39 .cube = &invcoord_dreoesep_nosym, 40 .max2 = POW_3_7, 41 .coord2 = &coord_co_u, 42 .cube2 = &invcoord_co_u, 43 .merge = &coordinate_dr_merge, 44 }, 45 }; 46 47 STATIC uint64_t 48 coord_dreoesep_nosym(cube_t cube) 49 { 50 uint64_t eo, esep; 51 52 esep = coord_esep(cube) / COMB_8_4; 53 eo = coord_eo(cube); 54 55 return esep * POW_2_11 + eo; 56 } 57 58 STATIC cube_t 59 invcoord_dreoesep_nosym(uint64_t coord) 60 { 61 uint64_t eo, esep; 62 cube_t cube; 63 64 eo = coord % POW_2_11; 65 esep = (coord / POW_2_11) * COMB_8_4; 66 cube = invcoord_esep(esep); 67 set_eo(&cube, eo); 68 69 return cube; 70 } 71 72 STATIC cube_t 73 coordinate_dr_merge(cube_t c1, cube_t c2) 74 { 75 cube_t merged; 76 77 merged = c1; 78 copy_corners(&merged, c2); 79 80 return merged; 81 } 82 83 STATIC uint64_t 84 coordinate_dr_coord(cube_t cube, const unsigned char *data) 85 { 86 return coord_coord_generic(&coordinate_dr, cube, data); 87 } 88 89 STATIC cube_t 90 coordinate_dr_cube(uint64_t i, const unsigned char *data) 91 { 92 return coord_cube_generic(&coordinate_dr, i, data); 93 } 94 95 STATIC bool 96 coordinate_dr_isnasty(uint64_t i, const unsigned char *data) 97 { 98 return coord_isnasty_generic(&coordinate_dr, i, data); 99 } 100 101 STATIC size_t 102 coordinate_dr_gendata(unsigned char *data) 103 { 104 return coord_gendata_generic(&coordinate_dr, data); 105 } 106 107 STATIC bool 108 is_eoco_solvable(cube_t cube) { 109 uint8_t c[8], e[12], i, cocount, eocount; 110 111 pieces(&cube, c, e); 112 113 for (i = 0, cocount = 0; i < 8; i++) 114 cocount += (c[i] & COBITS_2) >> COSHIFT; 115 116 for (i = 0, eocount = 0; i < 12; i++) 117 eocount += (e[i] & EOBIT) >> EOSHIFT; 118 119 return cocount % 3 == 0 && eocount % 2 == 0; 120 }