はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC264のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - "atcoder".substr()
a-264.rb
l, r = gets.split.map(&:to_i)
s = "atcoder"
puts s[l - 1...r]
B - Nice Grid
b-264.rb
r, c = gets.split.map(&:to_i)
def grid(a, b)
if a == 1 || a == 15
puts "black"
exit
elsif (a == 3 || a == 13) && 3 <= b && b <= 13
puts "black"
exit
elsif (a == 5 || a == 11) && 5 <= b && b <= 11
puts "black"
exit
elsif (a == 7 || a == 9) && 7 <= b && b <= 9
puts "black"
exit
end
end
grid(r, c)
grid(c, r)
puts "white"
別解として公式解説を参考にしました。中央のマスから黒色のマスまでの距離が奇数であることを利用しています。
別解
r, c = gets.split.map(&:to_i)
if [(r - 8).abs, (c - 8).abs].max.odd?
puts "black"
else
puts "white"
end
解説
黒色となる部分を列挙して探索しています。
C - Matrix Reducing
c-264.rb
h1, w1 = gets.split.map(&:to_i)
a = Array.new(h1){ gets.split.map(&:to_i) }
h2, w2 = gets.split.map(&:to_i)
b = Array.new(h2){ gets.split.map(&:to_i) }
(0..h1 - 1).to_a.combination(h2).each do |y|
(0..w1 - 1).to_a.combination(w2).each do |x|
flag = true
h2.times do |i|
w2.times do |j|
if a[y[i]][x[j]] != b[i][j]
flag = false
break
end
end
break if !flag
end
if flag
puts "Yes"
exit
end
end
end
puts "No"
解説
h, wがともに10以下と小さいので全探索できます。combinationメソッドを使って順にbと一致する場合があるか調べていき、一致する者があればYesを出力して終了、最後まで一致するものがなければNoを出力します。
D - "redocta".swap(i,i+1)
d-264.rb
s = gets.chomp
ans = 0
"atcoder".chars.each do |c|
ans += s.index(c)
s.slice!(c)
end
puts ans
解説
(公式解説を参考にしました)
文字を目的の文字列(この問題ではatcoder)におけるインデックスに置き換えて探索する転倒数を利用して解くことができます。