top-secret

This commit is contained in:
2024-03-07 09:29:22 -05:00
parent b4e1570ba6
commit 3ab71444f5
11 changed files with 677 additions and 0 deletions

View 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