commit 10632e9fa6e8037cd584a29536e6ab1be9ca359b
parent a107b58dc4c34c187e31065293124e722158b919
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date: Fri, 1 Aug 2025 11:26:49 +0200
Reworked coordinate solver axis specification
Diffstat:
11 files changed, 37 insertions(+), 61 deletions(-)
diff --git a/src/core/transform.h b/src/core/transform.h
@@ -18,6 +18,7 @@
TRANS_CUBE_ ## T ## _INVERSE))
STATIC uint8_t readtrans(const char [static NISSY_SIZE_TRANSFORMATION]);
+STATIC uint8_t readrotation(const char [static 2]);
STATIC void writetrans(uint8_t, char [static NISSY_SIZE_TRANSFORMATION]);
STATIC cube_t transform_edges(cube_t, uint8_t);
@@ -39,6 +40,18 @@ readtrans(const char buf[static NISSY_SIZE_TRANSFORMATION])
return UINT8_ERROR;
}
+STATIC uint8_t
+readrotation(const char buf[static 2])
+{
+ char trans_str[NISSY_SIZE_TRANSFORMATION];
+
+ strcpy(trans_str, "rotation xx");
+ trans_str[9] = buf[0];
+ trans_str[10] = buf[1];
+
+ return readtrans(trans_str);
+}
+
STATIC void
writetrans(uint8_t t, char buf[static NISSY_SIZE_TRANSFORMATION])
{
diff --git a/src/solvers/coord/checkdata.h b/src/solvers/coord/checkdata.h
@@ -19,7 +19,7 @@ checkdata_coord(
return NISSY_ERROR_DATA;
}
- parse_coord_and_axis(solver, &coord, NULL);
+ parse_coord_and_trans(solver, &coord, NULL);
if (coord == NULL) {
LOG("[cehckdata] Unknown coordinate solver '%s'\n", solver);
return NISSY_ERROR_DATA;
diff --git a/src/solvers/coord/dr.h b/src/solvers/coord/dr.h
@@ -22,11 +22,6 @@ STATIC coord_t coordinate_dr = {
.trans_mask = TM_UDFIX,
.moves_mask_gendata = MM18_ALLMOVES,
.moves_mask_solve = MM18_ALLMOVES,
- .axistrans = {
- [AXIS_UD] = TRANS_UFr,
- [AXIS_RL] = TRANS_RFr,
- [AXIS_FB] = TRANS_FDr,
- },
.is_admissible = &solution_lastqt_cw,
.is_solvable = &is_eoco_solvable,
.is_solved = NULL,
diff --git a/src/solvers/coord/dreo.h b/src/solvers/coord/dreo.h
@@ -21,11 +21,6 @@ STATIC coord_t coordinate_dreo = {
.trans_mask = TM_UDRLFIX,
.moves_mask_gendata = MM18_EO,
.moves_mask_solve = MM18_EO,
- .axistrans = {
- [AXIS_UD] = TRANS_UFr,
- [AXIS_RL] = TRANS_RFr,
- [AXIS_FB] = TRANS_FDr,
- },
.is_admissible = &solution_lastqt_cw,
.is_solvable = &is_dreo_solvable,
.is_solved = NULL,
diff --git a/src/solvers/coord/drfinnoe.h b/src/solvers/coord/drfinnoe.h
@@ -31,11 +31,6 @@ STATIC coord_t coordinate_drfinnoe = {
.trans_mask = TM_UDFIX,
.moves_mask_gendata = MM18_DR,
.moves_mask_solve = MM18_DR,
- .axistrans = {
- [AXIS_UD] = TRANS_UFr,
- [AXIS_RL] = TRANS_RFr,
- [AXIS_FB] = TRANS_FDr,
- },
.is_admissible = &solution_always_valid,
.is_solvable = &is_drfinnoe_solvable,
.is_solved = NULL,
diff --git a/src/solvers/coord/drslice.h b/src/solvers/coord/drslice.h
@@ -23,11 +23,6 @@ STATIC coord_t coordinate_drslice = {
.trans_mask = TM_UDFIX,
.moves_mask_gendata = MM18_DR,
.moves_mask_solve = MM18_DR_NOD,
- .axistrans = {
- [AXIS_UD] = TRANS_UFr,
- [AXIS_RL] = TRANS_LFr,
- [AXIS_FB] = TRANS_FUr,
- },
.is_admissible = &solution_always_valid,
.is_solvable = &is_drslice_solvable,
.is_solved = &is_drslice_solved,
diff --git a/src/solvers/coord/eo.h b/src/solvers/coord/eo.h
@@ -14,11 +14,6 @@ STATIC coord_t coordinate_eo = {
.trans_mask = TM_SINGLE(TRANS_UFr),
.moves_mask_gendata = MM18_ALLMOVES,
.moves_mask_solve = MM18_ALLMOVES,
- .axistrans = {
- [AXIS_UD] = TRANS_FDr,
- [AXIS_RL] = TRANS_URr,
- [AXIS_FB] = TRANS_UFr,
- },
.is_admissible = &solution_lastqt_cw,
.is_solvable = &is_eo_even,
.is_solved = NULL,
diff --git a/src/solvers/coord/gendata.h b/src/solvers/coord/gendata.h
@@ -24,7 +24,7 @@ gendata_coord_dispatch(
{
coord_t *coord;
- parse_coord_and_axis(coordstr, &coord, NULL);
+ parse_coord_and_trans(coordstr, &coord, NULL);
if (coord == NULL) {
LOG("Error: could not parse coordinate '%s'\n", coordstr);
diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h
@@ -240,7 +240,7 @@ solve_coord_dfs(dfsarg_solve_coord_t arg[static 1])
STATIC long long
solve_coord_dispatch(
oriented_cube_t oc,
- const char *coord_and_axis,
+ const char *coord_and_trans,
unsigned nissflag,
unsigned minmoves,
unsigned maxmoves,
@@ -257,22 +257,23 @@ solve_coord_dispatch(
)
{
coord_t *coord;
- uint8_t axis;
+ uint8_t trans;
- parse_coord_and_axis(coord_and_axis, &coord, &axis);
+ parse_coord_and_trans(coord_and_trans, &coord, &trans);
if (coord == NULL) {
LOG("Error: could not parse coordinate from '%s'\n",
- coord_and_axis);
+ coord_and_trans);
return NISSY_ERROR_INVALID_SOLVER;
}
- if (axis == UINT8_ERROR) {
- LOG("Error: could not parse axis from '%s'\n", coord_and_axis);
+ if (trans == UINT8_ERROR) {
+ LOG("Error: could not parse transformation from '%s'\n",
+ coord_and_trans);
return NISSY_ERROR_INVALID_SOLVER;
}
- return solve_coord(oc, coord, axis, nissflag, minmoves, maxmoves,
+ return solve_coord(oc, coord, trans, nissflag, minmoves, maxmoves,
maxsolutions, optimal, threads, data_size, data,
solutions_size, sols, poll_status, poll_status_data);
}
@@ -281,7 +282,7 @@ STATIC int64_t
solve_coord(
oriented_cube_t oc,
coord_t coord [static 1],
- uint8_t axis,
+ uint8_t trans,
uint8_t nissflag,
uint8_t minmoves,
uint8_t maxmoves,
@@ -297,7 +298,6 @@ solve_coord(
)
{
int8_t d;
- uint8_t t;
uint64_t i;
int64_t err;
cube_t c;
@@ -309,8 +309,7 @@ solve_coord(
solution_settings_t solution_settings;
solution_list_t solution_list;
- t = coord->axistrans[axis];
- c = transform(oc.cube, t);
+ c = transform(oc.cube, trans);
if (!coord->is_solvable(c))
goto solve_coord_error_unsolvable;
@@ -334,7 +333,7 @@ solve_coord(
solution_moves_reset(&solution_moves);
solution_settings = (solution_settings_t) {
- .tmask = TM_SINGLE(inverse_trans(t)),
+ .tmask = TM_SINGLE(inverse_trans(trans)),
.unniss = false,
.maxmoves = maxmoves,
.maxsolutions = maxsolutions,
diff --git a/src/solvers/coord/types_macros.h b/src/solvers/coord/types_macros.h
@@ -25,7 +25,6 @@ typedef struct {
uint64_t moves_mask_gendata;
uint64_t moves_mask_solve;
uint64_t trans_mask;
- uint8_t axistrans[3];
bool (*is_admissible)(const solution_moves_t[static 1]);
bool (*is_solvable)(cube_t);
bool (*is_solved)(uint64_t, const unsigned char *);
diff --git a/src/solvers/coord/utils.h b/src/solvers/coord/utils.h
@@ -1,6 +1,5 @@
STATIC coord_t *parse_coord(size_t, const char *);
-STATIC uint8_t parse_axis(const char [static 2]);
-STATIC void parse_coord_and_axis(const char *, coord_t **, uint8_t *);
+STATIC void parse_coord_and_trans(const char *, coord_t **, uint8_t *);
STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]);
STATIC coord_t *
@@ -8,6 +7,10 @@ parse_coord(size_t n, const char *coord)
{
int i;
+ /*
+ TODO Some coordinates are parsed incorrectly, e.g. DRFINNOE
+ TODO is matched by DRFIN. Check that strncmp is used correctly.
+ */
for (i = 0; all_coordinates[i] != NULL; i++)
if (!strncmp(all_coordinates[i]->name, coord, n))
return all_coordinates[i];
@@ -15,25 +18,11 @@ parse_coord(size_t n, const char *coord)
return NULL;
}
-STATIC uint8_t
-parse_axis(const char axis[static 2])
-{
- if (!strcmp(axis, "UD") || !strcmp(axis, "DU")) {
- return AXIS_UD;
- } else if (!strcmp(axis, "RL") || !strcmp(axis, "LR")) {
- return AXIS_RL;
- } else if (!strcmp(axis, "FB") || !strcmp(axis, "BF")) {
- return AXIS_FB;
- }
-
- return UINT8_ERROR;
-}
-
STATIC void
-parse_coord_and_axis(
+parse_coord_and_trans(
const char *str,
coord_t **coord,
- uint8_t *axis
+ uint8_t *trans
)
{
size_t i;
@@ -45,8 +34,9 @@ parse_coord_and_axis(
if (coord != NULL)
*coord = parse_coord(i-6, str+6);
- if (axis != NULL)
- *axis = i == strlen(str) ? UINT8_ERROR : parse_axis(str+i+1);
+ if (trans != NULL)
+ *trans = i == strlen(str) ?
+ UINT8_ERROR : readrotation(str+i+1);
}
STATIC long long
@@ -54,7 +44,7 @@ dataid_coord(const char *ca, char dataid[static NISSY_SIZE_DATAID])
{
coord_t *c;
- parse_coord_and_axis(ca, &c, NULL);
+ parse_coord_and_trans(ca, &c, NULL);
if (c == NULL) {
LOG("Error: cannot parse coordinate from '%s'\n", ca);