--- processmail/createtable.pl 2005/02/16 22:20:08 1.3 +++ processmail/createtable.pl 2008/03/23 17:50:49 3.0 @@ -1,5 +1,5 @@ #!/usr/local/bin/perl -#$Id: createtable.pl,v 1.3 2005/02/16 22:20:08 boris Exp $ +#$Id: createtable.pl,v 3.0 2008/03/23 17:50:49 boris Exp $ # # # @@ -9,15 +9,16 @@ use Getopt::Std; $usage = -"Usage: createtable.pl [-d] [-s] [-t answers_file] [-o results] \n"; +"Usage: createtable.pl [-d] [-s|-m] [-t answers_file] [-o results] \n"; require 'parameters.pl'; require 'subroutines.pl'; -die $usage unless getopts('t:o:ds'); +die $usage unless getopts('t:o:dsm'); $DEBUG=$opt_d; $SHORT=$opt_s; +$MEDIUM=$opt_m; my %teams; my @answers; @@ -55,6 +56,7 @@ for (my $i=1; $i<=$ROUNDS; $i++) { # # Таблица подводится отдельно по каждому раунду # +my @nopoint_questions; for (my $r=1; $r<=$ROUNDS; $r++) { if ($DEBUG) { print STDERR "Раунд $r\n"; @@ -63,7 +65,7 @@ for (my $r=1; $r<=$ROUNDS; $r++) { # Читаем ответы в данном раунде # - foreach my $file (split /\s+/, $FILES[$r]) { + foreach my $file ( @{$FILES[$r]} ) { open (INFILE, $file); readmail(\%teams); collect_answers(\%teams,\@answers); @@ -71,25 +73,60 @@ for (my $r=1; $r<=$ROUNDS; $r++) { } # +# Дополняем (добавляем к имеющемуся) список вопросов, идущих вне зачёта +# в данном туре. Для них проставляются плюсы и минусы, но они не входят +# в суммарный результат и рейтинг команд. +# + foreach my $num ( @{$NOCOUNT[$r]} ) + { + # Если номер не начинается с минуса, то включить его в список + # внезачётных, иначе - исключить. Проверяем регэкспом, а не на + # "> 0", чтобы можно было использовать и "-0". + if ($num =~ /^\d+/) { + push @nopoint_questions, $num; + } else { + @nopoint_questions = grep( $_ != -$num, @nopoint_questions ); + } + } + # И удаляем возможные дубликаты, чтобы всё было красиво. + my %seen; + @nopoint_questions = grep( !$seen{$_}++, @nopoint_questions ); + +# # Подсчитываем рейтинги вопросов # rate_questions(\%teams,\@answers,\@ratings,$r); # # Вычисляем число ответов и рейтинги команд # - find_scores(\%teams,\@answers,\@ratings,$r,0.01); + find_scores(\%teams,\@answers,\@ratings,$r,0.01,\@nopoint_questions); # # Ну а теперь печатаем саму таблицу... # # # Печатаем заголовок # + # Столько столбцов до пробела в среднем формате ("++-++ +-+-+ -+--+") + my $COL=5; + print "ЗАЧЁТ $NAME[$r]\n"; + if ( @nopoint_questions ) { + # Есть незачётные вопросы - печатаем их список. + print "Вне зачёта вопрос" . (scalar(@nopoint_questions)>1 ? "ы" : "") + . ": " . join(", ", sort {$a<=>$b} @nopoint_questions) . "\n"; + } + printf "%5s ", "N"; for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++) { if ($SHORT) { printf("%1d",$i%10); + } elsif ($MEDIUM) { + if ($i == int($i/$COL)*$COL || $i==$MAXQUEST[$r]) { + printf "%-3d", $i; + } else { + printf "%s", "."; + } } else { printf "%3d",$i; } @@ -115,8 +152,15 @@ for (my $r=1; $r<=$ROUNDS; $r++) { my $answer = $teams{$team}->{answers}[$i]; my $score = $answers[$i]->{$answer}->{score}; $score = '-' unless $score; + $score = 'X' + if ( $score eq '+' && @nopoint_questions && + grep($_==$i, @nopoint_questions) + ); if ($SHORT) { printf "%1s",$score; + } elsif ($MEDIUM) { + printf "%1s",$score; + print " " if ($i == int($i/$COL)*$COL || $i==$MAXQUEST[$r]); } else { printf "%3s", $score; } @@ -127,28 +171,29 @@ for (my $r=1; $r<=$ROUNDS; $r++) { print "\n"; } # -# Печатаем последнюю строку таблицы -# в ней рейтинги вопросов +# Печатаем рейтинги вопросов - длинный или короткий варианты. # - if ($SHORT) { - print "Рейтинг\n"; - for ($j=0;$j<$MAXQUEST[$r]/12;$j++) { - my $max=$j*12+12; + if ($SHORT || $MEDIUM) { + my $nline = 12; # По 12 рейтингов в строке + print "\nРейтинг\n"; + for ($j=0; $j<$MAXQUEST[$r]/$nline; $j++) { + my $max = $j*$nline + $nline; if ($max>$MAXQUEST[$r]) { $max=$MAXQUEST[$r]; } - for ($i=$j*12+1;$i<=$max;$i++){ + for ($i=$j*$nline+1; $i<=$max; $i++){ printf("%3s",$i); } printf "\n"; - for ($i=1+$j*12;$i<=$max;$i++){ + for ($i=$j*$nline+1; $i<=$max; $i++){ printf("%3s",$ratings[$i]); } printf "\n"; } } else { + # Длинный вариант - под каждым вопросом. printf "%5s ", "Р"; - for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++) + for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r]; $i++) { printf "%3s", $ratings[$i]; }