# Finds the distinct second-biggest number in an array of numbers.
#
# @param numbers [Array<Numeric>] An array of integers or floats
# @return [Numeric] The second-biggest unique number
# @raise [ArgumentError] If the array has fewer than 2 unique elements
def find_second_biggest(numbers)
# Guard clause: ensure the input is an array and has at least 2 elements
raise ArgumentError, "Input must be an array with at least 2 elements." unless numbers.is_a?(Array) && numbers.length >= 2
# Remove duplicates to ensure we find a strictly smaller "second biggest" value,
# then sort in ascending order.
unique_sorted = numbers.uniq.sort
# Check if we have at least 2 unique values (e.g., [5, 5, 5] has only 1 unique value)
if unique_sorted.length < 2
raise ArgumentError, "Collection must contain at least two unique numbers."
end
# The second biggest number is the second-to-last element in the sorted unique array
unique_sorted[-2]
end
# --- Example Usage ---
begin
# Generate a set of random numbers (including duplicates)
random_numbers = [42, 12, 89, 42, 99, 55, 88, 7, 80]
puts "Original numbers: #{random_numbers.inspect}"
second_max = find_second_biggest(random_numbers)
puts "The second biggest unique number is: #{second_max}"
rescue ArgumentError => e
puts "Error: #{e.message}"
end
# run:
#
# Original numbers: [42, 12, 89, 42, 99, 55, 88, 7, 80]
# The second biggest unique number is: 89
#