RosettaCodeData/Task/Ranking-methods/Perl/ranking-methods.pl

69 lines
1.6 KiB
Raku

my %scores = (
'Solomon' => 44,
'Jason' => 42,
'Errol' => 42,
'Garry' => 41,
'Bernard' => 41,
'Barry' => 41,
'Stephen' => 39
);
sub tiers {
my(%s) = @_; my(%h);
push @{$h{$s{$_}}}, $_ for keys %s;
@{\%h}{reverse sort keys %h};
}
sub standard {
my(%s) = @_; my($result);
my $rank = 1;
for my $players (tiers %s) {
$result .= "$rank " . join(', ', sort @$players) . "\n";
$rank += @$players;
}
return $result;
}
sub modified {
my(%s) = @_; my($result);
my $rank = 0;
for my $players (tiers %s) {
$rank += @$players;
$result .= "$rank " . join(', ', sort @$players) . "\n";
}
return $result;
}
sub dense {
my(%s) = @_; my($n,$result);
$result .= sprintf "%d %s\n", ++$n, join(', ', sort @$_) for tiers %s;
return $result;
}
sub ordinal {
my(%s) = @_; my($n,$result);
for my $players (tiers %s) {
$result .= sprintf "%d %s\n", ++$n, $_ for sort @$players;
}
return $result;
}
sub fractional {
my(%s) = @_; my($result);
my $rank = 1;
for my $players (tiers %s) {
my $beg = $rank;
my $end = $rank += @$players;
my $avg = 0;
$avg += $_/@$players for $beg .. $end-1;
$result .= sprintf "%3.1f %s\n", $avg, join ', ', sort @$players;
}
return $result;
}
print "Standard:\n" . standard(%scores) . "\n";
print "Modified:\n" . modified(%scores) . "\n";
print "Dense:\n" . dense(%scores) . "\n";
print "Ordinal:\n" . ordinal(%scores) . "\n";
print "Fractional:\n" . fractional(%scores) . "\n";