#include #include #include typedef struct { int tn; int gp; int w; int t; int l; int gs; int gr; int p; } team; static int comp(const void *p1, const void *p2) { team t1 = *((team*) p1); team t2 = *((team*) p2); if (t1.p != t2.p) { if (t1.p > t2.p) return -1; else return 1; } else if (t1.gs - t1.gr != t2.gs - t2.gr) { if (t1.gs - t1.gr > t2.gs - t2.gr) return -1; else return 1; } else if (t1.gs != t2.gs) { if (t1.gs > t2.gs) return -1; else return 1; } else if (t1.w != t2.w) { if (t1.w > t2.w) return -1; else return 1; } else { if (t1.tn > t2.tn) return -1; else return 1; } return 0; } void prsp(int n) { /*char s[] = " ";*/ int i; for (i = 0; i < n; i++) printf(" "); } void prvsep(int maxle, int teams) { int i; char c[] = "---"; printf("+"); for (i = 0; i < maxle; i++) printf("-"); printf("+"); for (i = 0; i < teams; i++) printf("%s+", c); printf("\n"); } int nl(int num) { if (num > 999) return 4; else if (num > 99) return 3; else if (num > 9) return 2; return 1; } int cl[6]; void alignint(int n, int col) { int i; for (i = 0; i < cl[col] - nl(n); i++) printf(" "); printf("%d", n); } int main() { int m, n, i, j, k, s1, s2, t1i, t2i, found, maxle, win, los; char teams[80][100], t_short[80][4]; char t1[100], t2[100]; int tab[80][80][2]; team tms[80]; while (1) { scanf("%d", &n); if (!n) break; maxle = 0; for (i = 0; i < n; i++) { scanf("%s", teams[i]); t_short[i][1] = strlen(teams[i]) > 1 ? teams[i][1] : ' '; t_short[i][2] = strlen(teams[i]) > 2 ? teams[i][2] : ' '; t_short[i][0] = teams[i][0]; t_short[i][3] = 0; maxle = maxle < strlen(teams[i]) ? strlen(teams[i]) : maxle; tms[i].tn = i; tms[i].gp = 0; tms[i].w = 0; tms[i].t = 0; tms[i].l = 0; tms[i].gs = 0; tms[i].gr = 0; tms[i].p = 0; } scanf("%d", &m); for (i = 0; i < n; i++) for (j = 0; j < n; j++) { tab[i][j][0] = -1; tab[i][j][1] = -1; } for (k = 0; k < m; k++) { scanf("%s - %s %d:%d", t1, t2, &s1, &s2); found = 0; for (i = 0; i < n && !found; i++) if (strcmp(t1, teams[i]) == 0) { t1i = i; found = 1; } found = 0; for (i = 0; i < n && !found; i++) if (strcmp(t2, teams[i]) == 0) { t2i = i; found = 1; } tab[t1i][t2i][0] = s1; tab[t1i][t2i][1] = s2; if (s1 > s2) { win = t1i; los = t2i; } else if (s1 < s2) { win = t2i; los = t1i; } else { win = -1; } tms[t1i].gp++; tms[t2i].gp++; if (s1 != s2) { tms[win].w++; tms[los].l++; tms[win].p += 3; } else { tms[t1i].t++; tms[t2i].t++; tms[t1i].p++; tms[t2i].p++; } tms[t1i].gs += s1; tms[t1i].gr += s2; tms[t2i].gs += s2; tms[t2i].gr += s1; } qsort(tms, n, sizeof (team), comp); printf("RESULTS:\n"); prvsep(maxle, n); printf("|"); prsp(maxle); printf("|"); for (i = 0; i < n; i++) printf("%s|", t_short[i]); printf("\n"); prvsep(maxle, n); for (i = 0; i < n; i++) { for (j = -1; j < n; j++) { if (j == -1) { printf("|%s", teams[i]); prsp(maxle - strlen(teams[i])); printf("|"); } else { if (i == j) printf(" X "); else if (tab[i][j][0] > -1) printf("%d:%d", tab[i][j][0], tab[i][j][1]); else printf(" "); printf("|"); } } printf("\n"); prvsep(maxle, n); } printf("\nSTANDINGS:\n----------\n"); for (i = 0; i < 6; i++) cl[i] = 0; for (i = 0; i < n; i++) { cl[0] = cl[0] < nl(tms[i].gp) ? nl(tms[i].gp) : cl[0]; cl[1] = cl[1] < nl(tms[i].w) ? nl(tms[i].w) : cl[1]; cl[2] = cl[2] < nl(tms[i].t) ? nl(tms[i].t) : cl[2]; cl[3] = cl[3] < nl(tms[i].l) ? nl(tms[i].l) : cl[3]; cl[4] = cl[4] < nl(tms[i].gs) + nl(tms[i].gr) + 1 ? nl(tms[i].gs) + nl(tms[i].gr) + 1 : cl[4]; cl[5] = cl[5] < nl(tms[i].p) ? nl(tms[i].p) : cl[5]; } for (i = 0; i < n; i++) { if (n > 9 && i + 1 < 10) { printf(" %d. %s", i + 1, teams[tms[i].tn]); } else { printf("%d. %s", i + 1, teams[tms[i].tn]); } prsp(maxle - strlen(teams[tms[i].tn]) + 1); alignint(tms[i].gp, 0); printf(" "); alignint(tms[i].w, 1); printf(" "); alignint(tms[i].t, 2); printf(" "); alignint(tms[i].l, 3); printf(" "); for (j = 0; j < cl[4] - (nl(tms[i].gs) + nl(tms[i].gr) + 1); j++) printf(" "); printf("%d:%d", tms[i].gs, tms[i].gr); printf(" "); alignint(tms[i].p, 5); printf("\n"); } printf("\n"); } return 0; }