From 9ea0417aefab549fa47bc9fe9a42d9bdad4ee353 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 12 Mar 2006 17:02:30 +0000 Subject: [PATCH] mm: Add a `quiet' flag to suppress normal thinking noise. --- mm.c | 74 +++++++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/mm.c b/mm.c index df68992..3048108 100644 --- a/mm.c +++ b/mm.c @@ -174,6 +174,8 @@ static void rate_free(ratectx *r) { xfree(r->v); DESTROY(r); } typedef struct cpc { mm m; /* Game parameters */ + unsigned f; /* Various flags */ +#define CPCF_QUIET 1u /* Don't produce lots of output */ dig *s; /* n^k * k */ /* Remaining guesses */ size_t ns; /* Number of remaining guesses */ dig *bg; /* k */ /* Current best guess */ @@ -313,19 +315,25 @@ static void all_guesses(dig **ss, unsigned k, unsigned n, } } -#define THINK(what, how) do { \ - clock_t _t0, _t1; \ - fputs(what "...", stdout); \ - fflush(stdout); \ - _t0 = clock(); \ +#define THINK(c, what, how) do { \ + clock_t _t0 = 0, _t1; \ + if (!(c->f & CPCF_QUIET)) { \ + fputs(what "...", stdout); \ + fflush(stdout); \ + _t0 = clock(); \ + } \ do how while (0); \ - _t1 = clock(); \ - printf(" done (%.2fs)\n", (_t1 - _t0)/(double)CLOCKS_PER_SEC); \ + if (!(c->f & CPCF_QUIET)) { \ + _t1 = clock(); \ + printf(" done (%.2fs)\n", (_t1 - _t0)/(double)CLOCKS_PER_SEC); \ + } \ } while (0) -static cpc *cpc_new(const mm *m) +static cpc *cpc_new(const mm *m, unsigned f) { cpc *c = CREATE(cpc); + + c->f = f; c->m = *m; c->ns = ipow(c->m.n, c->m.k); c->s = xmalloc((c->ns + 2) * c->m.k * sizeof(dig)); @@ -334,7 +342,7 @@ static cpc *cpc_new(const mm *m) c->x = 0; c->v = xmalloc((c->m.k + 1) * (c->m.k + 1) * sizeof(size_t)); c->r = rate_alloc(m); - THINK("Setting up", { + THINK(c, "Setting up", { dig *ss = c->s; all_guesses(&ss, c->m.k, c->m.n, 0, 0); }); return (c); @@ -356,27 +364,32 @@ static const dig *cp_guess(void *cc) cpc *c = cc; if (c->ns == 0) { - printf("Liar! All solutions ruled out.\n"); + if (!(c->f & CPCF_QUIET)) + printf("Liar! All solutions ruled out.\n"); return (0); } if (c->ns == 1) { - fputs("Done! Solution is ", stdout); - print_guess(&c->m, c->s); - putchar('\n'); + if (!(c->f & CPCF_QUIET)) { + fputs("Done! Solution is ", stdout); + print_guess(&c->m, c->s); + putchar('\n'); + } return (c->s); } - printf("(Possible solutions remaining = %lu)\n", - (unsigned long)c->ns); - if (c->ns < 32) { - const dig *s; - size_t i; - for (i = c->ns, s = c->s; i; i--, s += c->m.k) { - printf(" %2lu: ", (unsigned long)(c->ns - i + 1)); - print_guess(&c->m, s); - putchar('\n'); + if (!(c->f & CPCF_QUIET)) { + printf("(Possible solutions remaining = %lu)\n", + (unsigned long)c->ns); + if (c->ns < 32) { + const dig *s; + size_t i; + for (i = c->ns, s = c->s; i; i--, s += c->m.k) { + printf(" %2lu: ", (unsigned long)(c->ns - i + 1)); + print_guess(&c->m, s); + putchar('\n'); + } } } - THINK("Pondering", { + THINK(c, "Pondering", { best_guess(c); }); return (c->bg); @@ -385,10 +398,13 @@ static const dig *cp_guess(void *cc) static void cp_update(void *cc, const dig *g, unsigned b, unsigned w) { cpc *c = cc; - fputs("My guess = ", stdout); - print_guess(&c->m, g); - printf("; rating = %u black, %u white\n", b, w); - THINK("Filtering", { + + if (!(c->f & CPCF_QUIET)) { + fputs("My guess = ", stdout); + print_guess(&c->m, g); + printf("; rating = %u black, %u white\n", b, w); + } + THINK(c, "Filtering", { filter_guesses(c, g, b, w); }); } @@ -455,7 +471,7 @@ typedef struct spc { static spc *spc_new(const mm *m) { spc *s = CREATE(spc); - s->c = cpc_new(m); + s->c = cpc_new(m, 0); s->h = hpc_new(m); s->i = 0; return (s); @@ -588,7 +604,7 @@ int main(int argc, char *argv[]) hpc_free(hh); } break; case 0: { - cpc *cc = cpc_new(&m); + cpc *cc = cpc_new(&m, 0); if (rr) n = play(&m, ratefn, rr, cp_guess, cp_update, cc); else -- 2.11.0