Day 2
Setup
input = Aoc.get_input(2)
textarea = Kino.Input.textarea("Puzzle input", default: input)
lines =
Kino.Input.read(textarea)
|> String.split("\n", trim: true)
Part 1
lines
|> Stream.map(&String.split(&1, " "))
|> Stream.map(fn [cmd, n] -> {cmd, String.to_integer(n)} end)
|> Enum.reduce({0, 0}, fn
{"forward", n}, {h, d} -> {h + n, d}
{"down", n}, {h, d} -> {h, d + n}
{"up", n}, {h, d} -> {h, d - n}
end)
|> then(fn {h, d} -> h * d end)
Part 2
lines
|> Stream.map(&String.split(&1, " "))
|> Stream.map(fn [cmd, n] -> {cmd, String.to_integer(n)} end)
|> Enum.reduce({0, 0, 0}, fn
{"forward", n}, {h, d, a} -> {h + n, d + n * a, a}
{"down", n}, {h, d, a} -> {h, d, a + n}
{"up", n}, {h, d, a} -> {h, d, a - n}
end)
|> then(fn {h, d, _} -> h * d end)