今回は、RubyでAtCoder ABC305のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Water Station
a-305.rb
- puts (gets.to_f / 5).round * 5
+ puts gets.to_i.quo(5).round * 5
解説
与えられた整数を5で割ったものを小数点で四捨五入し、そこに5をかけたものが答えとなります。
B - ABCDEFG
b-305.rb
x, y = gets.split.sort.map{ |i| i.ord - 65 }
z = [3, 1, 4, 1, 5, 9]
puts z[x...y].sum
解説
ord
メソッドを使って、与えられた文字を数値に変換し、それらに対応する距離を求めることで解くことができます。
C - Snuke the Cookie Picker
c-305.rb
h, w = gets.split.map(&:to_i)
top = left = Float::INFINITY
buttom = right = 0
array = Array.new(h){ gets.chomp }
h.times do |i|
w.times do |j|
if array[i][j] == "#"
top = [top, i].min
buttom = [buttom, i].max
left = [left, j].min
right = [right, j].max
end
end
end
top.upto(buttom) do |i|
left.upto(right) do |j|
if array[i][j] == "."
puts "#{i + 1} #{j + 1}"
exit
end
end
end
別解
h, w = gets.split.map(&:to_i)
array = Array.new(h){ gets.chomp }
no_cookie = "." * w
top = array.index{ _1 != no_cookie }
buttom = array.rindex{ _1 != no_cookie }
left = Float::INFINITY
- right = 0
h.times do |i|
w.times do |j|
- if array[i][j] == "#"
- left = [left, j].min
- right = [right, j].max
- end
+ left = [left, j].min if array[i][j] == "#"
end
end
- top.upto(buttom) do |i|
- left.upto(right) do |j|
- if array[i][j] == "."
- puts "#{i + 1} #{j + 1}"
+ left.upto(w - 1) do |i|
+ top.upto(buttom) do |j|
+ if array[j][i] == "."
+ puts "#{j + 1} #{i + 1}"
exit
end
end
end
解説
最初に、#
となっている最小・最大の行および列を求めます。このとき答えは、その範囲で.
となっている部分の行・列の値となります。