2011-10-25 1 views
1

http://aichallenge.org/specification.phpのA *を実装していて、schartzian変換に基づいてコレクションの最小値を選択することを躊躇していました。コレクションから最小シュワルチア変換を持つオブジェクトを選択してください

基本的に、私は移動するのに適した四角形のコレクションを持っています。私はコストが最も低い四角形に移動したいと思います。

基本的には、コストが最も低い隣人から、私は四角形を選択します。

私はこれを行うに考えることができる唯一の方法は

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

ようなものである。しかし、私は本当に何か高性能たいと思い、私は本当に、コレクションをソートしたくないので、私はしたいです変換の最小値を持つもの

私はもっと冗長な "Cスタイル"のループを作成し、それ以前の最小値を記録することができましたが、私は明確でコンパクトなものを望んでいました。

+0

私の間違い、私は頻繁にこれらの2つをミックスし、必要に応じて_byを削除または追加します – EnabrenTane

答えて

2

なぜ使用しないのですかmin_by

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

し、列挙っぽい法の「_by」バージョンが古い学校を得ることができますし、シュワルツは、擬似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 
+0

これは私が欲しいものです!私はその方法を見たことがない。ありがとう!すぐに回答を受け入れてくれます。 – EnabrenTane

関連する問題