1: #!/usr/local/bin/perl
2: #$Id: createtable.pl,v 1.3 2005/02/16 22:20:08 boris Exp $
3: #
4: #
5: #
6: # Исходные файлы и параметры
7: #
8:
9: use Getopt::Std;
10:
11: $usage =
12: "Usage: createtable.pl [-d] [-s] [-t answers_file] [-o results] \n";
13:
14: require 'parameters.pl';
15: require 'subroutines.pl';
16:
17: die $usage unless getopts('t:o:ds');
18:
19: $DEBUG=$opt_d;
20: $SHORT=$opt_s;
21:
22: my %teams;
23: my @answers;
24: my @ratings;
25: #
26: # Читаем старые результаты
27: #
28: if ($opt_t) {
29: die "Cannot open $opt_t\n" unless open(INFILE,$opt_t);
30: } else {
31: *INFILE=*STDIN;
32: }
33:
34: readhash(\@answers);
35: close(INFILE);
36:
37:
38: #
39: # Открываем файл для записи
40: #
41: if ($opt_o) {
42: die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o");
43: select OUTFILE;
44: }
45:
46: # Находим максимальный вопрос
47: $MAXQUEST=1;
48: for (my $i=1; $i<=$ROUNDS; $i++) {
49: if ($MAXQUEST<$MAXQUEST[$i]) {
50: $MAXQUEST=$MAXQUEST[$i];
51: }
52: }
53:
54:
55: #
56: # Таблица подводится отдельно по каждому раунду
57: #
58: for (my $r=1; $r<=$ROUNDS; $r++) {
59: if ($DEBUG) {
60: print STDERR "Раунд $r\n";
61: }
62: #
63: # Читаем ответы в данном раунде
64: #
65:
66: foreach my $file (split /\s+/, $FILES[$r]) {
67: open (INFILE, $file);
68: readmail(\%teams);
69: collect_answers(\%teams,\@answers);
70: close (INFILE);
71: }
72:
73: #
74: # Подсчитываем рейтинги вопросов
75: #
76: rate_questions(\%teams,\@answers,\@ratings,$r);
77: #
78: # Вычисляем число ответов и рейтинги команд
79: #
80: find_scores(\%teams,\@answers,\@ratings,$r,0.01);
81: #
82: # Ну а теперь печатаем саму таблицу...
83: #
84: #
85: # Печатаем заголовок
86: #
87: print "ЗАЧЁТ $NAME[$r]\n";
88: printf "%5s ", "N";
89: for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++)
90: {
91: if ($SHORT) {
92: printf("%1d",$i%10);
93: } else {
94: printf "%3d",$i;
95: }
96: }
97: printf "%6s","О";
98: printf "%4s","Р";
99: printf " КОМАНДА";
100: print "\n";
101: #
102: # Печатаем команды построчно
103: #
104: foreach $team (sort
105: {
106: $teams{$b}->{score} <=> $teams{$a}->{score}
107: or
108: $teams{$b}->{rating} <=> $teams{$a}->{rating}
109: } keys %teams
110: )
111: {
112: printf "%5d ",$teams{$team}->{regnum};
113: for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++)
114: {
115: my $answer = $teams{$team}->{answers}[$i];
116: my $score = $answers[$i]->{$answer}->{score};
117: $score = '-' unless $score;
118: if ($SHORT) {
119: printf "%1s",$score;
120: } else {
121: printf "%3s", $score;
122: }
123: }
124: printf "%6.2f",$teams{$team}->{score};
125: printf "%4s",$teams{$team}->{rating};
126: print " $team";
127: print "\n";
128: }
129: #
130: # Печатаем последнюю строку таблицы
131: # в ней рейтинги вопросов
132: #
133: if ($SHORT) {
134: print "Рейтинг\n";
135: for ($j=0;$j<$MAXQUEST[$r]/12;$j++) {
136: my $max=$j*12+12;
137: if ($max>$MAXQUEST[$r]) {
138: $max=$MAXQUEST[$r];
139: }
140: for ($i=$j*12+1;$i<=$max;$i++){
141: printf("%3s",$i);
142: }
143: printf "\n";
144: for ($i=1+$j*12;$i<=$max;$i++){
145: printf("%3s",$ratings[$i]);
146: }
147: printf "\n";
148: }
149: } else {
150: printf "%5s ", "Р";
151: for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++)
152: {
153: printf "%3s", $ratings[$i];
154: }
155: print "\n";
156: }
157: print "\n";
158: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>