exercism/elixir/top-secret/lib/top_secret.ex

36 lines
991 B
Elixir
Raw Permalink Normal View History

2024-03-07 14:29:22 +00:00
defmodule TopSecret do
def to_ast(string), do: Code.string_to_quoted!(string)
def decode_secret_message_part({is_function?, _, arguments} = ast, acc)
when is_function? in [:defp, :def] do
{ast, [get_letters(arguments) | acc]}
end
def decode_secret_message_part(ast, acc), do: {ast, acc}
defp get_letters([{:when, _, arguments} | _]), do: get_letters(arguments)
defp get_letters([{name, _, arguments} | _]) when is_list(arguments),
do: letters_from_name_and_arguments(name, arguments)
defp get_letters([{name, _, arguments} | _]) when is_atom(arguments),
do: letters_from_name_and_arguments(name, [])
defp letters_from_name_and_arguments(name, arguments) do
name
|> Atom.to_string()
|> String.slice(0, length(arguments))
end
def decode_secret_message(string) do
{_ast, result} =
string
|> to_ast()
|> Macro.prewalk([], &decode_secret_message_part/2)
result
|> Enum.reverse()
|> Enum.join()
end
end