Skip to content

Latest commit

 

History

History
49 lines (41 loc) · 952 Bytes

day2.livemd

File metadata and controls

49 lines (41 loc) · 952 Bytes

Day 2

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Input:")

Part 1

command_list =
  input
  |> Kino.Input.read()
  |> String.trim()
  |> String.split("\n")
  |> Enum.map(fn command ->
    [dir, amount] = String.split(command, " ")
    {dir, String.to_integer(amount)}
  end)

Enum.reduce(command_list, {0, 0}, fn {dir, amount}, {acc_hz, acc_dp} ->
  case dir do
    "forward" -> {acc_hz + amount, acc_dp}
    "down" -> {acc_hz, acc_dp + amount}
    "up" -> {acc_hz, acc_dp - amount}
  end
end)
|> Kernel.then(fn {hz, dp} -> hz * dp end)

Part 2

Enum.reduce(command_list, {0, 0, 0}, fn {dir, amount}, {acc_hz, acc_dp, aim} ->
  case dir do
    "forward" -> {acc_hz + amount, acc_dp + aim * amount, aim}
    "down" -> {acc_hz, acc_dp, aim + amount}
    "up" -> {acc_hz, acc_dp, aim - amount}
  end
end)
|> Kernel.then(fn {hz, dp, _aim} -> hz * dp end)