Выберите объект, который имеет минимальное преобразование Шварца из коллекции - PullRequest
1 голос
/ 25 октября 2011

Я использую A * для http://aichallenge.org/specification.php, и мне был интересен хитрый способ выбора минимума коллекции на основе преобразования Шарца.

По сути, у меня есть набор подходящих квадратов для перехода, и я хочу перейти на квадрат с наименьшей стоимостью.

В основном я буду выбирать квадрат из моих соседей, у которых самая низкая стоимость в цикле.

Единственный способ, которым я могу думать, это сделать что-то вроде

next_spot = spot.neighbors.sort_by |a,b| { a.cost(dest) <=> b.cost(dest) }.first

Но мне бы очень хотелось чего-то более высокого, потому что я не хочу сортировать коллекцию, я просто хочу тот, у которого минимальное значение преобразования

Заметьте, я мог бы написать что-то более подробное и цикличное "в стиле C" и отслеживать предыдущий минимум, но я надеялся на что-то ясное и компактное.

1 Ответ

2 голосов
/ 25 октября 2011

Почему бы не использовать min_by?

next_spot = spot.neighbors.min_by { |x| x.cost(dest) }

И если не существует "_by" версии метода Enumerable-ish, вы можете получить старую школу и выполнить преобразование Шварца вручную с помощью этого типа псевдо-Ruby-шаблона:

a.map { |x| [ expensive(x), x ] }.       # Do the expensive part once and cache it
  op  { |x| something_with x.first... }. # Do what you really came to do
  map { |x| x.last }                     # Unwrap the caching
...