Annotation of processmail/subroutines.pl, revision 1.2

1.1       boris       1: # В этот файл собраны процедуры, общие для всей системы
                      2: # работы с ответами.
                      3: #
1.2     ! boris       4: #$Id: subroutines.pl,v 1.1 2002/02/04 17:18:33 boris Exp boris $
1.1       boris       5: #
                      6: sub readhash
                      7: {
                      8:     my ($answers) = @_;
                      9:     my $answer = "";
                     10:     my $score = "";
                     11:     my $number = -1;
                     12:     while (<INFILE>)
                     13:     {
                     14:        if (/^\s*\#(\d+).*Score:\s*([+-\?])/) # Нашли новый ответ
                     15:        {
                     16:            if ($DEBUG)
                     17:            {
                     18:                print STDERR "\#$number. Score: $score\n",$answer;
                     19:            }
                     20:            if ($answer ne "" && $number >0)
                     21:            {
                     22:                $$answers[$number]->{$answer}->{score} = $score;
                     23:            }
                     24:            $answer = "";
                     25:            $number = $1;
                     26:            $score = $2;
                     27:            next;
                     28:        }
                     29:        if (/^Team:/)
                     30:        {
                     31:            next;
                     32:        }
                     33:        if (/^\s*\*\*\*\s*$/)
                     34:        {
                     35:            if ($answer ne "" && $number >0)
                     36:            {
                     37:                $$answers[$number]->{$answer}->{score} = $score;
                     38:            }
                     39:            last;
                     40:        }
                     41:        $answer .= &canonize_answer;
                     42:     }
                     43:     return 1;
                     44: }
                     45: 
                     46: #
                     47: # Читаем файл с письмами команд
                     48: #
                     49: sub readmail
                     50: {
                     51:     my ($table) = @_;
                     52:     $team="";
                     53:     $number=-1;
                     54:     while (<INFILE>)
                     55:     {
                     56:        if (/^\s*\*\*\*\s*"(.+)"\s*[,.]*\s*(\d+)*/) # Нашли новую команду
                     57:        {
                     58:            if ($DEBUG)
                     59:            {
                     60:                print STDERR "Команда: $1, рег. номер: $2\n";
                     61:            } 
                     62:            $team = $1;
                     63:            $number = -1;
                     64:            if (!exists($$table{$team})) # Новая команда...
                     65:            {
                     66:                my @teamanswers = ();
                     67:                my %teamhash = ('answers' => \@teamanswers, 
1.2     ! boris      68:                                'regnum' => $2,
        !            69:                                'numletters'=>0);
1.1       boris      70:                $$table{$team} = \%teamhash;
                     71:            }
1.2     ! boris      72:            $$table{$team}->{'numletters'}++;
1.1       boris      73:            if ($$table{$team}->{regnum} != $2)
                     74:            {
                     75:                print STDERR "Warning: Team $team uses registration nos. ",
                     76:                $$table{$team}->{regnum}, " and $2!\n";
                     77:            }
                     78:            next;
                     79:        }
                     80:        if (s/^\s*\#(\d+)\.*// && $team ne "")
                     81:        {
                     82:            if ($DEBUG)
                     83:            {
                     84:                print STDERR "Ответ $1\n";
                     85:                print STDERR;
                     86:            }
                     87:            $number = $1;
                     88:            $$table{$team}->{answers}[$number] = &canonize_answer;
                     89:            next;
                     90:        }
                     91:        if (/^\*\*\*/) # Команда кончилась
                     92:        {
                     93:            $team="";
                     94:            $number=-1;
                     95:        }
                     96:        if ($team ne "" && $number >0)
                     97:        {
                     98:            if ($DEBUG)
                     99:            {
                    100:                print STDERR;
                    101:            }
                    102:            $$table{$team}->{answers}[$number] .= &canonize_answer;
                    103:        }
                    104:     }
                    105:     return 1;
                    106: }
                    107: 
                    108: #
                    109: # Приводим ответ к канонической форме: два пробела в начале, 
                    110: # ни одного в конце
                    111: #
                    112: sub canonize_answer
                    113: {
                    114:     s/^\s*(.*)\s*$/  $1/;
                    115:     if (/^\s*$/) 
                    116:     {
                    117:        return "";
                    118:     }
                    119:     else 
                    120:     {
                    121:        return $_."\n";
                    122:     }
                    123: }
                    124: 
                    125: #
                    126: # Заполняем поля %answers
                    127: #
                    128: sub collect_answers
                    129: {
                    130:     my ($teams,$answers) = @_;
                    131:     for ($i=1;$i<=$MAXQUEST;$i++)
                    132:     {
                    133:        foreach $answer (keys %{$$answers[$i]})
                    134:        {
                    135:            @{$$answers[$i]->{$answer}->{teams}} = ();
                    136:        }
                    137: 
                    138:        foreach $team (keys %$teams)
                    139:        {
                    140:            $answer = $$teams{$team}->{answers}[$i];
                    141:            if ($answer eq "")
                    142:            {
                    143:                next;
                    144:            }
                    145:            if (exists $$answers[$i]->{$answer})
                    146:            {
                    147:                push @{$$answers[$i]->{$answer}->{teams}}, $team;
                    148:            }
                    149:            else
                    150:            {
                    151:                my @tmp=($team);
                    152:                $$answers[$i]->{$answer}->{teams} = \@tmp;
                    153:                $$answers[$i]->{$answer}->{score} = '?';
                    154:            }
                    155:        }
                    156:        foreach $answer (keys %{$$answers[$i]})
                    157:        {
                    158:            if (scalar @{$$answers[$i]->{$answer}->{teams}} == 0)
                    159:            {
                    160:                delete $$answers[$i]->{$answer};
                    161:            }
                    162:        }
                    163:     }
                    164:     return 1;
                    165: 
                    166: }
                    167: 
                    168: #
                    169: # Сбрасываем ответы на вопрос $number с оценкой $symbol
                    170: #
                    171: sub dumphash
                    172: {
                    173:     my ($teams,$answers,$number,$symbol) = @_;
                    174:     foreach $answer (keys %{$answers->[$number]})
                    175:     {
                    176:        if ($$answers[$number]->{$answer}{score} eq $symbol)
                    177:        {
                    178:            print "\#$number. Frequency: ", 
                    179:            scalar @{$answers->[$number]->{$answer}->{teams}},
                    180:            ". Score: ",
                    181:            $$answers[$number]->{$answer}{score},"\n"; 
                    182:            print $answer;
                    183:            if ($DEBUG)
                    184:            {
                    185:                foreach $team (@{$answers->[$number]->{$answer}->{teams}})
                    186:                {
                    187:                    print "Team: ",
                    188:                    " \"$team\", ",$$teams{$team}->{regnum}, "\n";
                    189:                }
                    190:            }
                    191:        }
                    192:     }
                    193:     return 1;
                    194: }
                    195: #
                    196: # Сбрасываем ответы на вопрос $number с оценкой $symbol
                    197: # в формате, пригодном для собрания сочинений
                    198: #
                    199: sub anondump
                    200: {
                    201:     my ($teams,$answers,$number,$symbol) = @_;
                    202:     foreach $answer (keys %{$answers->[$number]})
                    203:     {
                    204:        if ($$answers[$number]->{$answer}{score} eq $symbol)
                    205:        {
                    206:            my $frequency = scalar @{$answers->[$number]->{$answer}->{teams}};
                    207:            my $canon = $answer;
                    208:            $canon =~ s/^ /$symbol/;
                    209:            if ($frequency >1)
                    210:            {
                    211:                chomp $canon;
                    212:                $canon .= " [$frequency]\n";
                    213:            }
                    214:            print $canon;
                    215:            if ($DEBUG)
                    216:            {
                    217:                foreach $team (@{$answers->[$number]->{$answer}->{teams}})
                    218:                {
                    219:                    print STDERR "Team: ",
                    220:                    " \"$team\", ",$$teams{$team}->{regnum}, "\n";
                    221:                }
                    222:            }
                    223:        }
                    224:     }
                    225:     return 1;
                    226: }
                    227: 
                    228: #
                    229: # Подсчитываем рейтинги вопросов. Рейтинг вопроса есть 
                    230: # 1+количество команд, которые на него НЕ ответили
                    231: #
                    232: sub rate_questions
                    233: {
                    234:     my($teams,$answers,$ratings) = @_;
                    235:     my $numteams = scalar keys %$teams;
                    236:     for ($i=1;$i<=$MAXQUEST;$i++)
                    237:     {
                    238:        $$ratings[$i]=$numteams+1;
                    239:        foreach $answer (keys %{$$answers[$i]})
                    240:        {
                    241:            if ($$answers[$i]->{$answer}{score} eq '+')
                    242:            {
                    243:                $$ratings[$i] -= 
                    244:                    scalar @{$answers->[$i]->{$answer}->{teams}} ;
                    245:            }
                    246:        }
                    247:     }
                    248:     if ($DEBUG)
                    249:     {
                    250:        for ($i=1;$i<=$MAXQUEST;$i++)
                    251:        {
                    252:            print STDERR "Вопрос $i, Рейтинг: ", $$ratings[$i], "\n";
                    253:        }
                    254:     }   
                    255: }
                    256: 
                    257: #
                    258: # Подсчитываем рейтинги команд
                    259: #
                    260: sub find_scores
                    261: {
1.2     ! boris     262:     my ($teams,$answers,$ratings,$factor) = @_;
1.1       boris     263:     foreach $team (keys %$teams)
                    264:     {
1.2     ! boris     265:        if (!defined($factor)) {
        !           266:            $factor=1;
        !           267:        }
        !           268:        $$teams{$team}->{score} *=$factor;
1.1       boris     269:        $$teams{$team}->{rating} = 0;
                    270:        for ($i=1;$i<=$MAXQUEST;$i++)
                    271:        {
                    272:            my $answer=$$teams{$team}->{answers}[$i];
                    273:            if ($$answers[$i]->{$answer}{score} eq '+')
                    274:            {
                    275:                $$teams{$team}->{score}  += 1;
                    276:                $$teams{$team}->{rating} +=
                    277:                    $$ratings[$i];
                    278:            }
                    279:        }
                    280:        if ($DEBUG)
                    281:        {
                    282:            print STDERR "$team: Score ",
                    283:            $$teams{$team}->{score},
                    284:            ", Rating ",
                    285:            $$teams{$team}->{rating},"\n";
                    286:        }
                    287:     }
                    288: }
                    289: 
                    290: 
                    291: 1;
                    292: 
                    293: 
                    294: 
                    295: 
                    296: 
                    297: 
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303: 
                    304: 
                    305: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>