#include char def[13000]; bool mozechodit[369]; int mesiace[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31 }; int toi(int den, int mesiac) { int ret=0; ret+=den-1; for (int i=0;i1600) pr++; ret = (5+dr+pr)%7; return ret; } int velkanocvr[4000]; int velkanoc(int y) { int golden, solar, lunar, p; golden = (y % 19) + 1; solar = (y - 1600) / 100 - (y - 1600) / 400; lunar = (((y - 1400) / 100) * 8) / 25; p = (3003 - (11 * golden) + solar - lunar) % 30; if (p==29 || (p == 28 && golden > 11)) p--; return p; } int velkanocindex(int rok) { int den = 0; int mesiac = 0; if (velkanocvr[rok]<=10) { den=velkanocvr[rok]+21; mesiac=3; } else { den=velkanocvr[rok]-10; mesiac=4; } return toi(den, mesiac); } bool issviatok(int index, int den, int mesiac, int rok, int dvt) { if (dvt==6) return true; int indexorig=index; // int mesiac=0; // int den=0; // while (index>=mesiace[mesiac+1]) { // mesiac+=1; // index-=mesiace[mesiac+1]; // } // den = index+1; // mesiac++; if (den==1 && mesiac==1) return true; if (den==1 && mesiac==5) return true; if (den==8 && mesiac==5) return true; if (den==5 && mesiac==7) return true; if (den==6 && mesiac==7) return true; if (den==28 && mesiac==9) return true; if (den==28 && mesiac==10) return true; if (den==17 && mesiac==11) return true; if (den==24 && mesiac==12) return true; if (den==25 && mesiac==12) return true; if (den==26 && mesiac==12) return true; int predch = velkanocindex(rok); if (indexorig-predch>1 && indexorig-predch<=8 && dvt==0) return true; return false; } bool ispriestupny(int rok) { return (rok%4==0 && rok%100!=0) || (rok%400==0); } int main() { for (int i=1600;i<=3001;i++) velkanocvr[i]=velkanoc(i); // printf("%d %d\n",toi(4,4), issviatok(toi(2,1),2010,0)); // return 0; while (fgets(def, 13000, stdin)!=NULL) { if (def[0]=='\n') return 0; if (def[0]=='\0') return 0; bool nedele=false; bool pracovne=false; bool po_nedeli=false; bool dni[7]; for (int i=0;i<7;i++) dni[i]=false; int pos; for (int i=0;def[i]!=' ';i++) { if (def[i]=='a') po_nedeli=true; if (def[i]=='w') pracovne=true; if (def[i]=='t') nedele=true; if (def[i]>='1' && def[i]<='7') dni[(def[i]-'1')]=true; pos = i; } for (int i=0;i<366;i++) mozechodit[i]=false; for (int i=pos+2;;i++) { int den = 0; int mesiac = 0; int denr = 0; int mesiacr = 0; for (;def[i]!='.';i++) { den*=10; den+=def[i]-'0'; // printf("den: %d\n",den); } for (i++;def[i]!='.';i++) { mesiac*=10; mesiac+=def[i]-'0'; // printf("mesiac: %d\n",mesiac); } i++; if (def[i]=='-') { for (i++;def[i]!='.';i++) { denr*=10; denr+=def[i]-'0'; // printf("denr: %d\n",denr); } for (i++;def[i]!='.';i++) { mesiacr*=10; mesiacr+=def[i]-'0'; // printf("mesiacr: %d\n",mesiacr); } i++; } if (denr==0) { mozechodit[toi(den,mesiac)]=true; } else { int start=toi(den,mesiac); int kon=toi(denr,mesiacr); for (int k=start;k<=kon;k++) mozechodit[k]=true; } pos=i; if (def[pos]==' ') break; } int rok=0; for (int i=pos+1;def[i]>='0' && def[i]<='9';i++) { rok*=10; rok+=def[i]-'0'; } // mozechodit = ohranicenie datumami bool chodi[367]; for (int i=0;i<367;i++) chodi[i]=false; bool jesviatok; bool bolsviatok=false; int dvt = den11(rok); int aden = 1; int amesiac =1; for (int i=0;i<366;i++) { // printf("%d %d\n",i,dvt); if (!ispriestupny(rok) && i==toi(29,2)) continue; // nedele, pracovne, po_nedeli, dni[7] jesviatok=issviatok(i, aden, amesiac, rok, dvt); //printf("%d %d\n",i,jesviatok); // printf("%d %d %d %d %d %d %d %d %d %d\n", nedele, pracovne, po_nedeli, dni[0], dni[1], dni[2], dni[3], dni[4], dni[5], dni[6]); if (jesviatok && nedele) chodi[i]=true; if (bolsviatok && po_nedeli && dvt<5 && !jesviatok) chodi[i]=true; if (!jesviatok && pracovne && dvt<5) chodi[i]=true; if (dni[dvt]) chodi[i]=true; dvt= (dvt+1)%7; aden++; if (aden>mesiace[amesiac] || (!ispriestupny(rok) && amesiac==2 && aden>28)) { aden=1; amesiac+=1; } bolsviatok=jesviatok; } // for (int i=0;i<366;i++) // printf("Moze %d Chodi %d\n",mozechodit[i],chodi[i]); int ret=0; for (int i=0;i<366;i++) { if (chodi[i]&&mozechodit[i]) { ret++; } } printf("%d\n",ret); } return 0; }