#include #include #include #include #define asdigit(c) (c - '0') #define LOG(x) cout << #x << "=" << (x) << endl; using namespace std; string analyze_pid(string word); int main(int argc, char **argv) { string word; while (true) { getline(cin, word); if (word == "end") break; cout << analyze_pid(word) << endl; } return 0; } string analyze_pid(string word) { const char *cword = word.c_str(); // check chars if (word.length() < 10 || word.length() > 11 || cword[6] != '/') return "invalid"; bool since1954 = word.length() == 11; for (int i = 0; i < word.length(); i++) if (i != 6 && !isdigit(cword[i])) return "invalid"; // calc numbers int yy = asdigit(cword[0]) * 10 + asdigit(cword[1]); int mm = asdigit(cword[2]) * 10 + asdigit(cword[3]); int dd = asdigit(cword[4]) * 10 + asdigit(cword[5]); int suffix = asdigit(cword[7]) * 100 + asdigit(cword[8]) * 10 + asdigit(cword[9]); // LOG(yy); LOG(mm); LOG(dd); LOG(suffix); if (since1954) { suffix *= 10; suffix += asdigit(cword[10]); // check modulo 11 long long whole = yy * 100000000L + mm * 1000000L + dd * 10000L + suffix; // LOG(whole); if (whole % 11 != 0) return "invalid"; } // check month & get gender bool boy = mm >= 1 && mm <= 12; if (!boy && !(mm >= 51 && mm <= 62)) return "invalid"; int month = boy ? mm : (mm - 50); // LOG(month); // LOG(boy); // check year if (since1954) { if (! ((yy >= 0 && yy <= 9) || (yy >= 54 && yy <= 99)) ) return "invalid"; } else if (! (yy >= 10 && yy <= 53) ) return "invalid"; // check day int maxdd = 31; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxdd = 31; break; case 4: case 6: case 9: case 11: maxdd = 30; break; case 2: maxdd = (yy % 4 == 0) ? 29 : 28; break; } // LOG(maxdd); if (dd < 1 || dd > maxdd) return "invalid"; return boy ? "boy" : "girl"; }