/*
How to rank elements of an integer array based on their sorted order in Kotlin
------------------------------------------------------------------------------
Ranking rules:
- Lowest value gets rank 1
- Equal values share the same rank
- Rank increases only when encountering a new unique value
Steps:
1. Print the original array
2. Create a copy of the array
3. Sort the copy
4. Build a map (value → rank)
5. Apply ranks back to the original order
*/
// ------------------------------------------------------------
// Function 1: Print the array
// ------------------------------------------------------------
fun printArray(arr: IntArray) {
println("Array: ${arr.contentToString()}")
}
// ------------------------------------------------------------
// Function 2: Create a copy of the array
// ------------------------------------------------------------
fun copyArray(arr: IntArray): IntArray {
return arr.copyOf()
}
// ------------------------------------------------------------
// Function 3: Sort the array copy
// ------------------------------------------------------------
fun sortArray(arrCopy: IntArray) {
arrCopy.sort()
}
// ------------------------------------------------------------
// Function 4: Build a map of value → rank
// ------------------------------------------------------------
fun buildRankMap(sortedArr: IntArray): Map<Int, Int> {
val map = mutableMapOf<Int, Int>()
var rank = 1
var previous = sortedArr[0]
map[previous] = rank
for (i in 1 until sortedArr.size) {
val current = sortedArr[i]
if (current != previous) {
rank++
}
map[current] = rank
previous = current
}
return map
}
// ------------------------------------------------------------
// Function 5: Apply ranks to original array order
// ------------------------------------------------------------
fun applyRanks(original: IntArray, rankMap: Map<Int, Int>): IntArray {
val ranked = IntArray(original.size)
for (i in original.indices) {
ranked[i] = rankMap[original[i]]!!
}
return ranked
}
// ------------------------------------------------------------
// Main ranking function
// ------------------------------------------------------------
fun rankArray(arr: IntArray) {
printArray(arr)
if (arr.isEmpty()) return
val arrCopy = copyArray(arr)
sortArray(arrCopy)
val rankMap = buildRankMap(arrCopy)
val ranked = applyRanks(arr, rankMap)
println("Rank: ${ranked.contentToString()}")
}
// ------------------------------------------------------------
// MAIN FUNCTION
// ------------------------------------------------------------
fun main() {
val arr = intArrayOf(33, 99, 10, 25, 47, 11, 77)
rankArray(arr)
}
/*
run:
Array: [33, 99, 10, 25, 47, 11, 77]
Rank: [4, 7, 1, 3, 5, 2, 6]
*/