import Foundation
/*
FUNCTION: getRanks
-------------------
Computes competition-style ranks for an array 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 array matching the original order
*/
func getRanks(_ arr: [Int]) -> [Int] {
// Step 1: Create a sorted copy (descending)
let sorted = arr.sorted(by: >)
// Step 2: Map each unique value to its rank
var rankMap: [Int: Int] = [:]
var rank = 1
for value in sorted {
// Assign rank only once per unique value
if rankMap[value] == nil {
rankMap[value] = rank
}
rank += 1 // next rank position
}
// Step 3: Build ranking array in original order
return arr.map { rankMap[$0]! }
}
/*
FUNCTION: printRanking
-----------------------
Prints the original array and its ranking.
*/
func printRanking(_ arr: [Int], _ ranks: [Int]) {
print("Original array: [ \(arr.map(String.init).joined(separator: " ")) ]")
print("Ranking array : [ \(ranks.map(String.init).joined(separator: " ")) ]")
}
// MAIN PROGRAM
// ---------------------------------------------
let arr = [88, 4, 19, 4, 1, 31, 14, 1, 93, 17]
// Compute ranks
let rankingArr = getRanks(arr)
printRanking(arr, rankingArr)
/*
run:
Original array: [ 88 4 19 4 1 31 14 1 93 17 ]
Ranking array : [ 2 7 4 7 9 3 6 9 1 5 ]
*/