File:  [Local Repository] / processmail / subroutines.pl
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Mon Jan 24 03:14:49 2005 UTC (19 years, 5 months ago) by boris
Added new files

    1: # В этот файл собраны процедуры, общие для всей системы
    2: # работы с ответами.
    3: #
    4: #$Id: subroutines.pl,v 1.2 2005/01/24 03:14:49 boris Exp $
    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, 
   68: 				'regnum' => $2,
   69: 				'numletters'=>0);
   70: 		$$table{$team} = \%teamhash;
   71: 	    }
   72: 	    $$table{$team}->{'numletters'}++;
   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: {
  262:     my ($teams,$answers,$ratings,$factor) = @_;
  263:     foreach $team (keys %$teams)
  264:     {
  265: 	if (!defined($factor)) {
  266: 	    $factor=1;
  267: 	}
  268: 	$$teams{$team}->{score} *=$factor;
  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>