168 lines
2.8 KiB
D
168 lines
2.8 KiB
D
import std.algorithm;
|
|
import std.stdio;
|
|
|
|
void main() {
|
|
immutable scores = [
|
|
"Solomon": 44,
|
|
"Jason": 42,
|
|
"Errol": 42,
|
|
"Garry": 41,
|
|
"Bernard": 41,
|
|
"Barry": 41,
|
|
"Stephen": 39
|
|
];
|
|
|
|
scores.standardRank;
|
|
scores.modifiedRank;
|
|
scores.denseRank;
|
|
scores.ordinalRank;
|
|
scores.fractionalRank;
|
|
}
|
|
|
|
/*
|
|
Standard ranking
|
|
1 44 Solomon
|
|
2 42 Jason
|
|
2 42 Errol
|
|
4 41 Garry
|
|
4 41 Bernard
|
|
4 41 Barry
|
|
7 39 Stephen
|
|
*/
|
|
void standardRank(const int[string] data) {
|
|
writeln("Standard Rank");
|
|
|
|
int rank = 1;
|
|
foreach (value; data.values.dup.sort!"a>b".uniq) {
|
|
int temp = rank;
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
writeln(temp, " ", v, " ", k);
|
|
rank++;
|
|
}
|
|
}
|
|
}
|
|
|
|
writeln;
|
|
}
|
|
|
|
/*
|
|
Modified ranking
|
|
1 44 Solomon
|
|
3 42 Jason
|
|
3 42 Errol
|
|
6 41 Garry
|
|
6 41 Bernard
|
|
6 41 Barry
|
|
7 39 Stephen
|
|
*/
|
|
void modifiedRank(const int[string] data) {
|
|
writeln("Modified Rank");
|
|
|
|
int rank = 0;
|
|
foreach (value; data.values.dup.sort!"a>b".uniq) {
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
rank++;
|
|
}
|
|
}
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
writeln(rank, " ", v, " ", k);
|
|
}
|
|
}
|
|
}
|
|
|
|
writeln;
|
|
}
|
|
|
|
/*
|
|
Dense ranking
|
|
1 44 Solomon
|
|
2 42 Jason
|
|
2 42 Errol
|
|
3 41 Garry
|
|
3 41 Bernard
|
|
3 41 Barry
|
|
4 39 Stephen
|
|
*/
|
|
void denseRank(const int[string] data) {
|
|
writeln("Dense Rank");
|
|
|
|
int rank = 1;
|
|
foreach (value; data.values.dup.sort!"a>b".uniq) {
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
writeln(rank, " ", v, " ", k);
|
|
}
|
|
}
|
|
rank++;
|
|
}
|
|
|
|
writeln;
|
|
}
|
|
|
|
/*
|
|
Ordinal ranking
|
|
1 44 Solomon
|
|
2 42 Jason
|
|
3 42 Errol
|
|
4 41 Garry
|
|
5 41 Bernard
|
|
6 41 Barry
|
|
7 39 Stephen
|
|
*/
|
|
void ordinalRank(const int[string] data) {
|
|
writeln("Ordinal Rank");
|
|
|
|
int rank = 1;
|
|
foreach (value; data.values.dup.sort!"a>b".uniq) {
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
writeln(rank, " ", v, " ", k);
|
|
rank++;
|
|
}
|
|
}
|
|
}
|
|
|
|
writeln;
|
|
}
|
|
|
|
/*
|
|
Fractional ranking
|
|
1,0 44 Solomon
|
|
2,5 42 Jason
|
|
2,5 42 Errol
|
|
5,0 41 Garry
|
|
5,0 41 Bernard
|
|
5,0 41 Barry
|
|
7,0 39 Stephen
|
|
*/
|
|
void fractionalRank(const int[string] data) {
|
|
writeln("Fractional Rank");
|
|
|
|
int rank = 0;
|
|
foreach (value; data.values.dup.sort!"a>b".uniq) {
|
|
real avg = 0;
|
|
int cnt;
|
|
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
rank++;
|
|
cnt++;
|
|
avg+=rank;
|
|
}
|
|
}
|
|
avg /= cnt;
|
|
|
|
foreach(k,v; data) {
|
|
if (v==value) {
|
|
writef("%0.1f ", avg);
|
|
writeln(v, " ", k);
|
|
}
|
|
}
|
|
}
|
|
|
|
writeln;
|
|
}
|