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) {