はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC241のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Digit Machine
a-241.rb
a = gets.split.map(&:to_i)
puts a[a[a[0]]]
B - Pasta
b-241.rb
# 修正前
gets.split
a = gets.split.tally
b = gets.split.tally
b.keys.each do |length_of_pasta|
if !a[length_of_pasta] || b[length_of_pasta] > a[length_of_pasta]
puts "No"
exit
end
end
puts "Yes"
b-241.rb
# 修正後
gets.split
a = gets.split.tally
a.default = 0
b = gets.split.tally
puts b.keys.all?{ b[_1] <= a[_1] } ? "Yes" : "No"
解説
tally
メソッドを使ってA, Bそれぞれの長さのパスタがいくつあるかを保持させます。そして、Bの要素である各長さのパスタを食べることができるかを調べることで、高橋君が最後まで食事計画を実行することができるかどうかを判定することができます。
C - Connect 6
c-241.rb
n = gets.to_i
array = Array.new(n){ gets.chomp.chars.map{ |x| x == "#" } }
dy = [1, 0, 1, -1]
dx = [0, 1, 1, 1]
n.times do |i|
n.times do |j|
4.times do |k|
- next unless i + dy[k] * 5 < n && 0 <= i + dy[k] * 5 && j + dx[k] * 5 < n
+ next unless (i + dy[k] * 5 < n) && (0 <= i + dy[k] * 5) && (j + dx[k] * 5 < n)
# 以下でも可
# next unless (i + dy[k] * 5).between?(0, n - 1) && (j + dx[k] * 5 < n)
# next unless (0...n).cover?(i + dy[k] * 5) && j + dx[k] * 5 < n
count = 0
6.times do |l|
count += 1 if array[i + dy[k] * l][j + dx[k] * l]
end
if 4 <= count
puts "Yes"
exit
end
end
end
end
puts "No"
解説
Nが1000以下と小さいので、縦・横・斜め方向のそれぞれについて全探索することで、#
が6つ以上連続するようにできるかどうかを判定することができます。