はじめに
AtCoder の Beginners Selection コンテスト ABC049C - 白昼夢 問題を Elixir Livebook で回答しました
実装したノートブックはこちら
問題
入出力例
以下のようになれば OK です
"""
erasedream
"""
|> Main.solve()
|> then(&(&1 == "YES"))
"""
dreameraser
"""
|> Main.solve()
|> then(&(&1 == "YES"))
"""
dreamerer
"""
|> Main.solve()
|> then(&(&1 == "NO"))
回答1
defmodule Main do
@words [
"eraser",
"erase",
"dreamer",
"dream"
]
def main do
:stdio
|> IO.read(:all)
|> solve()
|> IO.puts()
end
def solve(input) do
s = String.trim(input)
Enum.reduce(@words, s, fn word, acc ->
String.replace(acc, word, " ")
end)
|> String.trim()
|> case do
"" -> "YES"
_ -> "NO"
end
end
end
順次消していって空文字になれば YES です
dreameraser
(= dream
+ eraser
) のとき、消す順番が悪いと dreamer
+ aser
と捉えらて、判定を失敗します
以下の順序で消すことで、判定ミスが発生しません
- eraser
- erase
- dreamer
- dream
また、 各文字列を単純に空文字に置換すると erdreamaser
のとき、 erdreamaser
-- dream
置換 -> eraser
-- eraser
置換 -> `` となってしまい、これも判定に失敗します
そこで、一旦全て半角スペースに置換しておき、最後にまとめてトリムします
これだと erdreamaser
-- dream
削除 -> er aser
となり、正しく判定できます
実行時間は 393 ms でした
まとめ
この1つだけですが、他の人とは違うパターンができました
非常にシンプルで良いのではないでしょうか