File:  [Local Repository] / processmail / subroutines.pl
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Mon Feb 4 17:18:33 2002 UTC (22 years, 5 months ago) by boris
Initial revision

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

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