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

Advent of Code Day 2

day_02/day_two.livemd

Advent of Code Day 2

Part 1

defmodule Part1 do
  def process_input(input) when is_binary(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&String.split/1)
    |> Enum.map(fn [direction, amount] ->
      {String.to_atom(direction), String.to_integer(amount)}
    end)
  end

  def calculate_position(data) when is_list(data) do
    data
    |> Enum.reduce([0, 0], fn
      {:forward, amount}, [x, y] ->
        [x + amount, y]

      {:down, amount}, [x, y] ->
        [x, y + amount]

      {:up, amount}, [x, y] ->
        [x, y - amount]
    end)
    |> Enum.product()
  end
end

test_data =
  """
  forward 5
  down 5
  forward 8
  up 3
  down 8
  forward 2
  """
  |> Part1.process_input()

data =
  "day_02/input.txt"
  |> File.read!()
  |> Part1.process_input()

Part1.calculate_position(data)
2322630

Part 2

defmodule Part2 do
  def calculate_position(data) when is_list(data) do
    {x, y, _aim} =
      data
      |> Enum.reduce({0, 0, 0}, fn
        {:down, amount}, {x, y, aim} ->
          {x, y, aim + amount}

        {:up, amount}, {x, y, aim} ->
          {x, y, aim - amount}

        {:forward, amount}, {x, y, aim} ->
          {x + amount, y + amount * aim, aim}
      end)

    x * y
  end
end

data
|> Part2.calculate_position()
2105273490