「ACもらえた。運がよかった!」ABC049C
目次
問題
erase、eraserとDaydreamのつながりがわかりません。
ググってもこれくらいしかヒットしません。
多分eraserとdreamerがちょっと似ていて、都合がいいからでしょうか。
回答
# 判定する文字列を受け取る
s = gets.chomp
# 判定する文字列から、4つの単語をすべてとりのぞく
rest = s.gsub(/eraser/, '').gsub(/erase/, '').gsub(/dreamer/, '').gsub(/dream/, '')
# とりのぞいた後に文字列が残っていなければYESを出力する
puts rest.length == 0 ? "YES" : "NO"
学んだ処理
puts rest.length == 0 ? "YES" : "NO"
条件演算子(三項演算子):boorean演算の結果による出力を簡潔に書けるんですね。
↓この書き方しかわかりませんでした
if rest.length == 0
puts "YES"
else
puts "NO"
end
お手本の別解
mayu_mic様の回答がコード長、処理時間、共に最短でした。
puts gets.chomp.match(/^*2*$/) ? 'YES' : 'NO'
gsubを使う人が多い中、matchと条件式の組み合わせで簡潔に処理しています。
処理は
「行頭^から行末$までの間、
((eraserを0個か1個?)(dreamを0個か1個?)(dreamerを0個か1個?)
の繰り返し*
と一致するか」判定しています。
eraseは入れなくても運よくACもらえるみたいです。
感想
rest = s.gsub(/dreamer/, '').gsub(/dream/, '').gsub(/eraser/, '').gsub(/erase/, '')
このようにdreamer, dream, eraser, eraseの順にとりのぞくとWAでハマりました。
(eraser, erase, dreamer, dreamの順にとりのぞいてACもらえたのは、運が良かったとしか。
ジャッジの入力に"deraseream"が入っていたら
NOを出力すべきところをYESと出力してWAです。)