|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/types.h>
3: #include <sys/stat.h>
4: #define DICT "/usr/dict/words"
5: #define EDICT "/usr1/dict/web2"
6: #define MAXERR 7
7: #define MINSCORE 0
8: #define MINLEN 7
9: char *dictfile;
10: int alive,lost;
11: double frand();
12: FILE *dict;
13: long int dictlen;
14: float errors=0, words=0;
15: main(argc,argv) char **argv;
16: {
17: if(argc==1) dictfile=DICT;
18: else if(*argv[1]=='-') dictfile=EDICT;
19: else dictfile=argv[1];
20: setup();
21: for(;;)
22: { startnew();
23: while(alive>0)
24: { stateout();
25: getguess();
26: }
27: words=words+1;
28: if(lost) wordout();
29: else youwon();
30: }
31: }
32: setup()
33: {
34: struct stat statb;
35: long t;
36: t = time(NULL);
37: srand(t+(t>>16));
38: if((dict=fopen(dictfile,"r"))==NULL) fatal("no dictionary");
39: if(stat(dictfile,&statb)<0) fatal("can't stat");
40: dictlen=statb.st_size;
41: }
42: char word[26],alph[26],realword[26];
43: startnew()
44: { int i;
45: long int pos;
46: char buf[128];
47: for(i=0;i<26;i++) word[i]=alph[i]=realword[i]=0;
48: pos=frand()*dictlen;
49: fseek(dict,pos,0);
50: fscanf(dict,"%s\n",buf);
51: getword();
52: alive=MAXERR;
53: lost=0;
54: }
55: stateout()
56: { int i;
57: printf("guesses: ");
58: for(i=0;i<26;i++)
59: if(alph[i]!=0) putchar(alph[i]);
60: printf(" word: %s ",word);
61: printf("errors: %d/%d\n",MAXERR-alive,MAXERR);
62: }
63: getguess()
64: { char gbuf[128],c;
65: int ok=0,i;
66: loop:
67: printf("guess: ");
68: if(gets(gbuf)==NULL)
69: { printf("The word was %s\n", realword);
70: exit(0);
71: }
72: if((c=gbuf[0])<'a' || c>'z')
73: { printf("lower case\n");
74: goto loop;
75: }
76: if(alph[c-'a']!=0)
77: { printf("you guessed that\n");
78: goto loop;
79: }
80: else alph[c-'a']=c;
81: for(i=0;realword[i]!=0;i++)
82: if(realword[i]==c)
83: { word[i]=c;
84: ok=1;
85: }
86: if(ok==0)
87: { alive--;
88: errors=errors+1;
89: if(alive<=0) lost=1;
90: return;
91: }
92: for(i=0;word[i]!=0;i++)
93: if(word[i]=='.') return;
94: alive=0;
95: lost=0;
96: return;
97: }
98: wordout()
99: {
100: errors=errors+2;
101: printf("the answer was %s, you blew it\n",realword);
102: }
103: youwon()
104: {
105: printf("you win, the word is %s\n",realword);
106: }
107: fatal(s) char *s;
108: {
109: fprintf(stderr,"%s\n",s);
110: exit(1);
111: }
112: getword()
113: { char wbuf[128],c;
114: int i,j;
115: loop:
116: if(fscanf(dict,"%s\n",wbuf)==EOF)
117: { fseek(dict,0L,0);
118: goto loop;
119: }
120: if((c=wbuf[0])>'z' || c<'a') goto loop;
121: for(i=j=0;wbuf[j]!=0;i++,j++)
122: { if(wbuf[j]=='-') j++;
123: wbuf[i]=wbuf[j];
124: }
125: wbuf[i]=0;
126: if(i<MINLEN) goto loop;
127: for(j=0;j<i;j++)
128: if((c=wbuf[j])<'a' || c>'z') goto loop;
129: pscore();
130: strcpy(realword,wbuf);
131: for(j=0;j<i;word[j++]='.');
132: }
133: pscore()
134: {
135: if(words!=0) printf("(%4.2f/%.0f) ",errors/words,words);
136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.