--- processmail/createtable.pl 2002/02/04 16:23:23 1.2 +++ processmail/createtable.pl 2005/02/16 22:20:08 1.3 @@ -1,20 +1,20 @@ #!/usr/local/bin/perl -#$Id: createtable.pl,v 1.2 2002/02/04 16:23:23 boris Exp $ +#$Id: createtable.pl,v 1.3 2005/02/16 22:20:08 boris Exp $ # # # # Исходные файлы и параметры # - use Getopt::Std; +use Getopt::Std; -$usage = 'createtable.pl $Revision: 1.2 $, $Date: 2002/02/04 16:23:23 $'. "\n". -"Usage: createtable.pl [-d] [-s] [-t answers_file] [-m mail_file] [-o results] \n"; +$usage = +"Usage: createtable.pl [-d] [-s] [-t answers_file] [-o results] \n"; require 'parameters.pl'; require 'subroutines.pl'; -die $usage unless getopts('t:m:o:ds'); +die $usage unless getopts('t:o:ds'); $DEBUG=$opt_d; $SHORT=$opt_s; @@ -25,115 +25,134 @@ my @ratings; # # Читаем старые результаты # -if ($opt_t) -{ +if ($opt_t) { die "Cannot open $opt_t\n" unless open(INFILE,$opt_t); - readhash(\@answers); - close(INFILE); +} else { + *INFILE=*STDIN; } + +readhash(\@answers); +close(INFILE); + # -# Читаем ответы команд +# Открываем файл для записи # -if ($opt_m) -{ - die "Cannot open $opt_m\n" unless open(INFILE,$opt_m) +if ($opt_o) { + die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o"); + 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"; -for ($i=1;$i<=$MAXQUEST;$i++) -{ - if ($SHORT) { - printf("%1d",$i%10); - } else { - printf "%3d",$i; + print "ЗАЧЁТ $NAME[$r]\n"; + printf "%5s ", "N"; + for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++) + { + if ($SHORT) { + printf("%1d",$i%10); + } else { + printf "%3d",$i; + } } -} -printf "%3s","О"; -printf "%4s","Р"; -printf " КОМАНДА"; -print "\n"; + printf "%6s","О"; + printf "%4s","Р"; + printf " КОМАНДА"; + print "\n"; # # Печатаем команды построчно # -foreach $team (sort - { - $teams{$b}->{score} <=> $teams{$a}->{score} - or - $teams{$b}->{rating} <=> $teams{$a}->{rating} - } keys %teams - ) -{ - printf "%5d ",$teams{$team}->{regnum}; - for ($i=1;$i<=$MAXQUEST;$i++) + foreach $team (sort + { + $teams{$b}->{score} <=> $teams{$a}->{score} + or + $teams{$b}->{rating} <=> $teams{$a}->{rating} + } keys %teams + ) { - my $answer = $teams{$team}->{answers}[$i]; - my $score = $answers[$i]->{$answer}->{score}; - $score = '-' unless $score; - if ($SHORT) { - printf "%1s",$score; - } else { - printf "%3s", $score; + printf "%5d ",$teams{$team}->{regnum}; + for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++) + { + my $answer = $teams{$team}->{answers}[$i]; + my $score = $answers[$i]->{$answer}->{score}; + $score = '-' unless $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) { - print "Рейтинг\n"; - for ($j=0;$j<$MAXQUEST/12;$j++) { - my $max=$j*12+12; - if ($max>$MAXQUEST) { - $max=$MAXQUEST; - } - for ($i=$j*12+1;$i<=$max;$i++){ - printf("%3s",$i); + if ($SHORT) { + print "Рейтинг\n"; + for ($j=0;$j<$MAXQUEST[$r]/12;$j++) { + my $max=$j*12+12; + if ($max>$MAXQUEST[$r]) { + $max=$MAXQUEST[$r]; + } + for ($i=$j*12+1;$i<=$max;$i++){ + printf("%3s",$i); + } + printf "\n"; + for ($i=1+$j*12;$i<=$max;$i++){ + printf("%3s",$ratings[$i]); + } + printf "\n"; } - printf "\n"; - for ($i=1+$j*12;$i<=$max;$i++){ - printf("%3s",$ratings[$i]); + } else { + printf "%5s ", "Р"; + for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++) + { + printf "%3s", $ratings[$i]; } - printf "\n"; - } -} else { - printf "%5s ", "Р"; - for ($i=1; $i<=$MAXQUEST;$i++) - { - printf "%3s", $ratings[$i]; + print "\n"; } print "\n"; }