Feature #9808
Updated by nobu (Nobuyoshi Nakada) almost 10 years ago
What about introducing `Enumerable` `#argmin_by` Enumerable #argmin_by (and `#argmax_by` #argmax_by too, of course) method? Use cases are wide from mathematical problems to a general tasks. Here are two very simple examples: ~~~ruby (1..2).step(0.01).argmin_by{|x| Math.sin(x)*x} queues = [[],[],[],[]] # ... least_busy_queue = queues.argmin_by{|queue| queues.size } least_busy_queue << new_task ~~~ For cases when `#argmin_by` #argmin_by isn't enough because one need to obtain index of minimal element I suggest `#index_min_by` #index_min_by method which returns index of element for which block yields minimal value. It prevents user from using ineffective but straight two-pass algorithm like `arr.index(arr.min)`: arr.index(arr.min): ~~~ruby # guess the number game hidden_number = rand(100) player_answers = 5.times.map{ gets.to_i } best_player = player_answers.index_min_by{|answer| (answer-hidden_number).abs} ~~~