はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC244のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - Last Letter
a-244.rb
gets.to_i
puts gets.chomp[-1]
B - Go Straight and Turn Right
b-244.rb
- n = gets.to_i
+ gets.to_i
array = gets.chomp.chars
x = y = 0
- dx = [1, 0, -1, 0]
- dy = [0, -1, 0, 1]
- dir = 0
+ dx, dy = 1, 0
array.each do |c|
if c == "S"
- x += dx[dir]
- y += dy[dir]
+ x += dx
+ y += dy
else
- dir += 1
- dir %= 4
+ dx, dy = dy, -dx
end
end
puts "#{x} #{y}"
解説
最初にx,yを0にdx, dyをそれぞれの向いている方向に対応させて初期化しておきます。そして、与えられた文字列を構成する文字がSのときはx,yそれぞれに対してdx[dir]
, dy[dir]
を足します。一方、Tのときは方向を定めるdirの値をインクリメントし、4で割った余りとしておきます。この操作を、それぞれの文字に対して行うことで、高橋君が最終的にいる座標を求めることができます。
C - Yamanote Line Game
c-244.rb
n = gets.to_i
hash = {}
loop do
for i in 1..2 * n + 1
next if hash[i]
puts i
STDOUT.flush
hash[i] = true
break
end
n = gets.to_i
break if n == 0
hash[n] = true
end
解説
問題文の通りに、0が入力されるまで1~2n+1の整数で小さいものかつまだ出ていない整数を出力します。
D - Swap Hats
d-244.rb
s = gets.split.join
t = gets.split.join
group = ["BGR", "GRB", "RBG"]
puts group.include?(s) ^ group.include?(t) ? "No": "Yes"
解説
(公式解説を参考にしました)
グループとして、["BGR","GRB","RBG"]
を用意していきます。SをTにできるかどうかは、SとT両方がこのグループに含まれているか、あるいはどちらも含まれていないかと同じことなので、これは排他的論理和を用いることで判定することができます。