Skip to content

Instantly share code, notes, and snippets.

@jemmyw
Created December 13, 2018 06:20
Show Gist options
  • Save jemmyw/0aa1553898fcd78122d486db53f7ff31 to your computer and use it in GitHub Desktop.
Save jemmyw/0aa1553898fcd78122d486db53f7ff31 to your computer and use it in GitHub Desktop.
defmodule Tree do
def parse(str) when is_bitstring(str) do
str |> String.split() |> Enum.map(&String.to_integer/1)
end
def nodes_metadata(list)
def nodes_metadata([]) do
{[], []}
end
def nodes_metadata([0 | [m | t]]) do
{Enum.take(t, m), Enum.drop(t, m)}
end
def nodes_metadata([c | [m | t]]) do
{cm, nt} =
Enum.reduce(1..c, {[], t}, fn _, acc ->
{cm, nt} = nodes_metadata(acc |> elem(1))
{
List.flatten(acc |> elem(0), cm),
nt
}
end)
{metadata, left} = nodes_metadata([0 | [m | nt]])
{
List.flatten(metadata, cm),
left
}
end
def nodes_value(list)
def nodes_value([]) do
{0, []}
end
def nodes_value([0 | [m | t]]) do
{Enum.sum(Enum.take(t, m)), Enum.drop(t, m)}
end
def nodes_value([c | [m | t]]) do
{cm, nt} =
Enum.reduce(1..c, {[], t}, fn _, acc ->
{cm, nt} = nodes_value(acc |> elem(1))
{
List.flatten(elem(acc, 0), [cm]),
nt
}
end)
{metadata, left} = nodes_metadata([0 | [m | nt]])
values = Enum.map(metadata, fn index -> Enum.at(cm, index - 1) || 0 end)
{
Enum.sum(values),
left
}
end
end
nodes =
File.read("8.txt")
|> elem(1)
|> Tree.parse()
nodes
|> Tree.nodes_metadata()
|> elem(0)
|> Enum.sum()
|> IO.inspect(charlists: :as_lists)
nodes |> Tree.nodes_value() |> elem(0) |> IO.inspect(charlists: :as_lists)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment