How to rank elements of an integer array based on their sorted order in Ruby

1 Answer

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

 



answered 1 day ago by avibootz

Related questions

...