Skip to content

Instantly share code, notes, and snippets.

@mattsan
Last active December 9, 2018 02:21
Show Gist options
  • Save mattsan/dd9ae4f4c2569e522366fd05d901360c to your computer and use it in GitHub Desktop.
Save mattsan/dd9ae4f4c2569e522366fd05d901360c to your computer and use it in GitHub Desktop.
オフラインリアルタイムどう書くE30「アンエスケープ 2018.12.8」を Elixir で解く
defmodule Orde29 do
@moduledoc """
オフラインリアルタイムどう書く E29
[アンエスケープ 2018.12.8](http://nabetani.sakura.ne.jp/hena/orde29unes/) を Elixir で解きました。
基本的なアイディアとしては [Ruby 版](https://github.com/mattsan/orde29_ruby) と同じです。
パース中に結果の文字列の内容をチェックして不正な結果になることがわかった時点で終了するようにしています。
`tail` は結果の文字列の末尾の文字なので冗長ですが、文字列の末尾の文字を取り出す手間が面倒だったので独立したパラメータで渡すようにしています。
 """
@doc """
アンエスケープ
"""
def solve(input), do: parse(input, :normal, nil, "")
defp parse(<<?/, rest::bits>>, :slash, _, result), do: parse(rest, :normal, ?/, <<result::bits, ?/>>)
defp parse(_, :slash, _, ""), do: "-"
defp parse(_, :slash, ?,, _), do: "-"
defp parse(<<?', rest::bits>>, :slash, _, result), do: parse(rest, :single_quote, ?,, <<result::bits, ?,>>)
defp parse(<<?", rest::bits>>, :slash, _, result), do: parse(rest, :double_quote, ?,, <<result::bits, ?,>>)
defp parse(<<c, rest::bits>>, :slash, _, result), do: parse(rest, :normal, c, <<result::bits, ?,, c>>)
defp parse(<<?", rest::bits>>, :double_quote, tail, result), do: parse(rest, :normal, tail, result)
defp parse(<<c, rest::bits>>, :double_quote, _, result), do: parse(rest, :double_quote, c, <<result::bits, c>>)
defp parse(<<?', rest::bits>>, :single_quote, tail, result), do: parse(rest, :normal, tail, result)
defp parse(<<c, rest::bits>>, :single_quote, _, result), do: parse(rest, :single_quote, c, <<result::bits, c>>)
defp parse(<<?/, rest::bits>>, :normal, tail, result), do: parse(rest, :slash, tail, result)
defp parse(<<?', rest::bits>>, :normal, tail, result), do: parse(rest, :single_quote, tail, result)
defp parse(<<?", rest::bits>>, :normal, tail, result), do: parse(rest, :double_quote, tail, result)
defp parse(<<c, rest::bits>>, :normal, _, result), do: parse(rest, :normal, c, <<result::bits, c>>)
defp parse("", :normal, _, ""), do: "-"
defp parse("", :normal, ?,, _), do: "-"
defp parse("", :normal, _, result), do: result
defp parse("", _, _, _), do: "-"
@doc """
アンエスケープ 別実装
parse の部分を展開しました
"""
def solve2(input) do
result =
input
|> String.to_charlist()
|> Enum.reduce({:normal, nil, ""}, fn
_, {_, _, "-"} -> {nil, nil, "-"}
?/, {:slash, _, result} -> {:normal, ?/, <<result::bits, ?/>>}
_, {:slash, _, ""} -> {nil, nil, "-"}
_, {:slash, ?,, _} -> {nil, nil, "-"}
?', {:slash, _, result} -> {:single_quote, ?,, <<result::bits, ?,>>}
?", {:slash, _, result} -> {:double_quote, ?,, <<result::bits, ?,>>}
c, {:slash, _, result} -> {:normal, c, <<result::bits, ?,, c>>}
?", {:double_quote, tail, result} -> {:normal, tail, result}
c, {:double_quote, _, result} -> {:double_quote, c, <<result::bits, c>>}
?', {:single_quote, tail, result} -> {:normal, tail, result}
c, {:single_quote, _, result} -> {:single_quote, c, <<result::bits, c>>}
?/, {:normal, tail, result} -> {:slash, tail, result}
?', {:normal, tail, result} -> {:single_quote, tail, result}
?", {:normal, tail, result} -> {:double_quote, tail, result}
c, {:normal, _, result} -> {:normal, c, <<result::bits, c>>}
end)
case result do
{:normal, _, ""} -> "-"
{:normal, ?,, _} -> "-"
{:normal, _, result} -> result
{_, _, _} -> "-"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment