kotazon.com

虎太郎の備忘録

【AtCoder-Ruby】ABC104 B - AcCepted

問題

問題文

文字列 S が与えられます。 S のそれぞれの文字は英大文字または英小文字です。
S が次の条件すべてを満たすか判定してください。

  • S の先頭の文字は大文字の A である。
  • S の先頭から 3 文字目と末尾から 2 文字目の間(両端含む)に大文字の C がちょうど 1 個含まれる。
  • 以上の A, C を除く S のすべての文字は小文字である。

制約

  • 4 ≤|S| ≤10(|S| は文字列 S の長さ)
  • S のそれぞれの文字は英大文字または英小文字である

問題リンク

考えたこと

  • 1, 2番目の条件はスライスで
  • 3番目は正規表現で判定
  • ふるいに掛けるようにダメな条件を先にチェックし余ったものを正解にする
  • 正規表現で一行でできそうだが、時間内には思いつかない

回答

S = gets.strip

if !S[0].eql?('A')
  puts 'WA'
elsif !(S[2, S.size - 3].count('C') == 1)
  puts 'WA'
elsif !S[1..-1].match(/[ABD-Z]/).nil?
  puts 'WA'
else
  puts 'AC'
end

考察

もっと良い書き方は?(正解者を参照)

なるほど。シンプルに正規表現でかけばOKか。

s = gets.strip
puts s.match(/^A[a-z]+C[a-z]+$/) ? 'AC' : 'WA'