version 3.4, 2013/10/30 19:28:30
|
version 3.0, 2008/03/23 17:50:49
|
Line 1
|
Line 1
|
#!/usr/bin/perl |
#!/usr/local/bin/perl |
#$Id$ |
#$Id$ |
# |
# |
# |
# |
Line 20 $DEBUG=$opt_d;
|
Line 20 $DEBUG=$opt_d;
|
$SHORT=$opt_s; |
$SHORT=$opt_s; |
$MEDIUM=$opt_m; |
$MEDIUM=$opt_m; |
|
|
# Находим максимальный и минимальный вопрос и слегка подстраховываемся. |
|
$MINQUEST=1e99; |
|
$MAXQUEST=-1; |
|
for (my $r=1; $r<=$ROUNDS; $r++) { |
|
if ($MINQUEST>$MINQUEST[$r]) { |
|
$MINQUEST=$MINQUEST[$r]; |
|
} |
|
if ($MAXQUEST<$MAXQUEST[$r]) { |
|
$MAXQUEST=$MAXQUEST[$r]; |
|
} |
|
} |
|
if ($MINQUEST < 0 || $MAXQUEST < 0) { |
|
die "Отрицательные номера вопросов не поддерживаются!\n"; |
|
} |
|
|
|
my %teams; |
my %teams; |
my @answers; |
my @answers; |
my @ratings; |
my @ratings; |
Line 59 if ($opt_o) {
|
Line 44 if ($opt_o) {
|
select OUTFILE; |
select OUTFILE; |
} |
} |
|
|
|
# Находим максимальный вопрос |
|
$MAXQUEST=1; |
|
for (my $i=1; $i<=$ROUNDS; $i++) { |
|
if ($MAXQUEST<$MAXQUEST[$i]) { |
|
$MAXQUEST=$MAXQUEST[$i]; |
|
} |
|
} |
|
|
|
|
# |
# |
# Таблица подводится отдельно по каждому раунду |
# Таблица подводится отдельно по каждому раунду |
# |
# |
my @nopoint_questions; # Здесь будут внезачётные вопросы |
my @nopoint_questions; |
my @unknowns; # Сюда запомним все '?' |
|
for (my $r=1; $r<=$ROUNDS; $r++) { |
for (my $r=1; $r<=$ROUNDS; $r++) { |
if ($DEBUG) { |
if ($DEBUG) { |
print STDERR "Раунд $r\n"; |
print STDERR "Раунд $r\n"; |
} |
} |
|
# |
|
# Читаем ответы в данном раунде |
|
# |
|
|
# |
|
# Удаляем старые рейтинги (Ivan A Derzhanski <iad58@mail.ru>) |
|
# |
|
for ($i=$MINQUEST;$i<=$MAXQUEST;$i++) { |
|
foreach $answer (keys %{$answers[$i]}) { |
|
%{$answers[$i]->{$answer}->{teams}} = (); |
|
} |
|
} |
|
|
|
# |
|
# Читаем ответы в данном раунде |
|
# |
|
foreach my $file ( @{$FILES[$r]} ) { |
foreach my $file ( @{$FILES[$r]} ) { |
open (INFILE, $file); |
open (INFILE, $file); |
readmail(\%teams); |
readmail(\%teams); |
Line 88 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 72 for (my $r=1; $r<=$ROUNDS; $r++) {
|
close (INFILE); |
close (INFILE); |
} |
} |
|
|
# |
# |
# Дополняем (добавляем к имеющемуся!) список вопросов, идущих вне зачёта |
# Дополняем (добавляем к имеющемуся) список вопросов, идущих вне зачёта |
# в данном туре. Для них проставляются плюсы и минусы, но они не входят |
# в данном туре. Для них проставляются плюсы и минусы, но они не входят |
# в суммарный результат и рейтинг команд. |
# в суммарный результат и рейтинг команд. |
# |
# |
foreach my $num ( @{$NOCOUNT[$r]} ) |
foreach my $num ( @{$NOCOUNT[$r]} ) |
{ |
{ |
# Если номер не начинается с минуса, то включить его в список |
# Если номер не начинается с минуса, то включить его в список |
Line 108 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 92 for (my $r=1; $r<=$ROUNDS; $r++) {
|
my %seen; |
my %seen; |
@nopoint_questions = grep( !$seen{$_}++, @nopoint_questions ); |
@nopoint_questions = grep( !$seen{$_}++, @nopoint_questions ); |
|
|
# |
# |
# Подсчитываем рейтинги вопросов |
# Подсчитываем рейтинги вопросов |
# |
# |
rate_questions(\%teams,\@answers,\@ratings,$r); |
rate_questions(\%teams,\@answers,\@ratings,$r); |
|
# |
# |
# Вычисляем число ответов и рейтинги команд |
# Вычисляем число ответов и рейтинги команд |
# |
# |
|
find_scores(\%teams,\@answers,\@ratings,$r,0.01,\@nopoint_questions); |
find_scores(\%teams,\@answers,\@ratings,$r,0.01,\@nopoint_questions); |
|
# |
# |
# Ну а теперь печатаем саму таблицу... |
# Ну а теперь печатаем саму таблицу... |
# |
# |
# |
# |
# Печатаем заголовок |
# Печатаем заголовок |
# |
# |
|
# Столько столбцов до пробела в среднем формате ("++-++ +-+-+ -+--+") |
# Столько столбцов до пробела в среднем формате ("++-++ +-+-+ -+--+") |
my $COL=5; |
my $COL=5; |
|
|
Line 153 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 135 for (my $r=1; $r<=$ROUNDS; $r++) {
|
printf "%4s","Р"; |
printf "%4s","Р"; |
printf " КОМАНДА"; |
printf " КОМАНДА"; |
print "\n"; |
print "\n"; |
|
# |
# |
# Печатаем команды построчно |
# Печатаем команды построчно |
# |
# |
|
foreach $team (sort |
foreach $team (sort |
{ |
{ |
$teams{$b}->{score} <=> $teams{$a}->{score} |
$teams{$b}->{score} <=> $teams{$a}->{score} |
Line 171 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 152 for (my $r=1; $r<=$ROUNDS; $r++) {
|
my $answer = $teams{$team}->{answers}[$i]; |
my $answer = $teams{$team}->{answers}[$i]; |
my $score = $answers[$i]->{$answer}->{score}; |
my $score = $answers[$i]->{$answer}->{score}; |
$score = '-' unless $score; |
$score = '-' unless $score; |
|
$score = 'X' |
# Особо пометим взятые внезачётные вопросы. |
if ( $score eq '+' && @nopoint_questions && |
if ( $score eq '+' && grep($_==$i, @nopoint_questions) ) { |
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) { |
if ($SHORT) { |
printf "%1s",$score; |
printf "%1s",$score; |
} elsif ($MEDIUM) { |
} elsif ($MEDIUM) { |
Line 204 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 170 for (my $r=1; $r<=$ROUNDS; $r++) {
|
print " $team"; |
print " $team"; |
print "\n"; |
print "\n"; |
} |
} |
|
# |
# |
# Печатаем рейтинги вопросов - длинный или короткий варианты. |
# Печатаем рейтинги вопросов - длинный или короткий варианты. |
# |
# |
|
if ($SHORT || $MEDIUM) { |
if ($SHORT || $MEDIUM) { |
my $nline = 24; # По $nline рейтингов в строке |
my $nline = 12; # По 12 рейтингов в строке |
print "\nРейтинг\n"; |
print "\nРейтинг\n"; |
for ($j=0; $j<$MAXQUEST[$r]/$nline; $j++) { |
for ($j=0; $j<$MAXQUEST[$r]/$nline; $j++) { |
my $max = $j*$nline + $nline; |
my $max = $j*$nline + $nline; |
if ($max>$MAXQUEST[$r]) { |
if ($max>$MAXQUEST[$r]) { |
$max=$MAXQUEST[$r]; |
$max=$MAXQUEST[$r]; |
} |
} |
for ($i=$MINQUEST[$r]+$j*$nline; $i<=$max; $i++){ |
for ($i=$j*$nline+1; $i<=$max; $i++){ |
printf("%3s",$i); |
printf("%3s",$i); |
} |
} |
printf "\n"; |
printf "\n"; |
for ($i=$MINQUEST[$r]+$j*$nline; $i<=$max; $i++){ |
for ($i=$j*$nline+1; $i<=$max; $i++){ |
printf("%3s",$ratings[$i]); |
printf("%3s",$ratings[$i]); |
} |
} |
printf "\n"; |
printf "\n"; |
Line 235 for (my $r=1; $r<=$ROUNDS; $r++) {
|
Line 200 for (my $r=1; $r<=$ROUNDS; $r++) {
|
print "\n"; |
print "\n"; |
} |
} |
print "\n"; |
print "\n"; |
print "\n"; # LG: One more for better readability |
|
} |
|
|
|
|
|
# Печатаем предупреждение если есть неясные ответы. |
|
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); |
|