4 use List::Util qw(min);
6 @ARGV or die "Usage: mo-score-mop task1 task2 ...";
8 print STDERR "Scanning contestants... ";
9 open (CT, "bin/mo-get-users --full |") || die "Cannot get list of contestants";
13 my ($u, $f) = split /\t/;
18 print STDERR 0+keys %users, "\n";
20 print STDERR "Scanning task results... ";
22 for my $u (keys %users) {
24 my $tt = "testing/$u/$t/points";
26 print STDERR "$u/$t ";
27 open (X, $tt) || die "Unable to open $tt";
31 my ($test, $pts) = /^(\S+) (-?\d+)/ or die "Parse error: $_";
34 if (defined $groups{$group}) {
35 $groups{$group} = min($groups{$group}, $pts);
37 $groups{$group} = $pts;
42 for my $g (keys %groups) {
43 $tasks{$u}{$t} += $groups{$g};
49 print STDERR "Generating output... ";
50 for my $u (sort keys %users) {
51 print join("\t", $u, $users{$u}, map { $tasks{$u}{$_} // '-' } @ARGV), "\n";