るびらな!

RubyをLearnする人の勉強記録。(超)弩(級の)素人なので、誰かダメさがわかる人に罵ってもらったりして、少しずつ知見を広げたいと思っています。

ITP1_2_D Circle in a Rectangle

ここも押していただけると嬉しいです #=> にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Rubyへ にほんブログ村 IT技術ブログ Ruby on Railsへ

AOJもこれで第7日目ということで、1週間経ちました。
のんびりですが、少しずつ前進していければ、と思っています。

ということで、本日の問題はこちら ->
長方形の中の円 | プログラミング入門 | Aizu Online Judge

問題

長方形の中の円

長方形の中に円が含まれるかを判定するプログラムを作成してください。次のように、長方形は左下の頂点を原点とし、右上の頂点の座標 (W,H) が与えられます。また、円はその中心の座標 (x,y) と半径 r で与えられます。
f:id:rubylearner:20141119075409p:plain


Input

5つの整数 W、H、x、y、r が空白区切りで1行に与えられます。


Output

円が長方形の内部に含まれるなら Yes と、一部でもはみ出るならば No と1行に出力してください。

なるほど、円の中心の座標±rがちゃんと長方形の中に入っているかどうか、ということですね。

自分のコード

w,h,x,y,r = gets.split.map(&:to_i)
xmax = w - r
ymax = h - r
puts r<=x&&x<=xmax&&r<=y&&y<=ymax ? :Yes : :No

ちゃんと、今回は忘れずに入力値の取り込みを

w,h,x,y,r = gets.split.map(&:to_i)

としました。

また、ちょっとカッコつけて競技プログラミングっぽく出力するために

puts r<=x&&x<=xmax&&r<=y&&y<=ymax ? :Yes : :No

てな感じで、出力する部分を文字列じゃなくてシンボルにしてみたけど、

ここは全然意味なかったかも。

他の人のコード

最も短い人

w,h,x,y,r=gets.split.map &:to_i
puts r>[w-x,h-y,x,y].min ? :No: :Yes

putsの条件部分が、これは思いつかなかった!という感じ。

やっぱり、単純なのもいいけど、ちょっと考えて書きたいよね。

最も長い人

class CircleInRectangle
    def contain_circle? (val_array)
        w = val_array[0]
        h = val_array[1]
        x = val_array[2]
        y = val_array[3]
        r = val_array[4]
        x_range = ((x >= r) && (x <= w-r))
        y_range = ((y >= r) && (y <= h-r))
 
        puts (x_range && y_range) ? "Yes" : "No"
    end
end
 
input = gets.split.map(&:to_i)
CircleInRectangle.new.contain_circle?(input)

やっぱり、可読性についてはクラス作成した方がいいと思うけど

どうなんだろ?

大小比較じゃなくてbetween使った人

w, h, x, y, r = gets.split(" ").map(&:to_f)
if x.between?(r, w - r) and y.between?(r, h - r)
  puts "Yes"
else
  puts "No"
end

大小比較で4つ並べる人が多い中、betweenを使うと条件が半分に。