]>
iEval git - gruntmaster-page.git/blob - lib/Gruntmaster/Page/St.pm
1 package Gruntmaster
::Page
::St
;
3 use Gruntmaster
::Page
::Base st
=> 'Standings';
5 use constant LEVEL_VALUES
=> {
13 my ($mxscore, $time, $tries, $totaltime) = @_;
15 $time = 0 if $time < 0;
16 $time = 300 if $time > $totaltime;
17 $score = ($totaltime - $time) / $totaltime * $score;
18 $score -= $tries / 10 * $mxscore;
19 $score = $mxscore * 3 / 10 if $score < $mxscore * 3 / 10;
24 my ($self, $htc, $lang, $env) = @_;
25 #debug $env => "language is '$lang'";
27 my $ct = $env->{'gruntmaster.contest'} && db
($env)->contest($env->{'gruntmaster.contest'});
29 my @problems = map { $_->problem } db
($env)->contest_problems->search({contest
=> $ct && $ct->id}, {qw
/join problem order_by problem.level/});
31 for my $job (db
($env)->jobs->search({contest
=> $ct && $ct->id})) {
34 my $time = $job->date - $ct->start;
36 my $value = $job->problem->value // LEVEL_VALUES
->{$job->problem->level};
37 $scores{$job->owner->id}{$job->problem->id} = $job->result ?
0 : calc_score
($value, $time, $tries{$job->owner}{$job->problem}, $ct->stop - $ct->start);
38 $tries{$job->owner->id}{$job->problem->id}++;
40 no warnings
'numeric';
41 $scores{$job->owner->id}{$job->problem->id} = 0 + $job->result_text || ($job->result ?
0 : 100)
45 my @st = sort { $b->{score
} <=> $a->{score
} or $a->{user
}->id cmp $b->{user
}->id} map {
48 user
=> db
($env)->user($user),
49 score
=> sum
(values $scores{$user}),
50 scores
=> [map { $scores{$user}{$_->id} // '-'} @problems],
56 $st[$_]->{rank
} = $st[$_ - 1]->{rank
} + ($st[$_]->{score
} < $st[$_ - 1]->{score
}) for 1 .. $#st;
57 $htc->param(problems
=> \
@problems) if $ct;
58 $htc->param(st
=> \
@st);
This page took 0.058734 seconds and 4 git commands to generate.