A - αlphabet(ABC171復習)

6月21日に開催されたAtCoder Beginner Contest 171

うっかりしていてバーチャル参加になってしまった…。ガーン

さて、A問題の復習。

各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。

A - αlphabet

問題文
英大文字か英小文字のいずれか 1 文字 α が入力されます。α が英大文字なら A、英小文字なら a と出力してください。

入力
入力は以下の形式で標準入力から与えられる。
α

A - αlphabet

提出したコード

s = gets
puts s.match(/[A-Z]/) ? "A": "a" 

結果:AC(正解) 実行時間:69 ms

正規表現を使って、sA-Zにマッチするか、つまり大文字かどうか判定し、trueならAfalseならaと出力する。

…のつもりだったけど、match??を忘れていることに今気づいた!!何でAC(正解)できたんだろう。

↓ こう書いたつもりだった。

s = gets
puts s.match?(/[A-Z]/) ? "A": "a" 

matchmatch? は全然違う

matchは、マッチすればMatchDataオブジェクト、マッチしなければnilを返す。

match?は、マッチすればtrue、マッチしなければfalseを返す。Rubyでメソッド名に?がつくものは大抵真偽値を返す。

検証してみた。

p "G".match(/[A-Z]/)  #=> #<MatchData "G">
p "g".match(/[A-Z]/)  #=> nil

p "G".match?(/[A-Z]/) #=> true
p "g".match?(/[A-Z]/) #=> false

Rubyの真偽値は以下のようになっている。

  • falseまたはnilであれば偽
  • それ以外は真

if文(三項演算子)で真偽を判定するときに、<MatchData "G">trueに、nilfalseになるから結果は同じということか。

でもこんなわかりにくいコードはだめだ。

正規表現 (Ruby 2.7.0 リファレンスマニュアル)

String#match (Ruby 2.7.0 リファレンスマニュアル)

String#match? (Ruby 2.7.0 リファレンスマニュアル)

class MatchData (Ruby 2.7.0 リファレンスマニュアル)

他の書き方

最初upcasedowncaseを使いたかったけどぱっと思いつかず断念したので、書いてみた。

s = gets.chomp
puts s.upcase == s ? "A" : "a"

if文バージョン

s = gets.chomp
if s.upcase == s
  puts "A"
else
  puts "a"
end

感想

入力例を試してもうまくいったから提出してしまったけど、よくないコードだった。

競技プログラミングは時間を気にして急いで出してしまう。

最後にもう一度冷静に見直さないといけないと思った。