# ------------------------------------------------------------
# FUNCTION: get_ranks
# ------------------------------------------------------------
# Computes competition-style ranks for a list 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
#
# Steps:
# 1. Create a sorted copy (descending)
# 2. Assign ranks to each unique value
# 3. Build a rank list matching the original order
# ------------------------------------------------------------
def get_ranks(arr)
# Step 1: Create a sorted copy (descending)
sorted = arr.sort.reverse
# Step 2: Map each unique value to its rank
rank_map = {}
rank = 1
sorted.each do |value|
# Assign rank only once per unique value
rank_map[value] ||= rank
rank += 1
end
# Step 3: Build ranking list in original order
arr.map { |value| rank_map[value] }
end
# ------------------------------------------------------------
# FUNCTION: print_ranking
# ------------------------------------------------------------
# Prints the original array and its ranking.
# ------------------------------------------------------------
def print_ranking(arr, ranks)
puts "Original array: [ #{arr.join(' ')} ]"
puts "Ranking array : [ #{ranks.join(' ')} ]"
end
# MAIN PROGRAM
# ------------------------------------------------------------
arr = [88, 4, 19, 4, 1, 31, 14, 1, 93, 17]
# Compute ranks
ranking_arr = get_ranks(arr)
print_ranking(arr, ranking_arr)
=begin
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 ]
=end