version 1.2, 2002/02/04 16:23:23
|
version 1.3, 2005/02/16 22:20:08
|
Line 6
|
Line 6
|
# Исходные файлы и параметры |
# Исходные файлы и параметры |
# |
# |
|
|
use Getopt::Std; |
use Getopt::Std; |
|
|
$usage = 'createtable.pl $Revision$, $Date$'. "\n". |
$usage = |
"Usage: createtable.pl [-d] [-s] [-t answers_file] [-m mail_file] [-o results] \n"; |
"Usage: createtable.pl [-d] [-s] [-t answers_file] [-o results] \n"; |
|
|
require 'parameters.pl'; |
require 'parameters.pl'; |
require 'subroutines.pl'; |
require 'subroutines.pl'; |
|
|
die $usage unless getopts('t:m:o:ds'); |
die $usage unless getopts('t:o:ds'); |
|
|
$DEBUG=$opt_d; |
$DEBUG=$opt_d; |
$SHORT=$opt_s; |
$SHORT=$opt_s; |
Line 25 my @ratings;
|
Line 25 my @ratings;
|
# |
# |
# Читаем старые результаты |
# Читаем старые результаты |
# |
# |
if ($opt_t) |
if ($opt_t) { |
{ |
|
die "Cannot open $opt_t\n" unless open(INFILE,$opt_t); |
die "Cannot open $opt_t\n" unless open(INFILE,$opt_t); |
readhash(\@answers); |
} else { |
close(INFILE); |
*INFILE=*STDIN; |
} |
} |
|
|
|
readhash(\@answers); |
|
close(INFILE); |
|
|
|
|
# |
# |
# Читаем ответы команд |
# Открываем файл для записи |
# |
# |
if ($opt_m) |
if ($opt_o) { |
{ |
die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o"); |
die "Cannot open $opt_m\n" unless open(INFILE,$opt_m) |
select OUTFILE; |
} |
} |
else |
|
{ |
# Находим максимальный вопрос |
*INFILE=*STDIN; |
$MAXQUEST=1; |
|
for (my $i=1; $i<=$ROUNDS; $i++) { |
|
if ($MAXQUEST<$MAXQUEST[$i]) { |
|
$MAXQUEST=$MAXQUEST[$i]; |
|
} |
} |
} |
readmail(\%teams); |
|
close(INFILE); |
|
# |
# |
# Чистим хэш %answers |
# Таблица подводится отдельно по каждому раунду |
# |
# |
collect_answers(\%teams,\@answers); |
for (my $r=1; $r<=$ROUNDS; $r++) { |
|
if ($DEBUG) { |
|
print STDERR "Раунд $r\n"; |
|
} |
|
# |
|
# Читаем ответы в данном раунде |
|
# |
|
|
|
foreach my $file (split /\s+/, $FILES[$r]) { |
|
open (INFILE, $file); |
|
readmail(\%teams); |
|
collect_answers(\%teams,\@answers); |
|
close (INFILE); |
|
} |
|
|
# |
# |
# Подсчитываем рейтинги вопросов |
# Подсчитываем рейтинги вопросов |
# |
# |
rate_questions(\%teams,\@answers,\@ratings); |
rate_questions(\%teams,\@answers,\@ratings,$r); |
# |
# |
# Вычисляем число ответов и рейтинги команд |
# Вычисляем число ответов и рейтинги команд |
# |
# |
find_scores(\%teams,\@answers,\@ratings); |
find_scores(\%teams,\@answers,\@ratings,$r,0.01); |
# |
# |
# Ну а теперь печатаем саму таблицу... |
# Ну а теперь печатаем саму таблицу... |
# |
# |
if ($opt_o) |
|
{ |
|
die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o"); |
|
select OUTFILE; |
|
} |
|
# |
# |
# Печатаем заголовок |
# Печатаем заголовок |
# |
# |
printf "%5s ", "N"; |
print "ЗАЧЁТ $NAME[$r]\n"; |
for ($i=1;$i<=$MAXQUEST;$i++) |
printf "%5s ", "N"; |
{ |
for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++) |
if ($SHORT) { |
{ |
printf("%1d",$i%10); |
if ($SHORT) { |
} else { |
printf("%1d",$i%10); |
printf "%3d",$i; |
} else { |
|
printf "%3d",$i; |
|
} |
} |
} |
} |
printf "%6s","О"; |
printf "%3s","О"; |
printf "%4s","Р"; |
printf "%4s","Р"; |
printf " КОМАНДА"; |
printf " КОМАНДА"; |
print "\n"; |
print "\n"; |
|
# |
# |
# Печатаем команды построчно |
# Печатаем команды построчно |
# |
# |
foreach $team (sort |
foreach $team (sort |
{ |
{ |
$teams{$b}->{score} <=> $teams{$a}->{score} |
$teams{$b}->{score} <=> $teams{$a}->{score} |
or |
or |
$teams{$b}->{rating} <=> $teams{$a}->{rating} |
$teams{$b}->{rating} <=> $teams{$a}->{rating} |
} keys %teams |
} keys %teams |
) |
) |
{ |
|
printf "%5d ",$teams{$team}->{regnum}; |
|
for ($i=1;$i<=$MAXQUEST;$i++) |
|
{ |
{ |
my $answer = $teams{$team}->{answers}[$i]; |
printf "%5d ",$teams{$team}->{regnum}; |
my $score = $answers[$i]->{$answer}->{score}; |
for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++) |
$score = '-' unless $score; |
{ |
if ($SHORT) { |
my $answer = $teams{$team}->{answers}[$i]; |
printf "%1s",$score; |
my $score = $answers[$i]->{$answer}->{score}; |
} else { |
$score = '-' unless $score; |
printf "%3s", $score; |
if ($SHORT) { |
|
printf "%1s",$score; |
|
} else { |
|
printf "%3s", $score; |
|
} |
} |
} |
|
printf "%6.2f",$teams{$team}->{score}; |
|
printf "%4s",$teams{$team}->{rating}; |
|
print " $team"; |
|
print "\n"; |
} |
} |
printf "%3s",$teams{$team}->{score}; |
|
printf "%4s",$teams{$team}->{rating}; |
|
print " $team"; |
|
print "\n"; |
|
} |
|
# |
# |
# Печатаем последнюю строку таблицы |
# Печатаем последнюю строку таблицы |
# в ней рейтинги вопросов |
# в ней рейтинги вопросов |
# |
# |
if ($SHORT) { |
if ($SHORT) { |
print "Рейтинг\n"; |
print "Рейтинг\n"; |
for ($j=0;$j<$MAXQUEST/12;$j++) { |
for ($j=0;$j<$MAXQUEST[$r]/12;$j++) { |
my $max=$j*12+12; |
my $max=$j*12+12; |
if ($max>$MAXQUEST) { |
if ($max>$MAXQUEST[$r]) { |
$max=$MAXQUEST; |
$max=$MAXQUEST[$r]; |
} |
} |
for ($i=$j*12+1;$i<=$max;$i++){ |
for ($i=$j*12+1;$i<=$max;$i++){ |
printf("%3s",$i); |
printf("%3s",$i); |
|
} |
|
printf "\n"; |
|
for ($i=1+$j*12;$i<=$max;$i++){ |
|
printf("%3s",$ratings[$i]); |
|
} |
|
printf "\n"; |
} |
} |
printf "\n"; |
} else { |
for ($i=1+$j*12;$i<=$max;$i++){ |
printf "%5s ", "Р"; |
printf("%3s",$ratings[$i]); |
for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++) |
|
{ |
|
printf "%3s", $ratings[$i]; |
} |
} |
printf "\n"; |
print "\n"; |
} |
|
} else { |
|
printf "%5s ", "Р"; |
|
for ($i=1; $i<=$MAXQUEST;$i++) |
|
{ |
|
printf "%3s", $ratings[$i]; |
|
} |
} |
print "\n"; |
print "\n"; |
} |
} |