Ranking methods: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
(Add Factor)
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 463:
7.0 39 Stephen
</pre>
 
=={{header|C sharp|C#}}==
{{trans|D}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;
 
namespace RankingMethods {
class Program {
static void Main(string[] args) {
Dictionary<string, int> scores = new Dictionary<string, int> {
["Solomon"] = 44,
["Jason"] = 42,
["Errol"] = 42,
["Gary"] = 41,
["Bernard"] = 41,
["Barry"] = 41,
["Stephen"] = 39,
};
 
StandardRank(scores);
ModifiedRank(scores);
DenseRank(scores);
OrdinalRank(scores);
FractionalRank(scores);
}
 
static void StandardRank(Dictionary<string, int> data) {
Console.WriteLine("Standard Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
int temp = rank;
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", temp, value, k);
rank++;
}
}
}
 
Console.WriteLine();
}
 
static void ModifiedRank(Dictionary<string, int> data) {
Console.WriteLine("Modified Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 0;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
rank++;
}
}
 
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
}
}
}
 
Console.WriteLine();
}
 
static void DenseRank(Dictionary<string, int> data) {
Console.WriteLine("Dense Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
}
}
rank++;
}
 
Console.WriteLine();
}
 
static void OrdinalRank(Dictionary<string, int> data) {
Console.WriteLine("Ordinal Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
rank++;
}
}
}
 
Console.WriteLine();
}
 
static void FractionalRank(Dictionary<string, int> data) {
Console.WriteLine("Fractional Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 0;
foreach (var value in list) {
double avg = 0;
int cnt = 0;
 
foreach (var k in data.Keys) {
if (data[k] == value) {
rank++;
cnt++;
avg += rank;
}
}
avg /= cnt;
 
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0:F1} {1} {2}", avg, data[k], k);
}
}
}
 
Console.WriteLine();
}
}
}</lang>
{{out}}
<pre>Standard Rank
1 44 Solomon
2 42 Jason
2 42 Errol
4 41 Gary
4 41 Bernard
4 41 Barry
7 39 Stephen
 
Modified Rank
1 44 Solomon
3 42 Jason
3 42 Errol
6 41 Gary
6 41 Bernard
6 41 Barry
7 39 Stephen
 
Dense Rank
1 44 Solomon
2 42 Jason
2 42 Errol
3 41 Gary
3 41 Bernard
3 41 Barry
4 39 Stephen
 
Ordinal Rank
1 44 Solomon
2 42 Jason
3 42 Errol
4 41 Gary
5 41 Bernard
6 41 Barry
7 39 Stephen
 
Fractional Rank
1.0 44 Solomon
2.5 42 Jason
2.5 42 Errol
5.0 41 Gary
5.0 41 Bernard
5.0 41 Barry
7.0 39 Stephen</pre>
 
=={{header|C++}}==
Line 686 ⟶ 871:
5.0 41 Bernard
5.0 41 Gary
7.0 39 Stephen</pre>
 
=={{header|C#|C sharp}}==
{{trans|D}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;
 
namespace RankingMethods {
class Program {
static void Main(string[] args) {
Dictionary<string, int> scores = new Dictionary<string, int> {
["Solomon"] = 44,
["Jason"] = 42,
["Errol"] = 42,
["Gary"] = 41,
["Bernard"] = 41,
["Barry"] = 41,
["Stephen"] = 39,
};
 
StandardRank(scores);
ModifiedRank(scores);
DenseRank(scores);
OrdinalRank(scores);
FractionalRank(scores);
}
 
static void StandardRank(Dictionary<string, int> data) {
Console.WriteLine("Standard Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
int temp = rank;
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", temp, value, k);
rank++;
}
}
}
 
Console.WriteLine();
}
 
static void ModifiedRank(Dictionary<string, int> data) {
Console.WriteLine("Modified Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 0;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
rank++;
}
}
 
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
}
}
}
 
Console.WriteLine();
}
 
static void DenseRank(Dictionary<string, int> data) {
Console.WriteLine("Dense Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
}
}
rank++;
}
 
Console.WriteLine();
}
 
static void OrdinalRank(Dictionary<string, int> data) {
Console.WriteLine("Ordinal Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 1;
foreach (var value in list) {
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0} {1} {2}", rank, data[k], k);
rank++;
}
}
}
 
Console.WriteLine();
}
 
static void FractionalRank(Dictionary<string, int> data) {
Console.WriteLine("Fractional Rank");
 
var list = data.Values.Distinct().ToList();
list.Sort((a, b) => b.CompareTo(a));
 
int rank = 0;
foreach (var value in list) {
double avg = 0;
int cnt = 0;
 
foreach (var k in data.Keys) {
if (data[k] == value) {
rank++;
cnt++;
avg += rank;
}
}
avg /= cnt;
 
foreach (var k in data.Keys) {
if (data[k] == value) {
Console.WriteLine("{0:F1} {1} {2}", avg, data[k], k);
}
}
}
 
Console.WriteLine();
}
}
}</lang>
{{out}}
<pre>Standard Rank
1 44 Solomon
2 42 Jason
2 42 Errol
4 41 Gary
4 41 Bernard
4 41 Barry
7 39 Stephen
 
Modified Rank
1 44 Solomon
3 42 Jason
3 42 Errol
6 41 Gary
6 41 Bernard
6 41 Barry
7 39 Stephen
 
