10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[AtCoder] Beginners Selection - ABC049C - 白昼夢 [Elixir Livebook]

Last updated at Posted at 2023-06-30

はじめに

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つだけですが、他の人とは違うパターンができました

非常にシンプルで良いのではないでしょうか

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?