#
# How to rank elements of an integer array based on their sorted order in Ruby
# ----------------------------------------------------------------------------
#
# Ranking rules:
# - Lowest value gets rank 1
# - Equal values share the same rank
# - Rank increases only when encountering a new unique value
#
# ------------------------------------------------------------
# Function 1: Print the array
# ------------------------------------------------------------
def print_array(arr)
puts "Array: #{arr.inspect}"
end
# ------------------------------------------------------------
# Function 2: Create a copy of the array
# ------------------------------------------------------------
def copy_array(arr)
arr.clone
end
# ------------------------------------------------------------
# Function 3: Sort the array copy
# ------------------------------------------------------------
def sort_array(arr_copy)
arr_copy.sort!
end
# ------------------------------------------------------------
# Function 4: Build a map of value → rank
# ------------------------------------------------------------
def build_rank_map(sorted_arr)
rank_map = {}
return rank_map if sorted_arr.empty?
rank = 1
previous = sorted_arr[0]
rank_map[previous] = rank
(1...sorted_arr.length).each do |i|
current = sorted_arr[i]
if current != previous
rank += 1
end
rank_map[current] = rank
previous = current
end
rank_map
end
# ------------------------------------------------------------
# Function 5: Apply ranks to original array order
# ------------------------------------------------------------
def apply_ranks(original, rank_map)
original.map { |value| rank_map[value] }
end
# ------------------------------------------------------------
# Main ranking function
# ------------------------------------------------------------
def rank_array(arr)
print_array(arr)
return if arr.empty?
arr_copy = copy_array(arr)
sort_array(arr_copy)
rank_map = build_rank_map(arr_copy)
ranked = apply_ranks(arr, rank_map)
puts "Rank: #{ranked.inspect}"
end
# ------------------------------------------------------------
# MAIN PROGRAM
# ------------------------------------------------------------
arr = [33, 99, 10, 25, 47, 11, 77]
rank_array(arr)
=begin
run:
Array: [33, 99, 10, 25, 47, 11, 77]
Rank: [4, 7, 1, 3, 5, 2, 6]
=end