Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 02

day-02.livemd

Day 02

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea()("Please enter your Input")
input =
  input
  |> Kino.Input.read()
  |> String.split()
  |> Enum.chunk_every(2, 2)
  |> Enum.map(fn [direction, distance] ->
    %{direction: direction, distance: String.to_integer(distance)}
  end)

Part 1

defmodule Part1 do
  def navigate(instructions, location \\ %{horizontal: 0, depth: 0})
  def navigate([], location), do: location

  def navigate([%{direction: "forward", distance: distance} | rest], location) do
    navigate(rest, %{horizontal: location.horizontal + distance, depth: location.depth})
  end

  def navigate([%{direction: "up", distance: distance} | rest], location) do
    navigate(rest, %{horizontal: location.horizontal, depth: location.depth - distance})
  end

  def navigate([%{direction: "down", distance: distance} | rest], location) do
    navigate(rest, %{horizontal: location.horizontal, depth: location.depth + distance})
  end
end

location = Part1.navigate(input)

location.depth * location.horizontal

Part 2

defmodule Part2 do
  def navigate(instructions, location \\ %{horizontal: 0, depth: 0, aim: 0})
  def navigate([], location), do: location

  def navigate([%{direction: "forward", distance: distance} | rest], location) do
    navigate(rest, %{
      horizontal: location.horizontal + distance,
      depth: location.depth + location.aim * distance,
      aim: location.aim
    })
  end

  def navigate([%{direction: "up", distance: distance} | rest], location) do
    navigate(rest, %{
      horizontal: location.horizontal,
      depth: location.depth,
      aim: location.aim - distance
    })
  end

  def navigate([%{direction: "down", distance: distance} | rest], location) do
    navigate(rest, %{
      horizontal: location.horizontal,
      depth: location.depth,
      aim: location.aim + distance
    })
  end
end

location = Part2.navigate(input)

location.depth * location.horizontal