Ranking methods
var scores = [
Pair(Solomon => 44),
Pair(Jason => 42),
Pair(Errol => 42),
Pair(Garry => 41),
Pair(Bernard => 41),
Pair(Barry => 41),
Pair(Stephen => 39),
]
Â
func tiers(s) {
s.group_by { .value }.kv.sort.flip.map { .value.map{.key} }
}
Â
func standard(s) {
var rank = 1
gather {
for players in tiers(s) {
take(Pair(rank, players))
rank += players.len
}
}
}
Â
func modified(s) {
var rank = 0
gather {
for players in tiers(s) {
rank += players.len
take(Pair(rank, players))
}
}
}
Â
func dense(s) {
tiers(s).map_kv { |k,v| Pair(k+1, v) }
}
Â
func ordinal(s) {
s.map_kv { |k,v| Pair(k+1, v.key) }
}
Â
func fractional(s) {
var rank = 1
gather {
for players in tiers(s) {
var beg = rank
var end = (rank += players.len)
take(Pair(sum(beg ..^ end) / players.len, players))
}
}
}
Â
func display(r) {
say r.map {|a| '%3s : %s' % a... }.join("\n")
}
Â
say "Standard:"; display( standard(scores))
say "\nModified:"; display( modified(scores))
say "\nDense:"; display( dense(scores))
say "\nOrdinal:"; display( ordinal(scores))
say "\nFractional:"; display(fractional(scores))
Output:
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Â : ["Solomon"]
2.5Â : ["Jason", "Errol"]
5Â : ["Garry", "Bernard", "Barry"]
7Â : ["Stephen"]
Last updated
Was this helpful?