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 */
}
}
-#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));
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);
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);
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);
});
}
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);
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