- for (1 .. jobcard) {
- if ($Gruntmaster::Data::contest) {
- $scores{job_user()}{job_problem()} = job_result() ? 0 : calc_score (job_user(), job_problem(), job_date(), $tries{job_user()}{job_problem()}++, $totaltime) if job_date() > $start;
- } elsif (defined job_user && defined job_problem && defined job_result) {
- if (defined job_result_text && job_result_text =~ m/^(\scores+)/) {
- $scores{job_user()}{job_problem()} = $ct;
- } else {
- $scores{job_user()}{job_problem()} = job_result() ? 0 : 100;
- }
+ for my $job (db($env)->jobs->search({contest => $ct && $ct->id}, {order_by => 'id'})) {
+
+ if ($ct) {
+ my $open = db($env)->opens->find($ct->id, $job->problem->id, $job->owner->id);
+ my $time = $job->date - ($open ? $open->time : $ct->start);
+ next if $time < 0;
+ my $value = $job->problem->value // LEVEL_VALUES->{$job->problem->level};
+ my $factor = $job->result ? 0 : 1;
+ $factor = $1 / 100 if $job->result_text =~ /(\d+)/;
+ $scores{$job->owner->id}{$job->problem->id} = int ($factor * calc_score ($value, $time, $tries{$job->owner->id}{$job->problem->id}, $ct->stop - $ct->start));
+ $tries{$job->owner->id}{$job->problem->id}++;
+ } else {
+ no warnings 'numeric';
+ $scores{$job->owner->id}{$job->problem->id} = 0 + $job->result_text || ($job->result ? 0 : 100)