September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
80
Task/Ranking-methods/Kotlin/ranking-methods.kotlin
Normal file
80
Task/Ranking-methods/Kotlin/ranking-methods.kotlin
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
// version 1.0.6
|
||||
|
||||
/* all ranking functions assume the array of Pairs is non-empty and already sorted by decreasing order of scores
|
||||
and then, if the scores are equal, by reverse alphabetic order of names
|
||||
*/
|
||||
|
||||
fun standardRanking(scores: Array<Pair<Int, String>>): IntArray {
|
||||
val rankings = IntArray(scores.size)
|
||||
rankings[0] = 1
|
||||
for (i in 1 until scores.size) rankings[i] = if (scores[i].first == scores[i - 1].first) rankings[i - 1] else i + 1
|
||||
return rankings
|
||||
}
|
||||
|
||||
fun modifiedRanking(scores: Array<Pair<Int, String>>): IntArray {
|
||||
val rankings = IntArray(scores.size)
|
||||
rankings[0] = 1
|
||||
for (i in 1 until scores.size) {
|
||||
rankings[i] = i + 1
|
||||
val currScore = scores[i].first
|
||||
for (j in i - 1 downTo 0) {
|
||||
if (currScore != scores[j].first) break
|
||||
rankings[j] = i + 1
|
||||
}
|
||||
}
|
||||
return rankings
|
||||
}
|
||||
|
||||
fun denseRanking(scores: Array<Pair<Int, String>>): IntArray {
|
||||
val rankings = IntArray(scores.size)
|
||||
rankings[0] = 1
|
||||
var prevRanking = 1
|
||||
for (i in 1 until scores.size) rankings[i] = if (scores[i].first == scores[i - 1].first) prevRanking else ++prevRanking
|
||||
return rankings
|
||||
}
|
||||
|
||||
fun ordinalRanking(scores: Array<Pair<Int, String>>) = IntArray(scores.size) { it + 1 }
|
||||
|
||||
fun fractionalRanking(scores: Array<Pair<Int, String>>): DoubleArray {
|
||||
val rankings = DoubleArray(scores.size)
|
||||
rankings[0] = 1.0
|
||||
for (i in 1 until scores.size) {
|
||||
var k = i
|
||||
val currScore = scores[i].first
|
||||
for (j in i - 1 downTo 0) {
|
||||
if (currScore != scores[j].first) break
|
||||
k = j
|
||||
}
|
||||
val avg = (k..i).average() + 1.0
|
||||
for (m in k..i) rankings[m] = avg
|
||||
}
|
||||
return rankings
|
||||
}
|
||||
|
||||
fun printRankings(title: String, rankings: IntArray, scores: Array<Pair<Int, String>>) {
|
||||
println(title + ":")
|
||||
for (i in 0 until rankings.size) {
|
||||
print ("${rankings[i]} ")
|
||||
println(scores[i].toString().removeSurrounding("(", ")").replace(",", ""))
|
||||
}
|
||||
println()
|
||||
}
|
||||
|
||||
fun printFractionalRankings(title: String, rankings: DoubleArray, scores: Array<Pair<Int, String>>) {
|
||||
println(title + ":")
|
||||
for (i in 0 until rankings.size) {
|
||||
print ("${"%3.2f".format(rankings[i])} ")
|
||||
println(scores[i].toString().removeSurrounding("(", ")").replace(",", ""))
|
||||
}
|
||||
println()
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val scores = arrayOf(44 to "Solomon", 42 to "Jason", 42 to "Errol", 41 to "Garry",
|
||||
41 to "Bernard", 41 to "Barry", 39 to "Stephen")
|
||||
printRankings("Standard ranking", standardRanking(scores), scores)
|
||||
printRankings("Modified ranking", modifiedRanking(scores), scores)
|
||||
printRankings("Dense ranking", denseRanking(scores), scores)
|
||||
printRankings("Ordinal ranking", ordinalRanking(scores), scores)
|
||||
printFractionalRankings("Fractional ranking", fractionalRanking(scores), scores)
|
||||
}
|
||||
34
Task/Ranking-methods/Zkl/ranking-methods-1.zkl
Normal file
34
Task/Ranking-methods/Zkl/ranking-methods-1.zkl
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
fcn group(scores){ // group like scores into one list --> list of lists
|
||||
sink:=List();
|
||||
scores.reduce('wrap(ps,sn,buf){
|
||||
if(sn[0]!=ps){ sink.append(buf.copy()); buf.clear(); }
|
||||
buf+sn;
|
||||
sn[0];
|
||||
},scores[0][0],buf:=List());
|
||||
sink.append(buf);
|
||||
}
|
||||
fcn print(list,rank){
|
||||
list.apply2('wrap(sn){ "%2s: %s (%d)".fmt(rank,sn[1],sn[0]):println(_); });
|
||||
}
|
||||
fcn rankViaStandard(scores){
|
||||
rank:=1;
|
||||
foreach group in (group(scores)){ print(group,rank); rank+=group.len(); }
|
||||
}
|
||||
fcn rankViaModified(scores){
|
||||
rank:=0;
|
||||
foreach group in (group(scores)){ rank+=group.len(); print(group,rank); }
|
||||
}
|
||||
fcn rankViaDense(scores){
|
||||
rank:=1;
|
||||
foreach group in (group(scores)){ print(group,rank); rank+=1; }
|
||||
}
|
||||
fcn rankViaOrdinal(scores){
|
||||
scores.apply2('wrap(sn,rr){ "%2s: %s (%d)".fmt(rr.inc(),sn[1],sn[0]):println(_); },Ref(1));
|
||||
}
|
||||
fcn rankViaFractional(scores){
|
||||
rank:=1;
|
||||
foreach group in (group(scores)){
|
||||
n:=group.len(); r:=rank.reduce(n,'+,0.0)/n; rank+=n;
|
||||
print(group,"%5.2f".fmt(r));
|
||||
}
|
||||
}
|
||||
8
Task/Ranking-methods/Zkl/ranking-methods-2.zkl
Normal file
8
Task/Ranking-methods/Zkl/ranking-methods-2.zkl
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
// these are sorted!?!
|
||||
scores:=T(T(44,"Solomon"), T(42,"Jason"), T(42,"Errol"), T(41,"Garry"),
|
||||
T(41,"Bernard"),T(41,"Barry"),T(39,"Stephen"),);
|
||||
"Standard:" .println(); rankViaStandard(scores);
|
||||
"Modified:" .println(); rankViaModified(scores);
|
||||
"Dense:" .println(); rankViaDense(scores);
|
||||
"Ordinal:" .println(); rankViaOrdinal(scores);
|
||||
"Fractional:".println(); rankViaFractional(scores);
|
||||
Loading…
Add table
Add a link
Reference in a new issue