diff --git a/.gitignore b/.gitignore
index d3b07e1..d392cc8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
# Build files
*.o
sudoku
+eval
# Test data
sudoku.csv
diff --git a/Makefile b/Makefile
index c81b22b..a7ba07d 100644
--- a/Makefile
+++ b/Makefile
@@ -31,10 +31,14 @@ OBJ = $(SRC:.c=.o)
sudoku: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $@
-clean:
- rm -f sudoku $(OBJ)
+eval: eval.o
+ $(CC) $(CFLAGS) $(LDFLAGS) eval.o -o $@
-main.o: sud.h solve.h
+clean:
+ rm -f sudoku *.o
+
+eval.o: ds.h
+main.o: sud.h solve.h ds.h
sud.o: sud.h
solve.o: solve.h
@@ -47,7 +51,8 @@ solns: sudoku.csv
results:
dd if=/dev/zero of=$@ bs=1000 count=729000
-run: sudoku puzzles results
+run: sudoku eval puzzles solns results
time ./sudoku
+ ./eval
.PHONY: clean run
diff --git a/ds.h b/ds.h
new file mode 100644
index 0000000..d18d76f
--- /dev/null
+++ b/ds.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 Camden Dixie O'Brien
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * .
+ */
+
+#ifndef DS_H
+#define DS_H
+
+#define NPUZZ 9000000U
+
+#endif
diff --git a/eval.c b/eval.c
new file mode 100644
index 0000000..fcad8f1
--- /dev/null
+++ b/eval.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 Camden Dixie O'Brien
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * .
+ */
+
+#include "ds.h"
+#include "sud.h"
+
+#include
+#include
+#include
+
+#define RESNAME "results"
+#define SOLNAME "solns"
+
+int main(void)
+{
+ FILE *rfp = fopen(RESNAME, "rb");
+ if (!rfp) {
+ fputs("Failed to open results file\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ FILE *sfp = fopen(SOLNAME, "rb");
+ if (!sfp) {
+ fputs("Failed to open solutions file\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ unsigned correct = 0;
+ char res[NCELLS], sol[NCELLS];
+ for (unsigned i = 0; i < NPUZZ; ++i) {
+ if (fread(&res, sizeof(char), NCELLS, rfp) != NCELLS) {
+ fprintf(stderr, "Failed to read result #%u\n", i);
+ return EXIT_FAILURE;
+ }
+ if (fread(&sol, sizeof(char), NCELLS, sfp) != NCELLS) {
+ fprintf(stderr, "Failed to read result #%u\n", i);
+ return EXIT_FAILURE;
+ }
+
+ if (memcmp(res, sol, NCELLS) == 0)
+ ++correct;
+ }
+
+ double pc = 1e2 * (double)correct / (double)NPUZZ;
+ printf("%u/%u correct (%.2f%%)\n", correct, NPUZZ, pc);
+
+ fclose(rfp);
+ fclose(sfp);
+ return EXIT_SUCCESS;
+}
diff --git a/main.c b/main.c
index 9188133..f5a047f 100644
--- a/main.c
+++ b/main.c
@@ -16,6 +16,7 @@
* .
*/
+#include "ds.h"
#include "solve.h"
#include "sud.h"
@@ -28,8 +29,7 @@
#define IFNAME "puzzles"
#define OFNAME "results"
-#define NSUD 9000000U
-#define FSIZE (NSUD * NCELLS)
+#define FSIZE (NPUZZ * NCELLS)
int main(void)
{