ITP1_2_D Circle in a Rectangle
AOJもこれで第7日目ということで、1週間経ちました。
のんびりですが、少しずつ前進していければ、と思っています。
ということで、本日の問題はこちら ->
長方形の中の円 | プログラミング入門 | Aizu Online Judge
問題
長方形の中の円
長方形の中に円が含まれるかを判定するプログラムを作成してください。次のように、長方形は左下の頂点を原点とし、右上の頂点の座標 (W,H) が与えられます。また、円はその中心の座標 (x,y) と半径 r で与えられます。
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を使うと条件が半分に。