「ACもらえた。運がよかった!」ABC049C

目次

 

問題

atcoder.jp

erase、eraserとDaydreamのつながりがわかりません。

ググってもこれくらいしかヒットしません。

www.amazon.com

多分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(/^*1*$/) ? 'YES' : 'NO'

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です。)

 

*1:eraser?)|(dream(er)?

*2:eraser?)|(dream(er)?