chiark / gitweb /
mm: Add a `quiet' flag to suppress normal thinking noise.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 12 Mar 2006 17:02:30 +0000 (17:02 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 12 Mar 2006 17:02:30 +0000 (17:02 +0000)
mm.c

diff --git a/mm.c b/mm.c
index df6899206b4793b3bf9fab0f6c58a748ea67f52d..3048108456f7156184a6907b507c9ab5175ff2d5 100644 (file)
--- 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