/* This program is by Graham Toal.
The purpose of this program is, given a set of tiles (a rack
leave) and the contents of the bag (unseen tiles), plus a
particular word, calculate the probability of drawing the
tiles which will allow you to make the word. This will of
course be a vanishingly small number, but in the context
that it is used, many of these small numbers will be summed
to generate a more reasonable number.
This program will calculate the rack leave values for a
single letter at the very start of play, using the entire
TWL word list as the 'next possible play'.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "../spell/dawg.h"
static double totprob[256];
static int tot[256];
static int itot[27] =
/* a b c d e f g h i j k l m n o p q r s t u v w x y z */
{ 9,2,2,4,12,2,3,2,9,1,1,4,2,6,8,2, 1,6,4,6,4,2,2,1,2, 1};
static int score[256];
static int iscore[27] =
{ 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 };
static double target[256];
static double itarget[27] =
{ 1.0, -2.0, -0.5, 0.5, 2.0, -2.0, -3.0, 1.5, -1.0, -2.0,
0.0, 0.5, 0.5, 0.5, -0.5, -1.0, -9.0, 1.0, 8.0, 0.0,
-4.0, -6.0, -3.0, 2.5, -0.5, 5.0
};
#include "global_analysis/probfn.c"
#define FullRack "aaaaaaaaabbccddddeeeeeeeeeeeeffggghhiiiiiiiiijkllllmmnnnnnnooooooooppqrrrrrrssssttttttuuuuvvwwxyyz??"
#define FullRackMinusA "aaaaaaaabbccddddeeeeeeeeeeeeffggghhiiiiiiiiijkllllmmnnnnnnooooooooppqrrrrrrssssttttttuuuuvvwwxyyz??"
#define HalfRack "aaaaabcddeeeeeefghiiiiikllmnnnooooprrrsstttuuvwxy?"
int do_one(char *word, void *state)
{
char saved[8];
int i;
double *totprob = (double *)state;
if (strlen(word) != 7) return(TRUE);
strcpy(saved, word);
for (i = 0; i < 7; i++) {
strcpy(word, saved);
memmove(word+i, word+i+1, 6-i+1);
totprob[saved[i]] += RackProb(/*modified*/word, FullRack, 6);
#ifdef COPIOUS_CRAP
fprintf(stderr, "drawprob(%d, %s) + %c => %s = %1.6f\n", strlen(word), word, saved[i], saved, totprob[saved[i]]);
#endif
}
return(TRUE);
}
int main(int argc, char **argv)
{
NODE *dawg;
int nedges;
char *s;
char word[128];
char saved[128];
double p;
int i;
FILE *wordlist;
for (i = 0; i < 256; i++) {
tot[i] = 2;
score[i] = 0;
totprob[i] = 0.0;
target[i] = 0.0;
}
for (i = 0; i < 26; i++) {
tot['a'+i] = itot[i];
score['a'+i] = iscore[i];
target['a'+i] = itarget[i];
}
if (!dawg_init("SOWPODS", &dawg, &nedges)) {
fprintf(stderr, "No!\n");
exit(1);
}
dawg_forall(dawg, 0L, do_one, totprob);
fprintf(stdout, "? Prob Adjusted Watkins Watkins-Score\n");
for (i = 'a'; i <= 'z'; i++) {
double f, g, h;
#define SIGN(s) (s < 0.0 ? " " : " ")
f=totprob[i];
g=f-0.0975;
h=g*fabs(g);
fprintf(stdout, "%c=%3.6f, %s%3.1f, %s%3.1f, %s%3.1f\n",
toupper(i),
totprob[i],
SIGN(g), floor(g*80.0)/2.0,
SIGN(target[i]), target[i],
SIGN(target[i]-score[i]), target[i]-score[i]
);
}
fflush(stdout); fflush(stderr);
return(0);
exit(0);
}