--- processmail/createtable.pl 2008/09/08 17:16:47 3.2 +++ processmail/createtable.pl 2008/03/23 17:50:49 3.0 @@ -1,5 +1,5 @@ #!/usr/local/bin/perl -#$Id: createtable.pl,v 3.2 2008/09/08 17:16:47 boris Exp $ +#$Id: createtable.pl,v 3.0 2008/03/23 17:50:49 boris Exp $ # # # @@ -56,25 +56,15 @@ for (my $i=1; $i<=$ROUNDS; $i++) { # # Таблица подводится отдельно по каждому раунду # -my @nopoint_questions; # Здесь будут внезачётные вопросы -my @unknowns; # Сюда запомним все '?' +my @nopoint_questions; for (my $r=1; $r<=$ROUNDS; $r++) { if ($DEBUG) { print STDERR "Раунд $r\n"; } +# +# Читаем ответы в данном раунде +# - # - # Удаляем старые рейтинги (Ivan A Derzhanski ) - # - for ($i=1;$i<=$MAXQUEST;$i++) { - foreach $answer (keys %{$answers[$i]}) { - %{$answers[$i]->{$answer}->{teams}} = (); - } - } - - # - # Читаем ответы в данном раунде - # foreach my $file ( @{$FILES[$r]} ) { open (INFILE, $file); readmail(\%teams); @@ -82,11 +72,11 @@ for (my $r=1; $r<=$ROUNDS; $r++) { close (INFILE); } - # - # Дополняем (добавляем к имеющемуся!) список вопросов, идущих вне зачёта - # в данном туре. Для них проставляются плюсы и минусы, но они не входят - # в суммарный результат и рейтинг команд. - # +# +# Дополняем (добавляем к имеющемуся) список вопросов, идущих вне зачёта +# в данном туре. Для них проставляются плюсы и минусы, но они не входят +# в суммарный результат и рейтинг команд. +# foreach my $num ( @{$NOCOUNT[$r]} ) { # Если номер не начинается с минуса, то включить его в список @@ -102,22 +92,20 @@ 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; @@ -147,10 +135,9 @@ for (my $r=1; $r<=$ROUNDS; $r++) { printf "%4s","Р"; printf " КОМАНДА"; print "\n"; - - # - # Печатаем команды построчно - # +# +# Печатаем команды построчно +# foreach $team (sort { $teams{$b}->{score} <=> $teams{$a}->{score} @@ -165,25 +152,10 @@ for (my $r=1; $r<=$ROUNDS; $r++) { my $answer = $teams{$team}->{answers}[$i]; my $score = $answers[$i]->{$answer}->{score}; $score = '-' unless $score; - - # Особо пометим взятые внезачётные вопросы. - 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 ); - } - - # Ну наконец-то! Печатаем. + $score = 'X' + if ( $score eq '+' && @nopoint_questions && + grep($_==$i, @nopoint_questions) + ); if ($SHORT) { printf "%1s",$score; } elsif ($MEDIUM) { @@ -198,12 +170,11 @@ for (my $r=1; $r<=$ROUNDS; $r++) { print " $team"; print "\n"; } - - # - # Печатаем рейтинги вопросов - длинный или короткий варианты. - # +# +# Печатаем рейтинги вопросов - длинный или короткий варианты. +# if ($SHORT || $MEDIUM) { - my $nline = 24; # По $nline рейтингов в строке + my $nline = 12; # По 12 рейтингов в строке print "\nРейтинг\n"; for ($j=0; $j<$MAXQUEST[$r]/$nline; $j++) { my $max = $j*$nline + $nline; @@ -230,16 +201,3 @@ 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);