Day 8
This commit is contained in:
parent
3203eeb9c3
commit
6f44724d08
|
@ -0,0 +1,82 @@
|
||||||
|
defmodule Day8 do
|
||||||
|
def create_node(numbers, indent \\ "") do
|
||||||
|
# IO.puts "#{indent}numbers: #{numbers |> Enum.join(", ")}"
|
||||||
|
|
||||||
|
[children_count, meta_count | numbers] = numbers
|
||||||
|
|
||||||
|
{children, numbers} =
|
||||||
|
if children_count > 0 do
|
||||||
|
IO.puts("#{indent}creating #{children_count} children")
|
||||||
|
Enum.reduce(1..children_count, {[], numbers}, fn child, {children, numbers} ->
|
||||||
|
IO.puts "#{indent}creating child #{child}"
|
||||||
|
{child, numbers} = create_node(numbers, indent <> " ")
|
||||||
|
{
|
||||||
|
[child | children],
|
||||||
|
numbers
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
{[], numbers}
|
||||||
|
end
|
||||||
|
|
||||||
|
{metadata, numbers} =
|
||||||
|
if meta_count > 0 do
|
||||||
|
{
|
||||||
|
Enum.slice(numbers, 0, meta_count),
|
||||||
|
Enum.slice(numbers, meta_count..-1)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{[], numbers}
|
||||||
|
end
|
||||||
|
|
||||||
|
IO.puts "#{indent}metadata: #{metadata |> Enum.join(", ")}"
|
||||||
|
|
||||||
|
{
|
||||||
|
{children |> Enum.reverse(), metadata},
|
||||||
|
numbers
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def sum_metadata({[], metadata}), do: Enum.sum(metadata)
|
||||||
|
def sum_metadata({children, metadata}) do
|
||||||
|
children_sum = Enum.map(children, &sum_metadata/1) |> Enum.sum()
|
||||||
|
children_sum + Enum.sum(metadata)
|
||||||
|
end
|
||||||
|
|
||||||
|
def node_value({children, metadata}) when length(children) == 0 do
|
||||||
|
Enum.sum(metadata)
|
||||||
|
end
|
||||||
|
def node_value({children, metadata}) do
|
||||||
|
# IO.inspect(children)
|
||||||
|
metadata
|
||||||
|
# |> IO.inspect
|
||||||
|
|> Enum.map(fn index ->
|
||||||
|
# IO.inspect(index - 1)
|
||||||
|
case Enum.fetch(children, index - 1) do
|
||||||
|
{:ok, child} -> node_value(child)
|
||||||
|
:error -> 0
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Enum.sum()
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_input() do
|
||||||
|
File.read!("lib/day8/input.txt")
|
||||||
|
|> String.split(" ", trim: true)
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def part1() do
|
||||||
|
{node, _numbers} =
|
||||||
|
parse_input()
|
||||||
|
|> create_node()
|
||||||
|
sum_metadata(node)
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2() do
|
||||||
|
{node, _numbers} =
|
||||||
|
parse_input()
|
||||||
|
|> create_node()
|
||||||
|
node_value(node)
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,4 @@
|
||||||
|
defmodule Day8Test do
|
||||||
|
use ExUnit.Case
|
||||||
|
doctest Day8
|
||||||
|
end
|
Loading…
Reference in New Issue