Last active
December 9, 2018 02:21
-
-
Save mattsan/dd9ae4f4c2569e522366fd05d901360c to your computer and use it in GitHub Desktop.
オフラインリアルタイムどう書くE30「アンエスケープ 2018.12.8」を Elixir で解く
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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