Powered by AppSignal & Oban Pro

Advent of code day 00

2021/livebooks/day-02.livemd

Advent of code day 00

Mix.install([
  {:kino, "~> 0.5.0"}
])

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")

Part 01

input
|> Kino.Input.read()
|> String.split(["\n", " "], trim: true)
|> Enum.chunk_every(2)
|> Enum.map(fn [dir, amount] ->
  {String.to_atom(dir), String.to_integer(amount)}
end)
|> Enum.reduce(%{vertical: 0, horizontal: 0}, fn el, acc ->
  case el do
    {:forward, amount} -> %{acc | horizontal: acc.horizontal + amount}
    {:down, amount} -> %{acc | vertical: acc.vertical + amount}
    {:up, amount} -> %{acc | vertical: acc.vertical - amount}
  end
end)
|> then(fn state -> state.vertical * state.horizontal end)

Part 02

input
|> Kino.Input.read()
|> String.split(["\n", " "], trim: true)
|> Enum.chunk_every(2)
|> Enum.map(fn [dir, amount] ->
  {String.to_atom(dir), String.to_integer(amount)}
end)
|> Enum.reduce(%{depth: 0, horizontal: 0, aim: 0}, fn el, acc ->
  case el do
    {:forward, amount} ->
      %{acc | horizontal: acc.horizontal + amount, depth: acc.depth + acc.aim * amount}

    {:down, amount} ->
      %{acc | aim: acc.aim + amount}

    {:up, amount} ->
      %{acc | aim: acc.aim - amount}
  end
end)
|> then(fn state -> state.depth * state.horizontal end)