Dense Rank
1 44 Solomon
2 42 Jason
2 42 Errol
3 41 Gary
3 41 Bernard
3 41 Barry
4 39 Stephen
 
Ordinal Rank
1 44 Solomon
2 42 Jason
3 42 Errol
4 41 Gary
5 41 Bernard
6 41 Barry
7 39 Stephen
 
Fractional Rank
1.0 44 Solomon
2.5 42 Jason
2.5 42 Errol
5.0 41 Gary
5.0 41 Bernard
5.0 41 Barry
7.0 39 Stephen</pre>
 
Line 1,750:
5,0 41 Barry
7,0 39 Stephen</pre>
 
 
=={{header|JavaScript}}==
Line 2,685 ⟶ 2,684:
5.0 Barry, Bernard, Garry
7.0 Stephen</pre>
 
=={{header|Perl 6}}==
<lang perl6>my @scores =
Solomon => 44,
Jason => 42,
Errol => 42,
Garry => 41,
Bernard => 41,
Barry => 41,
Stephen => 39;
 
sub tiers (@s) { @s.classify(*.value).pairs.sort.reverse.map: { .value».key } }
 
sub standard (@s) {
my $rank = 1;
gather for tiers @s -> @players {
take $rank => @players;
$rank += @players;
}
}
 
sub modified (@s) {
my $rank = 0;
gather for tiers @s -> @players {
$rank += @players;
take $rank => @players;
}
}
 
sub dense (@s) { tiers(@s).map: { ++$_ => @^players } }
 
sub ordinal (@s) { @s.map: ++$_ => *.key }
 
sub fractional (@s) {
my $rank = 1;
gather for tiers @s -> @players {
my $beg = $rank;
my $end = $rank += @players;
take [+]($beg ..^ $end) / @players => @players;
}
}
 
say "Standard:"; .perl.say for standard @scores;
say "\nModified:"; .perl.say for modified @scores;
say "\nDense:"; .perl.say for dense @scores;
say "\nOrdinal:"; .perl.say for ordinal @scores;
say "\nFractional:"; .perl.say for fractional @scores;</lang>
{{out}}
<pre>Standard:
1 => ["Solomon"]
2 => ["Jason", "Errol"]
4 => ["Garry", "Bernard", "Barry"]
7 => ["Stephen"]
 
Modified:
1 => ["Solomon"]
3 => ["Jason", "Errol"]
6 => ["Garry", "Bernard", "Barry"]
7 => ["Stephen"]
 
Dense:
1 => ["Solomon"]
2 => ["Jason", "Errol"]
3 => ["Garry", "Bernard", "Barry"]
4 => ["Stephen"]
 
Ordinal:
1 => "Solomon"
2 => "Jason"
3 => "Errol"
4 => "Garry"
5 => "Bernard"
6 => "Barry"
7 => "Stephen"
 
Fractional:
1.0 => ["Solomon"]
2.5 => ["Jason", "Errol"]
5.0 => ["Garry", "Bernard", "Barry"]
7.0 => ["Stephen"]</pre>
 
=={{header|Phix}}==
Line 3,313 ⟶ 3,232:
= 5 41 Barry
7 39 Stephen</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
<lang perl6>my @scores =
Solomon => 44,
Jason => 42,
Errol => 42,
Garry => 41,
Bernard => 41,
Barry => 41,
Stephen => 39;
 
sub tiers (@s) { @s.classify(*.value).pairs.sort.reverse.map: { .value».key } }
 
sub standard (@s) {
my $rank = 1;
gather for tiers @s -> @players {
take $rank => @players;
$rank += @players;
}
}
 
sub modified (@s) {
my $rank = 0;
gather for tiers @s -> @players {
$rank += @players;
take $rank => @players;
}
}
 
sub dense (@s) { tiers(@s).map: { ++$_ => @^players } }
 
sub ordinal (@s) { @s.map: ++$_ => *.key }
 
sub fractional (@s) {
my $rank = 1;
gather for tiers @s -> @players {
my $beg = $rank;
my $end = $rank += @players;
take [+]($beg ..^ $end) / @players => @players;
}
}
 
say "Standard:"; .perl.say for standard @scores;
say "\nModified:"; .perl.say for modified @scores;
say "\nDense:"; .perl.say for dense @scores;
say "\nOrdinal:"; .perl.say for ordinal @scores;
say "\nFractional:"; .perl.say for fractional @scores;</lang>
{{out}}
<pre>Standard:
1 => ["Solomon"]
2 => ["Jason", "Errol"]
4 => ["Garry", "Bernard", "Barry"]
7 => ["Stephen"]
 
Modified:
1 => ["Solomon"]
3 => ["Jason", "Errol"]
6 => ["Garry", "Bernard", "Barry"]
7 => ["Stephen"]
 
Dense:
1 => ["Solomon"]
2 => ["Jason", "Errol"]
3 => ["Garry", "Bernard", "Barry"]
4 => ["Stephen"]
 
Ordinal:
1 => "Solomon"
2 => "Jason"
3 => "Errol"
4 => "Garry"
5 => "Bernard"
6 => "Barry"
7 => "Stephen"
 
Fractional:
1.0 => ["Solomon"]
2.5 => ["Jason", "Errol"]
5.0 => ["Garry", "Bernard", "Barry"]
7.0 => ["Stephen"]</pre>
 
=={{header|REXX}}==
10,333

edits