/* Copyright (C) 2000 Dale Schuurmans, Finnegan Southey */ /* This work is licensed under the Gnu General Public License (see gpl.txt). */ #include #include int compareInt(const void *a, const void *b); int main(int argc, char **argv); int comparePair(const void *a, const void *b); typedef struct { int source; double score; } Pair; int main(int argc, char **argv) { int numRanks; Pair *firstPairs; Pair *secondPairs; FILE *in; int ch, src, entryCount; int **tallies; int x, y; int order; if (argc < 4) { fprintf(stderr, "Usage: <# of contestants> \n"); fprintf(stderr, "Order is 0 for ascending, 1 for descending.\n"); exit(1); } sscanf(argv[1], "%d", &numRanks); sscanf(argv[3], "%d", &order); firstPairs = malloc(numRanks * sizeof(Pair)); secondPairs = malloc(numRanks * sizeof(Pair)); tallies = malloc(numRanks * sizeof(int*)); for (x = 0; x < numRanks; x++) tallies[x] = calloc(numRanks, sizeof(int)); in = fopen(argv[2], "r"); /* Ditch comments. */ ch = fgetc(in); while (ch == '#') { while (fgetc(in) != '\n'); ch = fgetc(in); } entryCount = 0; while (!feof(in)) { for (src = 0; src < numRanks; src++) { fscanf(in, " %lf ", &(firstPairs[src].score)); firstPairs[src].source = src; } for (src = 0; src < numRanks; src++) { fscanf(in, " %lf ", &(secondPairs[src].score)); secondPairs[src].source = src; } qsort(firstPairs, numRanks, sizeof(Pair), &comparePair); qsort(secondPairs, numRanks, sizeof(Pair), &comparePair); for (x = numRanks - 1; x >= 0; x--) for (y = numRanks - 1; y >= 0; y--) if (firstPairs[x].source == secondPairs[y].source) tallies[x][y]++; entryCount++; } fclose(in); free(firstPairs); free(secondPairs); fprintf(stdout, "Entries: %d\n", entryCount); for (x = 0; x < numRanks; x++) { if (order) for (y = numRanks - 1; y >= 0; y--) fprintf(stdout, "%1.2f\t", tallies[x][y] * 1.0 / entryCount); else for (y = 0; y < numRanks; y++) fprintf(stdout, "%1.2f\t", tallies[x][y] * 1.0 / entryCount); fprintf(stdout, "\n"); } #if 0 for (y = 0; y < numRanks; y++) /* for (y = numRanks - 1; y >= 0; y--) */ { for (x = 0; x < numRanks; x++) /* for (x = numRanks - 1; x >= 0; x--) */ fprintf(stdout, "%1.2f\t", tallies[x][y] * 1.0 / entryCount); fprintf(stdout, "\n"); } #endif free(tallies); return 0; } int comparePair(const void *a, const void *b) { if ( ((Pair*)a)->score == ((Pair*)b)->score) return 0; if ( ((Pair*)a)->score > ((Pair*)b)->score) return 1; return -1; } int compareInt(const void *a, const void *b) { if (*((int*)a) == (*(int*)b)) return 0; if (*((int*)a) > (*(int*)b)) return 1; return -1; }