はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC282のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Generalized ABC
a-282.rb
k = gets.to_i
print *("A"..(64 + k).chr)
解説
chrメソッドを使って簡単に実装することができます。
B - Let's Get a Perfect Score
b-282.rb
n, m = gets.split.map(&:to_i)
arr = Array.new(n){ gets.chomp }
ans = 0
for i in 0..n - 2
for j in i + 1..n - 1
check = true
m.times do|k|
if arr[i][k] == 'x' && arr[j][k] == 'x'
check = false
break
end
end
ans += 1 if check
end
end
puts ans
<追記>
コメントでいただいた別解になります。
別解
n, m = gets.split.map(&:to_i)
ss = Array.new(n) { gets.chomp }
ss.map! { |s| s.each_char.map { _1 == "o" ? true : false } }
puts ss.combination(2).count {|a, b|
a.zip(b).all? { _1 | _2 }
}
解説
三重ループにして問題文の通り愚直に実装すればOKです。
C - String Delimiter
c-282.rb
n = gets.to_i
s = gets.chomp
flag = false
n.times do |i|
if s[i] == '"'
flag = !flag
next
end
s[i] = '.' if s[i] == ',' && !flag
end
puts s
<追記>
コメントでいただいた別解になります。
フリップフロップを使って簡単に範囲指定ができるみたいです!すごい
別解1
n = gets.to_i
s = gets.chomp
n.times do |i|
next if (s[i] == '"')...(s[i] == '"')
s[i] = "." if s[i] == ","
end
puts s
正規表現を使っています。
[^"]+ のほうにマッチする部分文字列が見出されたとき,その部分文字列が ( ) によってキャプチャーされます。
キャプチャーされた文字列は,$1 で参照できます。
一方,".*?" のほうにマッチする部分文字列が見出されたとき,$1 は nil を返します。
とのことです。
別解2
n = gets.to_i
s = gets.chomp
- puts s.gsub(/([^"]+)|".*?"/){ |i| i.include?('"') ? i : i.gsub(/,/, ".") }
+ puts s.gsub(/([^"]+)|".*?"/){ |i| $1 ? i.tr(",", ".") : i }
解説
flagを使って括られている範囲を調べています。そして、括られていない部分で,
があれば.
に変えることで実装することができます。
メモ
↓ なぜ、別解2のような正規表現の書き方ができるのか?
・".*?":"から次の"まで
・[^"]+:"以外の文字の連なり
参考