#include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) string ext(string a, int size) { while (a.size() < size) a += ' '; return a; } struct rec { string name; int played; int win, lost, tie; int g1, g2; int score; int index; bool operator<(const rec & r) const { if (score > r.score) return true; if (score < r.score) return false; if (g1 - g2 > r.g1 - r.g2) return true; if (g1 - g2 < r.g1 - r.g2) return false; if (g1 > r.g1) return true; if (g1 < r.g1) return false; if (win > r.win) return true; if (win < r.win) return false; return index > r.index; } }; void print_lines(const string & str1, const string & str2, int N) { printf("%s", str1.c_str()); FOR(i, 0, N) printf("%s", str2.c_str()); printf("\n"); } int digits(int n) { int res = 0; if (!n) return 1; while(n) { ++res; n /= 10; } return res; } void print(int n, int spaces) { int d = digits(n); FOR(i, 0, spaces - d) printf(" "); printf("%d", n); } char temp[147], temp2[147]; int main() { while (1) { int N, M; scanf("%d ", &N); if (!N) break; vector teams(N); map indexes; FOR(i, 0, N) { scanf("%s ", temp); teams[i].name = temp; indexes[teams[i].name] = i; teams[i].win = teams[i].lost = teams[i].tie = teams[i].g1 = teams[i].g2 = teams[i].score = teams[i].played = 0; teams[i].index = i; } vector > > table(N, vector > (N, make_pair(-1, -1))); scanf("%d ", &M); FOR(i, 0, M) { int g1, g2; scanf("%s - %s %d:%d ", temp, temp2, &g1, &g2); int index1 = indexes[temp], index2 = indexes[temp2]; teams[index1].g1 += g1; teams[index1].g2 += g2; teams[index2].g1 += g2; teams[index2].g2 += g1; ++teams[index1].played; ++teams[index2].played; table[index1][index2] = make_pair(g1, g2); if (g1 > g2) { ++teams[index1].win; ++teams[index2].lost; } else if (g1 < g2) { ++teams[index1].lost; ++teams[index2].win; } else { ++teams[index1].tie; ++teams[index2].tie; } } printf("RESULTS:\n"); int col1 = 0; FOR(i, 0, N) col1 = max(col1, (int)teams[i].name.size()); string col1_str = string("+") + string(col1, '-') + string("+"); string col2_str = "---+"; print_lines(col1_str, col2_str, N); printf("|%s", string(col1, ' ').c_str()); FOR(i, 0, N) { string three; FOR(j, 0, teams[i].name.size()) { if (j == 3) break; three += teams[i].name[j]; } three = ext(three, 3); printf("|%s", three.c_str()); } printf("|\n"); FOR(i, 0, N) { print_lines(col1_str, col2_str, N); printf("|%s", ext(teams[i].name, col1).c_str()); FOR(j, 0, N) { if (i == j) printf("| X "); else if (table[i][j].first == -1) printf("| "); else printf("|%d:%d", table[i][j].first, table[i][j].second); } printf("|\n"); } print_lines(col1_str, col2_str, N); printf("\nSTANDINGS:\n----------\n"); FOR(i, 0, N) teams[i].score = teams[i].tie + teams[i].win * 3; sort(teams.begin(), teams.end()); int p = 0, w = 0, t = 0, l = 0, g1 = 0, g2 = 0, s = 0; FOR(i, 0, N) { p = max(p, digits(teams[i].played)); w = max(w, digits(teams[i].win)); l = max(l, digits(teams[i].lost)); t = max(t, digits(teams[i].tie)); g1 = max(g1, digits(teams[i].g1)); g2 = max(g2, digits(teams[i].g2)); s = max(s, digits(teams[i].score)); } FOR(i, 0, N) { printf("%d. %s ", i+1, ext(teams[i].name, col1).c_str()); print(teams[i].played, p); printf(" "); print(teams[i].win, w); printf(" "); print(teams[i].tie, t); printf(" "); print(teams[i].lost, l); printf(" "); print(teams[i].g1, g1); printf(":"); print(teams[i].g2, g2); printf(" "); print(teams[i].score, s); printf("\n"); } printf("\n"); } return 0; }