Alter main() to run benchmark instead of single puzzle

This commit is contained in:
Camden Dixie O'Brien 2022-11-23 14:38:11 +00:00
parent 39d417f2bc
commit ef7f0f0f73

61
main.c
View File

@ -23,6 +23,9 @@
#include <stdio.h>
#include <stdlib.h>
#define PROG_UPDATEPRD 20
#define NPUZZLES 1024U
static uint32_t getseed(void)
{
FILE *urandom = fopen("/dev/urandom", "rb");
@ -44,19 +47,53 @@ int main(void)
printf("Seed: %u\n\n", seed);
srand(seed);
struct sudoku sud;
gen(&sud);
puts("Start:");
print(&sud);
putchar('\n');
bool res = solve(&sud);
if (!res) {
puts("Solver encountered an error\n");
} else {
puts("End:");
print(&sud);
struct sudoku puzzles[NPUZZLES];
unsigned i, j, bslen = 0;
fputs("Generating... ", stdout);
for (i = 0; i < NPUZZLES; ++i) {
if (i % PROG_UPDATEPRD == 0) {
for (j = 0; j < bslen; ++j)
putchar('\b');
bslen = (unsigned)printf("%u%%", 100 * i / NPUZZLES);
fflush(stdout);
}
gen(&puzzles[i]);
}
for (j = 0; j < bslen; ++j)
putchar('\b');
puts("100%");
bool res[NPUZZLES];
fputs("Solving... ", stdout);
for (i = 0; i < NPUZZLES; ++i)
res[i] = solve(&puzzles[i]);
puts("done");
unsigned error = 0, incomplete = 0, incorrect = 0, solved = 0;
for (i = 0; i < NPUZZLES; ++i) {
if (!res[i]) {
++error;
continue;
}
switch (check(&puzzles[i])) {
case INCOMPLETE:
++incomplete;
break;
case INCORRECT:
++incorrect;
break;
case SOLVED:
++solved;
break;
}
}
puts("\n SUMMARY\n =======");
printf("Solved: %4u/%u\n", solved, NPUZZLES);
printf("Incomplete: %4u/%u\n", incomplete, NPUZZLES);
printf("Incorrect: %4u/%u\n", incorrect, NPUZZLES);
printf("Solver error: %4u/%u\n", error, NPUZZLES);
return 0;
}