top-secret
This commit is contained in:
35
elixir/top-secret/lib/top_secret.ex
Normal file
35
elixir/top-secret/lib/top_secret.ex
Normal file
@@ -0,0 +1,35 @@
|
||||
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
|
||||
Reference in New Issue
Block a user