#!/usr/local/bin/perl #$Id: createtable.pl,v 1.3 2005/02/16 22:20:08 boris Exp $ # # # # Исходные файлы и параметры # use Getopt::Std; $usage = "Usage: createtable.pl [-d] [-s] [-t answers_file] [-o results] \n"; require 'parameters.pl'; require 'subroutines.pl'; die $usage unless getopts('t:o:ds'); $DEBUG=$opt_d; $SHORT=$opt_s; my %teams; my @answers; my @ratings; # # Читаем старые результаты # if ($opt_t) { die "Cannot open $opt_t\n" unless open(INFILE,$opt_t); } else { *INFILE=*STDIN; } readhash(\@answers); close(INFILE); # # Открываем файл для записи # if ($opt_o) { die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o"); select OUTFILE; } # Находим максимальный вопрос $MAXQUEST=1; for (my $i=1; $i<=$ROUNDS; $i++) { if ($MAXQUEST<$MAXQUEST[$i]) { $MAXQUEST=$MAXQUEST[$i]; } } # # Таблица подводится отдельно по каждому раунду # 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,$r); # # Вычисляем число ответов и рейтинги команд # find_scores(\%teams,\@answers,\@ratings,$r,0.01); # # Ну а теперь печатаем саму таблицу... # # # Печатаем заголовок # 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 "%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=$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"; } # # Печатаем последнюю строку таблицы # в ней рейтинги вопросов # 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"; } } else { printf "%5s ", "Р"; for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++) { printf "%3s", $ratings[$i]; } print "\n"; } print "\n"; }