--- processmail/subroutines.pl 2005/02/16 22:20:08 1.5 +++ processmail/subroutines.pl 2008/03/24 16:01:47 3.1 @@ -1,7 +1,7 @@ # В этот файл собраны процедуры, общие для всей системы # работы с ответами. # -#$Id: subroutines.pl,v 1.5 2005/02/16 22:20:08 boris Exp $ +#$Id: subroutines.pl,v 3.1 2008/03/24 16:01:47 boris Exp $ # sub readhash { @@ -238,10 +238,13 @@ sub rate_questions # # Подсчитываем рейтинги команд +# @{$nopoint_questions} - список номеров вопросов, идущих вне зачёта. +# Для них проставляются плясы/минусы, но они не учитываются в подсчёте +# очков и рейтингов команд. # sub find_scores { - my ($teams,$answers,$ratings,$round,$factor) = @_; + my ($teams,$answers,$ratings,$round,$factor,$nopoint_questions) = @_; foreach $team (keys %$teams) { if (!defined($factor)) { @@ -254,6 +257,9 @@ sub find_scores my $answer=$$teams{$team}->{answers}[$i]; if ($$answers[$i]->{$answer}{score} eq '+') { + next if ( @{$nopoint_questions} && + grep($_==$i, @{$nopoint_questions}) + ); $$teams{$team}->{score} += 1; $$teams{$team}->{rating} += $$ratings[$i]; @@ -270,18 +276,38 @@ sub find_scores } -1; - - - - - - - - - +# +# Проверяем на наличие дублирующихся номеров у разных команд. +# +sub check_dup_numbers +{ + my ($teams) = @_; + my %seen; + # Имена команд, номера которых встречаются >1 раза. + # Массив uniq_compr_names содержит по одному имени на каждый повторяющийся + # номер (чуть позже мы найдём все имена, соответствующие каждому из + # этих номеров). + # '+0' - чтобы номера обрабатывались как числа (072 == 72). + my @uniq_compr_names = + grep( $seen{$teams->{$_}->{regnum}+0}++ > 1, keys %$teams ); + + # А теперь извлекаем номера из полученного списка. + my @dup_numbers = map {$teams->{$_}->{regnum}} @uniq_compr_names; + @dup_numbers = sort @dup_numbers; + + # И печатаем предупреждение. + if ( @dup_numbers ) { + print STDERR "\nВНИМАНИЕ! Одинаковые номера у нескольких команд:\n"; + foreach my $num ( @dup_numbers ) { + my @dup_names = grep($teams->{$_}->{regnum} == $num, keys %$teams); + print STDERR "\tНомер $num: " . join(", ", @dup_names) . "\n"; + } + print STDERR "\n"; + } +} +1;