プログラミング的なSomething

読者です 読者をやめる 読者になる 読者になる

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

CodeIQに出題されている問題をやってみた その④(完結)

続き

CodeIQに出題されている問題をやってみた その③

これの続き。第4問です。

combination

問題文はmapメソッドを使ってるしなんというかまとめ問題のような雰囲気でした。 combinationは、配列から引数n個を重複を許さない組み合わせを数え上げます。組み合わせの数だけブロックを繰り返します。

irb(main):119:0* numbers = [1,2,3,4]
irb(main):122:0> numbers.combination(3){|a,b,c| printf("(%d,%d,%d)",a,b,c)}
#=> (1,2,3)(1,2,4)(1,3,4)(2,3,4)=> [1, 2, 3, 4]

numbersという4値ある配列から、引数3個の重複を許さない組み合わせを数え上げます。

肝心の問題文

2つのx,y座標から最大の距離を取った場合の値を出力します。 問題文は以下のとおりです。正直これだけだとイメージしにくいのです。

#  farthest_distance_square([[1,2],[1,7],[10,2],[10,7]]) #=> 106
#  farthest_distance_square([[5,0],[3,3],[7,9],[3,5],[2,4],[7,6],[8,8],[1,6],[7,7],[8,1]]) #=> 85
def farthest_distance_square( points )
  points.【空欄D】(2).map{ |a,b| (a[0]-b[0])**2 + (a[1]-b[1])**2 }.max
end

途中までの処理を書いて初めて理解できるような気がします。 combinationまでを書いてみますとこんな感じ。

def comb(points)
  points.combination(2){ |a,b| p [a,b] }$
end

comb(([[0,10],[0,10],[0,10],[1,12]]))
#=>[[0, 10], [0, 10]]
#=>[[0, 10], [0, 10]]
#=>[[0, 10], [1, 12]]
#=>[[0, 10], [0, 10]]
#=>[[0, 10], [1, 12]]
#=>[[0, 10], [1, 12]]

この出力結果をみて初めて、「ああ、mapで処理できるなー」ってことを感じることができました。 CodeIQの問題はとりあえずこれで一段落です。精進しないと。