How to rank elements of an array in Ruby

1 Answer

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

 



answered 2 days ago by avibootz
...