diff --git a/main.c b/main.c index 8816d2c..969d84c 100644 --- a/main.c +++ b/main.c @@ -23,6 +23,9 @@ #include #include +#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'); + 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); + } - bool res = solve(&sud); - if (!res) { - puts("Solver encountered an error\n"); - } else { - puts("End:"); - print(&sud); + 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; }