chiark
/
gitweb
/
~mdw
/
mm
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
409fd53
)
mm: Add a `quiet' flag to suppress normal thinking noise.
author
Mark Wooding
<mdw@distorted.org.uk>
Sun, 12 Mar 2006 17:02:30 +0000
(17:02 +0000)
committer
Mark Wooding
<mdw@distorted.org.uk>
Sun, 12 Mar 2006 17:02:30 +0000
(17:02 +0000)
mm.c
patch
|
blob
|
blame
|
history
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 */
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 */
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); \
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)
} while (0)
-static cpc *cpc_new(const mm *m)
+static cpc *cpc_new(const mm *m
, unsigned f
)
{
cpc *c = CREATE(cpc);
{
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->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);
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);
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) {
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) {
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);
}
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);
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;
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);
});
}
filter_guesses(c, g, b, w);
});
}
@@
-455,7
+471,7
@@
typedef struct spc {
static spc *spc_new(const mm *m)
{
spc *s = CREATE(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);
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: {
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
if (rr)
n = play(&m, ratefn, rr, cp_guess, cp_update, cc);
else