import scala.collection.mutable
/*
FUNCTION: getRanks
-------------------
Computes competition-style ranks for a sequence of numbers.
Ranking rules (Competition Ranking):
------------------------------------
- Highest value gets rank 1
- Equal values share the same rank
- Next rank increases by the number of equal values
Example:
Values: 88, 4, 19, 4, 1, 31, 14, 1, 93, 17
Ranks: 2, 7, 4, 7, 9, 3, 6, 9, 1, 5
Steps:
1. Create a sorted copy (descending)
2. Assign ranks to each unique value
3. Build a rank list matching the original order
*/
object CompetitionRanking {
// FUNCTION: getRanks
def getRanks(seq: Seq[Int]): Seq[Int] = {
// Step 1: Create a sorted copy (descending)
val sorted = seq.sorted(using Ordering[Int].reverse)
// Step 2: Map each unique value to its rank
val rankMap = mutable.Map[Int, Int]()
var rank = 1
for (value <- sorted) {
// Assign rank only once per unique value
if (!rankMap.contains(value)) {
rankMap(value) = rank
}
rank += 1 // next rank position
}
// Step 3: Build ranking list in original order
seq.map(value => rankMap(value))
}
// FUNCTION: printRanking
def printRanking(seq: Seq[Int], ranks: Seq[Int]): Unit = {
println(s"Original seq: [ ${seq.mkString(" ")} ]")
println(s"Ranking seq : [ ${ranks.mkString(" ")} ]")
}
// MAIN PROGRAM
def main(args: Array[String]): Unit = {
val seq = Seq(88, 4, 19, 4, 1, 31, 14, 1, 93, 17)
// Compute ranks
val rankingSeq = getRanks(seq)
printRanking(seq, rankingSeq)
}
}
/*
run:
Original seq: [ 88 4 19 4 1 31 14 1 93 17 ]
Ranking seq : [ 2 7 4 7 9 3 6 9 1 5 ]
*/