--- processmail/createtable.pl 2008/03/23 17:50:49 3.0 +++ processmail/createtable.pl 2008/03/24 16:01:47 3.1 @@ -1,5 +1,5 @@ #!/usr/local/bin/perl -#$Id: createtable.pl,v 3.0 2008/03/23 17:50:49 boris Exp $ +#$Id: createtable.pl,v 3.1 2008/03/24 16:01:47 boris Exp $ # # # @@ -56,15 +56,16 @@ for (my $i=1; $i<=$ROUNDS; $i++) { # # Таблица подводится отдельно по каждому раунду # -my @nopoint_questions; +my @nopoint_questions; # Здесь будут внезачётные вопросы +my @unknowns; # Сюда запомним все '?' for (my $r=1; $r<=$ROUNDS; $r++) { if ($DEBUG) { print STDERR "Раунд $r\n"; } -# -# Читаем ответы в данном раунде -# + # + # Читаем ответы в данном раунде + # foreach my $file ( @{$FILES[$r]} ) { open (INFILE, $file); readmail(\%teams); @@ -72,11 +73,11 @@ for (my $r=1; $r<=$ROUNDS; $r++) { close (INFILE); } -# -# Дополняем (добавляем к имеющемуся) список вопросов, идущих вне зачёта -# в данном туре. Для них проставляются плюсы и минусы, но они не входят -# в суммарный результат и рейтинг команд. -# + # + # Дополняем (добавляем к имеющемуся!) список вопросов, идущих вне зачёта + # в данном туре. Для них проставляются плюсы и минусы, но они не входят + # в суммарный результат и рейтинг команд. + # foreach my $num ( @{$NOCOUNT[$r]} ) { # Если номер не начинается с минуса, то включить его в список @@ -92,20 +93,22 @@ for (my $r=1; $r<=$ROUNDS; $r++) { my %seen; @nopoint_questions = grep( !$seen{$_}++, @nopoint_questions ); -# -# Подсчитываем рейтинги вопросов -# + # + # Подсчитываем рейтинги вопросов + # rate_questions(\%teams,\@answers,\@ratings,$r); -# -# Вычисляем число ответов и рейтинги команд -# + + # + # Вычисляем число ответов и рейтинги команд + # find_scores(\%teams,\@answers,\@ratings,$r,0.01,\@nopoint_questions); -# -# Ну а теперь печатаем саму таблицу... -# -# -# Печатаем заголовок -# + + # + # Ну а теперь печатаем саму таблицу... + # + # + # Печатаем заголовок + # # Столько столбцов до пробела в среднем формате ("++-++ +-+-+ -+--+") my $COL=5; @@ -135,9 +138,10 @@ for (my $r=1; $r<=$ROUNDS; $r++) { printf "%4s","Р"; printf " КОМАНДА"; print "\n"; -# -# Печатаем команды построчно -# + + # + # Печатаем команды построчно + # foreach $team (sort { $teams{$b}->{score} <=> $teams{$a}->{score} @@ -152,10 +156,25 @@ 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 ( $score eq '+' && grep($_==$i, @nopoint_questions) ) { + $score = 'X'; + } + + # И запомним, если вопрос не взят и не не взят ;-). + if ( $score eq '?' ) { + my $unk = { + question => $i, + score => $score, + team => $team, + regnum => $teams{$team}->{regnum}, + round => $r, + }; + push( @unknowns, $unk ); + } + + # Ну наконец-то! Печатаем. if ($SHORT) { printf "%1s",$score; } elsif ($MEDIUM) { @@ -170,11 +189,12 @@ for (my $r=1; $r<=$ROUNDS; $r++) { print " $team"; print "\n"; } -# -# Печатаем рейтинги вопросов - длинный или короткий варианты. -# + + # + # Печатаем рейтинги вопросов - длинный или короткий варианты. + # if ($SHORT || $MEDIUM) { - my $nline = 12; # По 12 рейтингов в строке + my $nline = 24; # По $nline рейтингов в строке print "\nРейтинг\n"; for ($j=0; $j<$MAXQUEST[$r]/$nline; $j++) { my $max = $j*$nline + $nline; @@ -201,3 +221,16 @@ for (my $r=1; $r<=$ROUNDS; $r++) { } print "\n"; } + + +# Печатаем предупреждение если есть неясные ответы. +if ( @unknowns ) { + print STDERR "ВНИМАНИЕ! Не всем ответам проставлены '+' и '-':\n"; + foreach my $unk ( @unknowns ) { + print STDERR "\tКоманда $unk->{team} ($unk->{regnum}), " + . "вопрос $unk->{question} ($NAME[$unk->{round}]): " + . "$unk->{score}\n"; + } +} +# На всякий случай проверяем на наличие команд с дублирующимися номерами. +check_dup_numbers(\%teams);