|
|
@@ -0,0 +1,124 @@ |
|
|
|
/* Quick voting software. |
|
|
|
* Usage: |
|
|
|
* vote <file1> <file2> ... |
|
|
|
* File format: |
|
|
|
* <key1> <value1> |
|
|
|
* <key1> <value1> |
|
|
|
*/ |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#include <string.h> |
|
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
#define MAXLEN 20 |
|
|
|
#define MAXITEMS 2000 |
|
|
|
|
|
|
|
static char *items[MAXITEMS]; |
|
|
|
static int nitems; |
|
|
|
|
|
|
|
static int *matrix; |
|
|
|
|
|
|
|
static int lookup(char const *str) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
for(i = 0; i < nitems; i++) |
|
|
|
if(!strcmp(str, items[i])) |
|
|
|
return i; |
|
|
|
|
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
static int record(char const *str) |
|
|
|
{ |
|
|
|
int n = lookup(str); |
|
|
|
|
|
|
|
if(n >= 0) |
|
|
|
return n; |
|
|
|
|
|
|
|
items[nitems] = strdup(str); |
|
|
|
return nitems++; |
|
|
|
} |
|
|
|
|
|
|
|
static void recordfile(char const *file) |
|
|
|
{ |
|
|
|
char buf[MAXLEN]; |
|
|
|
FILE *f; |
|
|
|
float val; |
|
|
|
|
|
|
|
f = fopen(file, "r"); |
|
|
|
if(!f) |
|
|
|
return; |
|
|
|
while(!feof(f)) |
|
|
|
{ |
|
|
|
fscanf(f, "%s %g", buf, &val); |
|
|
|
record(buf); |
|
|
|
} |
|
|
|
fclose(f); |
|
|
|
} |
|
|
|
|
|
|
|
static void readfile(char const *file) |
|
|
|
{ |
|
|
|
float values[MAXITEMS]; |
|
|
|
char buf[MAXLEN]; |
|
|
|
FILE *f; |
|
|
|
float val; |
|
|
|
int n, i, j; |
|
|
|
|
|
|
|
f = fopen(file, "r"); |
|
|
|
if(!f) |
|
|
|
return; |
|
|
|
while(!feof(f)) |
|
|
|
{ |
|
|
|
fscanf(f, "%s %g", buf, &val); |
|
|
|
n = lookup(buf); |
|
|
|
values[n] = val; |
|
|
|
} |
|
|
|
fclose(f); |
|
|
|
|
|
|
|
for(j = 0; j < nitems; j++) |
|
|
|
for(i = j + 1; i < nitems; i++) |
|
|
|
if(values[i] < values[j]) |
|
|
|
matrix[j * nitems + i]++; |
|
|
|
else if(values[i] > values[j]) |
|
|
|
matrix[i * nitems + j]++; |
|
|
|
} |
|
|
|
|
|
|
|
static void solvematrix(void) |
|
|
|
{ |
|
|
|
int wins[MAXITEMS]; |
|
|
|
int i, j; |
|
|
|
|
|
|
|
memset(wins, 0, MAXITEMS * sizeof(int)); |
|
|
|
|
|
|
|
for(j = 0; j < nitems; j++) |
|
|
|
for(i = j + 1; i < nitems; i++) |
|
|
|
{ |
|
|
|
if(matrix[j * nitems + i] > matrix[i * nitems + j]) |
|
|
|
wins[i]++; |
|
|
|
else |
|
|
|
wins[j]++; |
|
|
|
} |
|
|
|
|
|
|
|
for(i = 0; i < nitems; i++) |
|
|
|
printf("%s (%i): %i wins\n", items[i], i, wins[i]); |
|
|
|
} |
|
|
|
|
|
|
|
int main(int argc, char *argv[]) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
for(i = 1; i < argc; i++) |
|
|
|
recordfile(argv[i]); |
|
|
|
|
|
|
|
matrix = malloc(nitems * nitems * sizeof(int)); |
|
|
|
memset(matrix, 0, nitems * nitems * sizeof(int)); |
|
|
|
|
|
|
|
for(i = 1; i < argc; i++) |
|
|
|
readfile(argv[i]); |
|
|
|
|
|
|
|
solvematrix(); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|