-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathday_08.ex
48 lines (37 loc) · 1.58 KB
/
day_08.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
defmodule AdventOfCode.Y2018.Day08 do
@moduledoc """
--- Day 8: Memory Maneuver ---
Problem Link: https://adventofcode.com/2018/day/8
Difficulty: l
Tags: sequence walk
"""
alias AdventOfCode.Helpers.{InputReader, Transformers}
def input, do: InputReader.read_from_file(2018, 8)
def run(input \\ input()) do
input = parse(input)
{metadata_sum(input), nil}
end
def parse(data \\ input()), do: Enum.map(Transformers.words(data), &String.to_integer/1)
def metadata_sum(lst), do: walk(lst, [], [], []) |> Enum.flat_map(& &1) |> Enum.sum()
def walk([], _, _, metadata), do: metadata
def walk([node_n, meta_n | rest], [], meta_ns, []),
do: walk(rest, [node_n], [meta_n | meta_ns], [])
def walk(rest, [0 | nodes], [meta_last | meta_ns], metadata) do
{metas, next} = Enum.split(rest, meta_last)
walk(next, nodes, meta_ns, [metas | metadata])
end
def walk([node_n, meta_n | rest], [node_last | nodes], meta_ns, metadata),
do: walk(rest, [node_n, node_last - 1 | nodes], [meta_n | meta_ns], metadata)
def values(lst), do: values(lst, [], [], [])
def values([], _, _, metadata), do: metadata
def values([node_n, meta_n | rest], [], meta_ns, []) do
values(rest, [node_n], [meta_n | meta_ns], [])
end
def values(rest, [0 | nodes], [meta_last | meta_ns], metadata) do
{metas, next} = Enum.split(rest, meta_last)
values(next, nodes, meta_ns, [metas | metadata])
end
def values([node_n, meta_n | rest], [node_last | nodes], meta_ns, metadata) do
values(rest, [node_n, node_last - 1 | nodes], [meta_n | meta_ns], metadata)
end
end