// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 150 C++ "What a long problem!" */ // Send to judge@uva.es #include #include #include #ifdef ONLINE_JUDGE #define ins cin #define outs cout #else #define ins fin #define outs fout ifstream fin("myprog.in"); ofstream fout("myprog.out"); #endif int rmonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int lmonths[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; char namedays[7][10] = {"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"}; char namemonths[12][10] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; bool julianleap(int i); int juliandays(int year, int month, int day); void tojulian(int days, int &year, int &month, int &day); bool gregorianleap(int i); int gregoriandays(int year, int month, int day); void togregorian(int days, int &year, int &month, int &day); void input(); int main() { char peeker; while(ins >> peeker) { if(peeker == '#') break; ins.putback(peeker); input(); } return 0; } bool julianleap(int i) { return (i % 4 == 0); } int juliandays(int year, int month, int day) { int i, days = 10; for(i = 1583; i < year; i++) { if(julianleap(i)) { days += 366; } else { days += 365; } } if(julianleap(year)) { for(i = 0; i < month; i++) days += lmonths[i]; } else { for(i = 0; i < month; i++) days += rmonths[i]; } return days + day; } void tojulian(int days, int &year, int &month, int &day) { days -= 10; for(year = 1583; ; year++) { if(julianleap(year)) { days -= 366; } else { days -= 365; } if(days <= 0) { if(julianleap(year)) { days += 366; } else { days += 365; } break; } } if(julianleap(year)) { for(month = 0; days - lmonths[month] > 0 && month < 12; month++) { days -= lmonths[month]; } } else { for(month = 0; days - rmonths[month] > 0 && month < 12; month++) { days -= rmonths[month]; } } day = days; } bool gregorianleap(int i) { if(i % 400 == 0) return true; if(i % 100 == 0) return false; return (i % 4 == 0); } int gregoriandays(int year, int month, int day) { int i, days = 0; for(i = 1583; i < year; i++) { if(gregorianleap(i)) { days += 366; } else { days += 365; } } if(gregorianleap(year)) { for(i = 0; i < month; i++) days += lmonths[i]; } else { for(i = 0; i < month; i++) days += rmonths[i]; } return days + day; } void togregorian(int days, int &year, int &month, int &day) { for(year = 1583; ; year++) { if(gregorianleap(year)) { days -= 366; } else { days -= 365; } if(days <= 0) { if(gregorianleap(year)) { days += 366; } else { days += 365; } break; } } if(gregorianleap(year)) { for(month = 0; days - lmonths[month] > 0 && month < 12; month++) { days -= lmonths[month]; } } else { for(month = 0; days - rmonths[month] > 0 && month < 12; month++) { days -= rmonths[month]; } } day = days; } void input() { char dayofweek[10]; char monthname[10]; int weekday, day, month, year; int julia, greg; ins >> dayofweek >> day >> monthname >> year; for(weekday = 0; weekday < 7; weekday++) if(strcmp(dayofweek, namedays[weekday]) == 0) break; for(month = 0; month < 12; month++) if(strcmp(monthname, namemonths[month]) == 0) break; julia = juliandays(year, month, day); greg = gregoriandays(year, month, day); if(greg % 7 == weekday) { tojulian(greg, year, month, day); cout << dayofweek << " " << day << "* " << namemonths[month] << " " << year << endl; } else { togregorian(julia, year, month, day); cout << dayofweek << " " << day << " " << namemonths[month] << " " << year << endl; } } // @END_OF_SOURCE_CODE