#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; string getTemplateLine(int row, int digit) { switch (digit) { case 0: switch (row) { case 0: return "+---+"; case 1: return "| |"; case 2: return "| |"; case 3: return "+ +"; case 4: return "| |"; case 5: return "| |"; case 6: return "+---+"; } break; case 1: switch (row) { case 0: return " +"; case 1: return " |"; case 2: return " |"; case 3: return " +"; case 4: return " |"; case 5: return " |"; case 6: return " +"; } break; case 2: switch (row) { case 0: return "+---+"; case 1: return " |"; case 2: return " |"; case 3: return "+---+"; case 4: return "| "; case 5: return "| "; case 6: return "+---+"; } break; case 3: switch (row) { case 0: return "+---+"; case 1: return " |"; case 2: return " |"; case 3: return "+---+"; case 4: return " |"; case 5: return " |"; case 6: return "+---+"; } break; case 4: switch (row) { case 0: return "+ +"; case 1: return "| |"; case 2: return "| |"; case 3: return "+---+"; case 4: return " |"; case 5: return " |"; case 6: return " +"; } break; case 5: switch (row) { case 0: return "+---+"; case 1: return "| "; case 2: return "| "; case 3: return "+---+"; case 4: return " |"; case 5: return " |"; case 6: return "+---+"; } break; case 6: switch (row) { case 0: return "+---+"; case 1: return "| "; case 2: return "| "; case 3: return "+---+"; case 4: return "| |"; case 5: return "| |"; case 6: return "+---+"; } break; case 7: switch (row) { case 0: return "+---+"; case 1: return " |"; case 2: return " |"; case 3: return " +"; case 4: return " |"; case 5: return " |"; case 6: return " +"; } break; case 8: switch (row) { case 0: return "+---+"; case 1: return "| |"; case 2: return "| |"; case 3: return "+---+"; case 4: return "| |"; case 5: return "| |"; case 6: return "+---+"; } break; case 9: switch (row) { case 0: return "+---+"; case 1: return "| |"; case 2: return "| |"; case 3: return "+---+"; case 4: return " |"; case 5: return " |"; case 6: return "+---+"; } break; } return ""; } bool isCompatible(string templ, string actual) { // cout << templ << " vs. " << actual; for (int i=0; i<5; i++) { if (templ[i] != actual[i] && actual[i] != '.') { // cout << " not comp" << endl; return false; } } //cout << " is comp" << endl; return true; } int main(void){ string s; while (true) { bool possible[4][10] = { {1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, }; for (int i=0; i<7; i++) { getline(cin, s); if (i == 0 && s == "end") { cout << "end" << endl; return 0; } //cout << "row " << i << endl; string digit[4]; digit[0] = s.substr(0, 5); digit[1] = s.substr(7, 5); digit[2] = s.substr(17, 5); digit[3] = s.substr(24, 5); //cout << digit[0] << " " << digit[1] << " " << digit[2] << " " << digit[3] << endl; // zpracovat i-ty radek cifer d[0] az d[3] for (int d=0; d<4; d++) { for (int j=0; j<=9; j++) { /* if (i == 1 && d == 1) { cout << getTemplateLine(i, j) << " vs. " << digit[d] << endl; } */ if (possible[d][j] && !isCompatible(getTemplateLine(i, j), digit[d])) { possible[d][j] = false; } } } /* cout << "row " << i << endl; for (int d=0; d<4; d++) { for (int j=0; j<=9; j++) { if (possible[d][j]) { cout << j << " "; } } cout << endl; } */ } // ohlidat hodnotu 1. a 2. cifry z hodin, tzn. d[0] if (possible[0][2] && !possible[0][1] && !possible[0][0]) { for (int kk=4; kk<=9; kk++) { possible[1][kk] = false; } } // pokud na d[1] nemame ani jedno z 0,1,2,3, pak d[0] nemuze byt 2 if (!possible[1][0] && !possible[1][1] && !possible[1][2] && !possible[1][3]) { possible[0][2] = false; } bool ambiguous = false; for (int kk=0; kk<4; kk++) { int trueCount = 0; for (int dd=0; dd<=9; dd++) { trueCount += possible[kk][dd]; } if (trueCount != 1) { ambiguous = true; break; } } if (ambiguous) { cout << "ambiguous" << endl; } else { for (int kk=0; kk < 4; kk++) { for (int dd=0; dd<=9; dd++) { if (possible[kk][dd]) { cout << dd; } } if (kk == 1) { cout << ":"; } } cout << endl; } getline(cin, s); getline(cin, s); } return 0; }