6月21日に開催されたAtCoder Beginner Contest 171。
うっかりしていてバーチャル参加になってしまった…。ガーン
さて、A問題の復習。
各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。
A - αlphabet
問題文
英大文字か英小文字のいずれか 1 文字α
が入力されます。α
が英大文字ならA
、英小文字ならa
と出力してください。入力
入力は以下の形式で標準入力から与えられる。
α
提出したコード
s = gets puts s.match(/[A-Z]/) ? "A": "a"
結果:AC(正解) 実行時間:69 ms
正規表現を使って、s
がA-Z
にマッチするか、つまり大文字かどうか判定し、true
ならA
、false
ならa
と出力する。
…のつもりだったけど、match?
の?
を忘れていることに今気づいた!!何でAC(正解)できたんだろう。
↓ こう書いたつもりだった。
s = gets puts s.match?(/[A-Z]/) ? "A": "a"
match
と match?
は全然違う
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
に、nil
はfalse
になるから結果は同じということか。
でもこんなわかりにくいコードはだめだ。
String#match (Ruby 2.7.0 リファレンスマニュアル)
String#match? (Ruby 2.7.0 リファレンスマニュアル)
class MatchData (Ruby 2.7.0 リファレンスマニュアル)
他の書き方
最初upcase
かdowncase
を使いたかったけどぱっと思いつかず断念したので、書いてみた。
s = gets.chomp puts s.upcase == s ? "A" : "a"
if文バージョン
s = gets.chomp if s.upcase == s puts "A" else puts "a" end
感想
入力例を試してもうまくいったから提出してしまったけど、よくないコードだった。
競技プログラミングは時間を気にして急いで出してしまう。
最後にもう一度冷静に見直さないといけないと思った。