Powered by AppSignal & Oban Pro

Day 2

2021/notebooks/day-02.livemd

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)