Project

General

Profile

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} 
 ~~~

Back