How to rank elements of an array in Swift

1 Answer

0 votes
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 ]

*/

 



answered 2 days ago by avibootz
...