From: nobu@... Date: 2014-05-06T14:40:35+00:00 Subject: [ruby-core:62424] [ruby-trunk - Feature #9808] [Feedback] Enumerable#argmin_by, #argmax_by Issue #9808 has been updated by Nobuyoshi Nakada. Description updated Status changed from Open to Feedback Could you explain what it does? ---------------------------------------- Feature #9808: Enumerable#argmin_by, #argmax_by https://bugs.ruby-lang.org/issues/9808#change-46573 * Author: Ilya Vorontsov * Status: Feedback * Priority: Normal * Assignee: * Category: * Target version: ---------------------------------------- What about introducing `Enumerable` `#argmin_by` (and `#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` isn't enough because one need to obtain index of minimal element I suggest `#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)`: ~~~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} ~~~ -- https://bugs.ruby-lang.org/