chiark / gitweb /
Group: fill in the latin.c validator function.
authorSimon Tatham <anakin@pobox.com>
Sat, 23 May 2020 07:41:43 +0000 (08:41 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 23 May 2020 08:08:08 +0000 (09:08 +0100)
This actually fixes the example game id mentioned in the previous
commit. Now 12i:m12b9a1zd9i6d10c3y2l11q4r is reported as Unreasonable
rather than ambiguous, on the basis that although the solver still
recurses and finds two filled grids, the validator throws out the
nonsense one at the last minute, leaving only one that's actually
legal.

unfinished/group.c

index 3a44a678720e3e884412074bfa281d2a88dd3b73..c7dcb2c0f2b66e2ba00537e912bc6277bf35952f 100644 (file)
@@ -450,7 +450,37 @@ static usersolver_t const group_solvers[] = { DIFFLIST(SOLVER) };
 
 static bool group_valid(struct latin_solver *solver, void *ctx)
 {
-    return true;                       /* FIXME */
+    int w = solver->o;
+#ifdef STANDALONE_SOLVER
+    char **names = solver->names;
+#endif
+    int i, j, k;
+
+    for (i = 0; i < w; i++)
+       for (j = 0; j < w; j++)
+           for (k = 0; k < w; k++) {
+                int ij = grid(i, j) - 1;
+                int jk = grid(j, k) - 1;
+                int ij_k = grid(ij, k) - 1;
+                int i_jk = grid(i, jk) - 1;
+                if (ij_k != i_jk) {
+#ifdef STANDALONE_SOLVER
+                    if (solver_show_working) {
+                        printf("%*sfailure of associativity: "
+                               "(%s%s)%s = %s%s = %s but "
+                               "%s(%s%s) = %s%s = %s\n",
+                               solver_recurse_depth*4, "",
+                               names[i], names[j], names[k],
+                               names[ij], names[k], names[ij_k],
+                               names[i], names[j], names[k],
+                               names[i], names[jk], names[i_jk]);
+                    }
+#endif
+                    return false;
+                }
+            }
+
+    return true;
 }
 
 static int solver(const game_params *params, digit *grid, int maxdiff)