/* * @(#) msu96_f.c - Problem 'F' ("A game") solution * of the ACM Programming Contest at the MSU in 1996. * (c) 1996 Ivan Maidanski http://ivmai.chat.ru * Freeware program source. All rights reserved. ** * Language: ANSI C * Tested with: Borland C++ v3.1 * Last modified: 1996-12-02 14:00:00 GMT+03:00 */ /* Input data file: f.dat */ #include #include #include char *lex[]= { "null","cheat","trade", "if","then","else", "=","#","and","or", "mylast1","yourlast1","mylast2","yourlast2", 0 }; char prog[10][256]; int readprog(void) { int i,n; char c; FILE *f=fopen("f.dat","rt"); for (n=0;n<10;n++) { for (i=0;i<255;i++) { do if ((c=getc(f))==EOF) c='#'; while (c<=' '); if (c=='.' || c=='#' && !i) break; prog[n][i]=isupper(c) ? tolower(c) : c; } if (c=='#' && !i) break; prog[n][i]='\0'; } fclose(f); return n; } int getlexem(char **s) { int k; if (!**s) return -1; for (k=0;lex[k];k++) if (!strncmp(*s,lex[k],strlen(lex[k]))) break; (*s)++; if (!lex[k]) return -1; (*s)+=strlen(lex[k])-1; return k; } int interpret(char *s, int ml1, int ml2, int yl1, int yl2) { int k,mem,cond; while (*s) { if ((k=getlexem(&s))<3) return k-1; cond=0; do { switch (getlexem(&s)) { case 10: mem=ml1; break; case 11: mem=yl1; break; case 12: mem=ml2; break; case 13: mem=yl2; break; default: return -2; } k=getlexem(&s); mem-=getlexem(&s)-1; if (!cond) cond=(k==6 && !mem || k!=6 && mem); k=getlexem(&s); if (cond<0) { if (k==6) cond++; } else { if (k==8) cond--; } } while (k!=4); if (cond<1) { cond=0; while (*s && cond>=0) if ((k=getlexem(&s))==3) cond++; else if (k==5) cond--; } } return -2; } void game(int i, int j) { int k; int my,your; int ml1=-1,yl1=-1,ml2=-1,yl2=-1; int mr=0,yr=0; for (k=0;k<10;k++) { my=interpret(prog[i],ml1,ml2,yl1,yl2); your=interpret(prog[j],yl1,yl2,ml1,ml2); if (my<0 || your<0) { printf("error\n"); break; } if (my) if (your) mr++,yr++; else mr-=2,yr+=2; else if (your) mr+=2,yr-=2; else mr--,yr--; ml2=ml1; yl2=yl1; ml1=my; yl1=your; } printf("%d:%d\n",mr,yr); } int main() { int i,j; int n=readprog(); for (i=0;i