aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/coord/dreo.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/coord/dreo.h')
-rw-r--r--src/solvers/coord/dreo.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/solvers/coord/dreo.h b/src/solvers/coord/dreo.h
new file mode 100644
index 0000000..37de0d3
--- /dev/null
+++ b/src/solvers/coord/dreo.h
@@ -0,0 +1,102 @@
1#define DRESEP_CLASSES 81
2
3STATIC uint64_t coord_dresep_nosym(cube_t);
4STATIC cube_t invcoord_dresep_nosym(uint64_t);
5STATIC cube_t coordinate_dreo_merge(cube_t, cube_t);
6
7STATIC uint64_t coordinate_dreo_coord(cube_t, const void *);
8STATIC cube_t coordinate_dreo_cube(uint64_t, const void *);
9STATIC bool coordinate_dreo_isnasty(uint64_t, const void *);
10STATIC size_t coordinate_dreo_gendata(void *);
11
12STATIC bool is_dreo_solvable(cube_t);
13
14STATIC coord_t coordinate_dreo = {
15 .name = "DREO",
16 .coord = &coordinate_dreo_coord,
17 .cube = &coordinate_dreo_cube,
18 .isnasty = &coordinate_dreo_isnasty,
19 .gendata = coordinate_dreo_gendata,
20 .max = DRESEP_CLASSES * POW_3_7,
21 .trans_mask = TM_UDRLFIX,
22 .moves_mask = MM_EO,
23 .axistrans = {
24 [AXIS_UD] = TRANS_UFr,
25 [AXIS_RL] = TRANS_RFr,
26 [AXIS_FB] = TRANS_FDr,
27 },
28 .is_admissible = &solution_lastqt_cw,
29 .is_solvable = &is_dreo_solvable,
30 .sym = {
31 .classes = DRESEP_CLASSES,
32 .max = COMB_12_4,
33 .coord = &coord_dresep_nosym,
34 .cube = &invcoord_dresep_nosym,
35 .max2 = POW_3_7,
36 .coord2 = &coord_co_u,
37 .cube2 = &invcoord_co_u,
38 .merge = &coordinate_dreo_merge,
39 },
40};
41
42STATIC uint64_t
43coord_dresep_nosym(cube_t cube)
44{
45 return (uint64_t)coord_esep(cube) / COMB_8_4;
46}
47
48STATIC cube_t
49invcoord_dresep_nosym(uint64_t coord)
50{
51 return invcoord_esep(coord * COMB_8_4);
52}
53
54STATIC cube_t
55coordinate_dreo_merge(cube_t c1, cube_t c2)
56{
57 cube_t merged;
58
59 merged = c1;
60 copy_corners(&merged, c2);
61
62 return merged;
63}
64
65STATIC uint64_t
66coordinate_dreo_coord(cube_t cube, const void *data)
67{
68 return coord_coord_generic(&coordinate_dreo, cube, data);
69}
70
71STATIC cube_t
72coordinate_dreo_cube(uint64_t i, const void *data)
73{
74 return coord_cube_generic(&coordinate_dreo, i, data);
75}
76
77STATIC bool
78coordinate_dreo_isnasty(uint64_t i, const void *data)
79{
80 return coord_isnasty_generic(&coordinate_dreo, i, data);
81}
82
83STATIC size_t
84coordinate_dreo_gendata(void *data)
85{
86 return coord_gendata_generic(&coordinate_dreo, data);
87}
88
89STATIC bool
90is_dreo_solvable(cube_t cube) {
91 uint8_t c[8], e[12], i, cocount;
92
93 if (coord_eo(cube) != 0)
94 return false;
95
96 pieces(&cube, c, e);
97
98 for (i = 0, cocount = 0; i < 8; i++)
99 cocount += (c[i] & COBITS_2) >> COSHIFT;
100
101 return cocount % 3 == 0;
102}

Generated with cgit - Back to sebastiano.tronto.net