use std::collections::HashMap;
/*
FUNCTION: get_ranks
-------------------
This function takes a vector of numbers and returns a vector of ranks.
Ranking rules used (Competition Ranking):
-----------------------------------------
- Highest value gets rank 1
- Equal values get 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. Make a sorted copy of the vector (descending)
2. Assign ranks to each unique value
3. Build a rank vector matching the original order
*/
fn get_ranks(vec: &Vec<i32>) -> Vec<i32> {
// Step 1: Create a sorted copy (descending)
let mut sorted = vec.clone();
sorted.sort_by(|a, b| b.cmp(a)); // descending order
// Step 2: Map each unique value to its rank
let mut rank_map: HashMap<i32, i32> = HashMap::new();
let mut rank = 1;
for value in sorted {
// Assign rank only once per unique value
rank_map.entry(value).or_insert(rank);
rank += 1; // next rank position
}
// Step 3: Build ranking vector in original order
vec.iter().map(|v| rank_map[v]).collect()
}
/*
FUNCTION: print_ranking
-----------------------
Prints the original vector and its ranking.
*/
fn print_ranking(vec: &Vec<i32>, ranks: &Vec<i32>) {
print!("Original vec: [ ");
for v in vec {
print!("{} ", v);
}
println!("]");
print!("Ranking vec : [ ");
for r in ranks {
print!("{} ", r);
}
println!("]");
}
// MAIN PROGRAM
// ---------------------------------------------
fn main() {
let vec = vec![88, 4, 19, 4, 1, 31, 14, 1, 93, 17];
// Compute ranks
let ranking_vec = get_ranks(&vec);
print_ranking(&vec, &ranking_vec);
}
/*
run:
Original vec: [ 88 4 19 4 1 31 14 1 93 17 ]
Ranking vec : [ 2 7 4 7 9 3 6 9 1 5 ]
*/