|
|
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.