#include #include #include #include #include #include #define ALGORITHM MUNOU2 /* Max hand minimum */ enum { RES_0B=0, RES_1B=1, RES_2B=2, RES_3B=3, RES_4B=4, RES_1H=5, RES_1H1B=6, RES_1H2B=7, RES_1H3B=8, RES_2H=10, RES_2H1B=11, RES_2H2B=12, RES_3H=15, RES_4H=20 }; #define RESMAX (20) #define MSGMAX (42) static char msg[MSGMAX][255]={ "思考1号は考える・・・\n", " えっと、あと %d 通り。\n", " まぁ次は定石から言って %04d だな。\n", " 終わったね。\n", " %04d だな。\n", " よし。\n", " 残りは %04d %04d だけ。\n", " ま、%04d とか言っておくか。\n", " よぅし。\n", " 残りは %04d %04d %04d だけ。\n", " %04d が無難かな。\n", " うむ。\n", " 残りは %04d %04d %04d %04d かぁ。\n", " %04d かなぁ?\n", " よしよし\n", " 次はまあ %04d だな。\n", " ちょっと待てよ・・・\n", " 次は %04d あたりかな。\n", " うむぅ・・・\n", " まぁ次は %04d かなぁ。\n", " まぁ次は %04d ってとこか。\n", "そっちからどうぞ\n", "そっちは?\n", "4桁の重複なしの数を言ってね\n", "それじゃあこっちは、 %04d\n", "1H1B, 2H, 2B のように言ってね \n", "ノーヒットノーブローは X で。\n", "引き分けだね\n", "こっちの負けだね\n", "どうも。こっちの答は %04d だよ\n", " だね?\n", "\n", "ちょっと待って、それって変じゃない?\n", "こうだよね?\n", "本当にこれって合ってる?(Y/N)", "そっか、それじゃあ降参。答を教えてよ。", "じらさないで、早く教えてよ。", "ここ間違ってるじゃん!\n", "こうなるはずでしょ?\n", "\n", "残念だけどそっちの敗けだよ。\n", "じゃあ残念だけどこっちの勝ちだね。\n" }; int waitkey(void) { char buffer[BUFSIZ]; printf("\n--(Hit return key)--\n"); fgets(buffer,BUFSIZ-1,stdin); return 0; } int readmsg(char *filename) { FILE *fp; char buffer[256]; int i=0; int len; fp=fopen(filename,"rt"); if(fp==NULL) { printf("Cannot open message file \"%s\"\n",filename); waitkey(); exit(-1); } while(!feof(fp)) { if(fgets(buffer,255,fp)!=NULL) { len=strlen(buffer)+1; strncpy(msg[i],buffer,len); i++; } if(i>=MSGMAX) break; } fclose(fp); return i; } void split(int *a,int ans) { a[3]=ans%10; ans-=a[3]; ans/=10; a[2]=ans%10; ans-=a[2]; ans/=10; a[1]=ans%10; ans-=a[1]; ans/=10; a[0]=ans; return; } int merge(int a[]) { return a[0]*1000+a[1]*100+a[2]*10+a[3]; } int HB( int ans,int key) { int a[4],b[4]; int i,j,v; v=0; split(a,ans); split(b,key); for(i=0;i<4;i++) for(j=0;j<4;j++) { if(a[i]==b[j]) if(i==j) v+=5; /* 1H=5 */ else v++; } return v; } int ans_check(int ans) { int a[4],i,j; split(a,ans); for(i=0;i<4;i++) { if(a[i]<0 || a[i]>=10) return 0; for(j=i+1;j<4;j++) { if(a[i]==a[j]) return 0; } } return 1; } int calc_next_0(int ans, int hb) { int a[10]; int i,j; /* Best second hand calculated by MEM */ split(a,ans); j=4; for(i=0;i<10;i++) { if(i!=a[0] && i!=a[1] && i!=a[2] && i!=a[3]) { a[j]=i; j++; } } /* default answer */ switch(hb) { case RES_0B: return a[4]*1000+a[5]*100+a[6]*10+a[7]; case RES_1B: return a[1]*1000+a[4]*100+a[5]*10+a[6]; case RES_2B: case RES_3B: return a[1]*1000+a[4]*100+a[3]*10+a[5]; case RES_4B: return a[1]*1000+a[0]*100+a[3]*10+a[4]; case RES_1H: return a[0]*1000+a[4]*100+a[5]*10+a[6]; case RES_1H1B: return a[0]*1000+a[1]*100+a[4]*10+a[5]; case RES_1H2B: return a[0]*1000+a[2]*100+a[4]*10+a[5]; case RES_1H3B: return a[0]*1000+a[1]*100+a[3]*10+a[4]; case RES_2H: case RES_2H1B: case RES_3H: return a[0]*1000+a[2]*100+a[4]*10+a[5]; case RES_2H2B: return a[0]*1000+a[2]*100+a[1]*10+a[4]; default: printf("Error!!!\n"); waitkey(); exit(-1); } } int calc_next( int candno, int cand[] /* cand[5040] and first candno is candidates */ ) { int i; int j; int hist[21]; double ent[5040]; int hit[5040]; int ishit; double entmax; int next=0; if(candno<=2) return cand[0]; entmax=-log(5040.0); if(candno==3) { for(i=0;i0) ent[i]+=-(double)hist[j]/(double)candno* log((double)hist[j]); } if(ent[i]>entmax) { next=cand[i]; entmax=ent[i]; } } return next; } for(i=0;i<5040;i++) { for(j=0;j<=RESMAX;j++) hist[j]=0; for(j=0;j0) ent[i]+=-(double)hist[j]/(double)candno*log((double)hist[j]); } if(hist[RES_4H]>0) hit[i]=1; else hit[i]=0; if(ent[i]>entmax ||(ent[i]==entmax && hit[i]>ishit)) { next=cand[i]; entmax=ent[i]; ishit=hit[i]; } } return next; } int calc_candidate(int candno, int cand[], int ansno, int ans[],int hb[]) { int i; int j; int temp,p; p=candno-1; for(i=0;i<=p;i++) { for(j=0;j0) printf("%1dH",hb/5); if(hb%5>0) printf("%1dB",hb%5); if(hb==0) printf("X "); else printf(" "); return ; } void print_hist(int i,int *ans,int *hb, int *ans2, int *hb2) { int j; for(j=0;j200) { printf(msg[16]); next=calc_next(candno,cand); printf(msg[17],next); } else if(candno>500) { printf(msg[18]); next=calc_next(candno,cand); printf(msg[19],next); } else { next=calc_next(candno,cand); printf(msg[20],next); } } return next; } char *getarg(char argv[],char key[]) { int l; l=strlen(key); if(strncmp(argv,key,l)==0) return argv+l; else return NULL; } int main(int argc,char **argv) { int j,k,i,tmp; int a[10]; int b[10]; int c[4]; char buffer[BUFSIZ]; int ans[100],key=-1,hb[100]; int ans2[100],hb2[100]; int nb,nh; int ia; char *pt; int sjis=0; int quiet=0; /* parse option */ for(ia=1; ia