File:  [Local Repository] / processmail / createtable.pl
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 16 22:20:08 2005 UTC (19 years, 4 months ago) by boris
CVS tags: Version_3
Createtable works

#!/usr/local/bin/perl
#$Id: createtable.pl,v 1.3 2005/02/16 22:20:08 boris Exp $
#
#
#
# Исходные файлы и параметры
#

use Getopt::Std; 

$usage = 
"Usage: createtable.pl [-d] [-s] [-t answers_file]  [-o results] \n";

require 'parameters.pl';
require 'subroutines.pl';

die $usage unless getopts('t:o:ds');

$DEBUG=$opt_d;
$SHORT=$opt_s;

my %teams;
my @answers;
my @ratings;
#
# Читаем старые результаты
#
if ($opt_t) {
    die "Cannot open $opt_t\n" unless open(INFILE,$opt_t);
} else {
   *INFILE=*STDIN;
}
    
readhash(\@answers);
close(INFILE);


#
# Открываем файл для записи
#
if ($opt_o) { 
    die "Cannot open $opt_o\n" unless open(OUTFILE,">$opt_o");
    select OUTFILE;
}

# Находим максимальный вопрос
$MAXQUEST=1;
for (my $i=1; $i<=$ROUNDS; $i++) {
    if ($MAXQUEST<$MAXQUEST[$i]) {
	$MAXQUEST=$MAXQUEST[$i];
    }
}


#
# Таблица подводится отдельно по каждому раунду
#
for (my $r=1; $r<=$ROUNDS; $r++) {
    if ($DEBUG) {
	print STDERR "Раунд $r\n";
    }
#
#  Читаем ответы в данном раунде
#

    foreach my $file (split /\s+/, $FILES[$r]) {
	open (INFILE, $file);
	readmail(\%teams);
	collect_answers(\%teams,\@answers);
	close (INFILE);
    }

#
# Подсчитываем рейтинги вопросов
#
    rate_questions(\%teams,\@answers,\@ratings,$r);
#
# Вычисляем число ответов и рейтинги команд
#
    find_scores(\%teams,\@answers,\@ratings,$r,0.01);
#
# Ну а теперь печатаем саму таблицу...
#
#
# Печатаем заголовок
#
    print "ЗАЧЁТ  $NAME[$r]\n";
    printf "%5s ", "N";
    for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++)
    {
	if ($SHORT) {
	    printf("%1d",$i%10);
	} else {
	    printf "%3d",$i;
	}
    }
    printf "%6s","О";
    printf "%4s","Р";
    printf " КОМАНДА";
    print "\n";
#
# Печатаем команды построчно
#
    foreach $team (sort 
		   {
		       $teams{$b}->{score} <=> $teams{$a}->{score}
		       or
			   $teams{$b}->{rating} <=> $teams{$a}->{rating}
		   } keys %teams
		   )
    {
	printf "%5d ",$teams{$team}->{regnum};
	for ($i=$MINQUEST[$r];$i<=$MAXQUEST[$r];$i++)
	{
	    my $answer = $teams{$team}->{answers}[$i];
	    my $score = $answers[$i]->{$answer}->{score};
	    $score = '-' unless $score;
	    if ($SHORT) {
		printf "%1s",$score;
	    } else {
		printf "%3s", $score;
	    }
	}
	printf "%6.2f",$teams{$team}->{score};
	printf "%4s",$teams{$team}->{rating};
	print " $team";
	print "\n";
    }
#
# Печатаем последнюю строку таблицы
# в ней рейтинги вопросов
#
    if ($SHORT) {
	print "Рейтинг\n";
	for ($j=0;$j<$MAXQUEST[$r]/12;$j++) {
	    my $max=$j*12+12;
	    if ($max>$MAXQUEST[$r]) {
		$max=$MAXQUEST[$r];
	    }
	    for ($i=$j*12+1;$i<=$max;$i++){
		printf("%3s",$i);
	    }
	    printf "\n";
	    for ($i=1+$j*12;$i<=$max;$i++){
		printf("%3s",$ratings[$i]);
	    }
	    printf "\n";
	}
    } else {
	printf "%5s ", "Р";
	for ($i=$MINQUEST[$r]; $i<=$MAXQUEST[$r];$i++)
	{
	    printf "%3s", $ratings[$i];
	}
	print "\n";
    }
    print "\n";
}

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