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

Advent of Code - Dia 2

day02_2021_elixir_livebook_notebook.livemd

Advent of Code - Dia 2

Dados

input_aoc = """
forward 8
forward 1
down 9
down 8
down 5
forward 4
up 9
forward 7
forward 2
down 6
forward 7
forward 5
forward 8
down 7
up 8
forward 1
forward 6
down 8
up 3
forward 3
down 3
down 7
forward 5
down 1
down 9
forward 4
up 7
forward 9
forward 1
down 6
down 5
down 4
forward 9
forward 1
forward 4
up 3
up 6
forward 1
forward 9
forward 4
down 1
down 9
forward 7
forward 8
down 8
down 8
down 4
down 5
up 3
forward 4
down 1
forward 2
forward 1
forward 8
up 2
forward 5
forward 4
forward 5
forward 8
down 4
down 5
down 8
down 7
down 6
forward 4
up 8
forward 6
down 2
down 7
up 7
down 2
down 6
forward 5
forward 2
forward 8
down 5
down 6
down 6
up 7
down 7
forward 8
down 7
down 7
down 2
down 2
forward 3
up 5
down 3
up 3
down 4
up 9
down 1
up 1
forward 3
up 3
forward 9
up 6
down 3
down 6
forward 4
forward 5
forward 8
down 6
down 9
down 4
down 5
forward 7
down 3
forward 8
forward 3
up 9
forward 5
forward 8
forward 1
down 4
up 2
forward 1
down 1
forward 5
down 8
down 2
forward 3
forward 2
forward 1
down 7
forward 1
down 4
forward 7
forward 5
down 8
down 2
up 4
up 8
forward 6
up 2
down 8
up 9
forward 3
up 5
down 3
down 5
up 6
forward 3
up 9
down 4
forward 8
up 3
forward 6
forward 7
forward 8
forward 6
down 9
forward 4
up 8
forward 3
forward 3
forward 6
down 3
forward 5
down 4
down 4
up 4
down 8
down 4
down 1
down 7
down 7
up 9
down 7
forward 2
down 1
down 8
forward 8
forward 4
forward 6
forward 8
forward 6
forward 8
forward 7
forward 6
up 7
down 6
down 9
down 2
down 8
down 4
up 6
up 8
forward 3
down 7
down 3
forward 3
forward 3
down 4
down 1
up 3
forward 3
down 5
up 6
down 6
forward 1
down 3
down 6
down 9
down 3
forward 8
down 1
forward 7
forward 1
forward 3
up 3
down 8
forward 4
down 4
down 4
down 8
down 5
down 8
forward 6
forward 7
down 9
forward 2
up 9
down 5
forward 2
down 5
down 8
forward 1
forward 6
forward 2
forward 6
down 7
up 7
down 7
forward 7
up 8
forward 9
down 5
up 6
up 6
forward 3
down 5
forward 1
down 4
down 4
down 1
up 6
down 8
down 9
down 2
up 2
up 7
forward 5
down 5
up 2
forward 2
up 1
forward 2
up 4
up 7
forward 2
down 4
down 1
forward 4
up 6
forward 1
up 7
down 8
down 5
down 1
up 7
down 5
forward 4
forward 2
down 2
down 6
forward 1
forward 2
up 6
down 1
forward 2
down 5
down 9
down 6
up 8
forward 3
down 6
up 3
down 8
down 8
forward 2
forward 1
forward 7
forward 8
forward 2
forward 5
down 6
down 3
forward 5
up 8
forward 6
up 9
forward 7
up 3
down 7
down 3
up 8
down 5
forward 3
down 1
forward 1
forward 2
down 7
down 6
down 9
forward 3
down 7
down 7
down 5
forward 4
down 4
forward 5
forward 1
forward 4
down 8
up 4
down 6
down 8
up 1
forward 7
up 3
forward 6
forward 8
forward 9
forward 2
up 6
forward 7
forward 3
up 3
up 6
down 8
up 4
forward 9
down 9
up 3
up 3
down 4
up 3
down 2
down 4
up 9
down 1
forward 6
forward 3
down 3
forward 4
forward 3
forward 8
forward 1
down 1
up 4
up 9
down 8
forward 3
forward 2
down 4
down 1
forward 8
down 8
up 8
up 7
down 4
forward 6
up 5
down 1
down 3
down 9
forward 3
forward 9
down 1
down 6
forward 8
up 1
down 9
down 3
forward 5
forward 9
forward 8
up 7
down 2
down 5
forward 6
down 9
down 4
down 7
down 4
forward 7
down 8
up 8
forward 2
up 3
down 4
forward 2
forward 4
up 4
forward 4
forward 9
down 9
up 1
forward 1
down 8
up 7
up 9
down 8
down 7
forward 9
forward 1
up 3
forward 8
forward 6
forward 5
up 2
forward 8
up 7
down 8
down 2
up 9
down 7
forward 5
forward 4
down 9
forward 4
forward 5
up 1
down 8
down 8
down 4
forward 3
down 1
up 7
down 8
forward 4
down 5
forward 1
down 9
forward 9
up 7
up 1
down 3
forward 3
down 8
forward 9
down 3
up 7
forward 1
up 8
up 2
up 1
forward 8
down 3
forward 5
up 3
forward 6
forward 9
forward 2
forward 6
down 5
forward 2
down 7
up 6
forward 8
forward 6
down 3
forward 8
down 1
forward 2
down 9
up 5
down 6
up 4
forward 6
forward 5
forward 2
forward 9
forward 8
up 4
forward 4
forward 9
forward 4
forward 7
up 6
down 5
forward 8
down 8
up 3
down 4
up 8
up 5
forward 3
down 8
down 9
down 1
forward 7
down 8
up 4
down 8
up 4
down 5
forward 1
forward 3
down 6
down 5
forward 4
up 2
down 7
down 3
up 9
forward 5
forward 3
forward 2
up 2
down 9
up 1
down 2
forward 3
forward 8
forward 5
down 2
down 2
up 3
down 8
forward 4
forward 6
forward 5
up 9
down 7
up 7
up 2
down 2
up 4
forward 2
forward 2
down 7
forward 5
down 2
up 7
forward 6
forward 5
down 1
forward 8
forward 3
forward 2
up 3
down 1
forward 6
forward 5
forward 9
down 5
up 3
down 1
down 5
forward 1
down 1
down 1
forward 6
up 8
forward 9
up 5
up 5
forward 9
forward 3
forward 4
down 8
forward 9
forward 9
up 2
down 6
down 2
forward 1
down 7
up 4
forward 3
down 6
forward 5
down 6
up 5
forward 6
up 6
forward 7
forward 5
forward 1
down 9
forward 7
forward 4
forward 1
forward 6
up 7
forward 6
down 3
forward 4
down 1
down 9
down 8
forward 7
down 7
up 5
forward 1
forward 4
forward 8
forward 6
forward 2
forward 4
forward 2
forward 6
forward 5
down 4
down 3
forward 6
forward 3
up 6
down 3
down 2
forward 1
down 9
up 1
forward 8
forward 1
forward 1
forward 4
down 5
forward 7
forward 5
up 5
up 7
forward 7
forward 5
down 3
down 2
down 7
forward 7
forward 4
down 9
forward 2
down 6
forward 3
up 6
down 8
down 7
down 6
down 7
up 5
up 9
down 4
up 6
forward 1
forward 2
forward 4
up 5
down 2
down 3
forward 9
down 9
down 3
forward 5
forward 3
down 1
up 7
forward 7
forward 5
down 8
up 6
down 7
forward 5
up 7
up 6
forward 2
forward 6
down 1
up 8
down 9
down 1
forward 9
up 9
down 2
forward 6
up 3
down 1
up 9
down 6
up 2
up 6
forward 9
forward 8
up 7
forward 6
up 3
up 4
down 6
forward 1
forward 9
down 9
down 6
forward 1
forward 2
up 3
down 4
down 9
down 3
down 2
forward 7
down 9
forward 9
forward 5
down 9
forward 1
forward 6
down 6
up 8
up 8
up 3
forward 7
forward 7
forward 8
down 5
forward 3
down 4
down 6
forward 1
down 1
forward 7
forward 2
down 7
down 1
up 6
forward 3
down 6
forward 2
down 6
forward 8
down 4
up 8
forward 9
up 5
forward 3
down 6
forward 4
forward 4
down 8
up 5
up 9
down 8
forward 1
down 6
down 3
forward 1
down 4
up 6
down 6
down 6
down 5
forward 5
forward 6
down 1
down 9
down 4
up 7
down 2
forward 5
down 8
down 8
down 6
down 1
up 8
down 1
down 4
forward 6
down 3
down 6
up 4
down 6
up 7
down 3
forward 2
up 3
forward 7
up 7
up 4
forward 5
down 9
down 2
down 9
up 6
forward 9
forward 3
down 1
forward 7
forward 2
down 5
forward 3
forward 7
forward 4
forward 7
forward 6
forward 3
down 6
forward 3
down 1
up 6
up 9
down 1
forward 1
down 1
up 7
forward 8
forward 4
up 4
forward 7
down 3
up 8
up 1
down 6
forward 8
forward 7
up 7
down 4
down 4
down 8
up 3
forward 5
down 4
forward 9
forward 6
forward 6
forward 7
down 6
down 3
forward 2
up 8
forward 1
down 9
up 7
down 3
down 3
up 5
up 4
up 8
forward 2
down 5
forward 7
up 8
up 6
forward 5
down 5
forward 2
down 6
forward 7
down 6
forward 5
forward 3
forward 9
down 7
forward 7
forward 7
forward 7
forward 1
forward 2
forward 2
down 6
down 8
forward 3
down 9
down 5
up 5
forward 3
forward 9
down 7
down 9
down 9
down 9
forward 6
down 1
forward 6
forward 8
forward 8
down 4
forward 8
down 9
forward 6
down 2
down 1
down 5
forward 5
forward 8
forward 7
forward 7
forward 8
down 5
forward 3
up 5
forward 5
down 9
up 8
down 2
forward 8
forward 5
up 5
forward 4
down 3
forward 4
up 3
forward 1
forward 8
forward 3
down 2
up 8
forward 2
down 8
forward 3
up 2
up 1
down 9
down 8
forward 1
forward 1
down 8
forward 9
up 2
forward 4
forward 2
up 2
down 8
down 1
forward 1
forward 3
forward 6
up 6
down 2
up 1
down 3
forward 3
up 5
down 9
down 7
forward 8
up 5
up 4
forward 8
forward 5
down 8
up 8
forward 7
up 8
down 6
down 2
down 3
forward 9
down 4
down 2
down 1
up 2
up 4
forward 3
forward 1
forward 9
forward 1
down 7
up 7
forward 5
down 3
forward 3
down 4
down 1
up 5
down 8
down 2
forward 4
up 9
down 3
down 3
down 2
forward 7
down 2
forward 6
up 8
forward 5
forward 5
up 9
forward 8
forward 9
down 5
forward 5
down 3
forward 5
down 1
forward 6
forward 6
forward 1
forward 2
up 5
forward 9
"""

input = """
forward 5
down 5
forward 8
up 3
down 8
forward 2
"""

Código

defmodule Dia02 do
  # PARTE 1
  def processa_comando("forward " <> valor) do
    {String.to_integer(valor), 0}
  end

  def processa_comando("down " <> valor) do
    {0, String.to_integer(valor)}
  end

  def processa_comando("up " <> valor) do
    {0, -String.to_integer(valor)}
  end

  def resolve_parte_1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&amp;Dia02.processa_comando/1)
    |> Enum.reduce(fn {x1, y1}, {x2, y2} -> {x1 + x2, y1 + y2} end)
    |> then(fn {x, y} -> x * y end)
  end

  # PARTE 2

  def processa_comando_2("forward " <> valor) do
    {String.to_integer(valor), 0, 0}
  end

  def processa_comando_2("down " <> valor) do
    {0, 0, String.to_integer(valor)}
  end

  def processa_comando_2("up " <> valor) do
    {0, 0, -String.to_integer(valor)}
  end

  def movimenta(instrucoes) do
    movimenta(instrucoes, {0, 0, 0})
    |> then(fn {x, y, _} -> x * y end)
  end

  defp movimenta([], posicao_atual) do
    posicao_atual
  end

  defp movimenta([{0, 0, aim_increase} | resto], posicao_atual) do
    {horizontal, depth, aim} = posicao_atual
    movimenta(resto, {horizontal, depth, aim + aim_increase})
  end

  defp movimenta([{hor_inc, _dep_inc, _aim_increase} | resto], posicao_atual) do
    {horizontal, depth, aim} = posicao_atual
    movimenta(resto, {horizontal + hor_inc, depth + aim * hor_inc, aim})
  end

  def resolve_parte_2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&amp;Dia02.processa_comando_2/1)
    |> movimenta()
  end
end

Dia02.resolve_parte_1(input)

Dia02.resolve_parte_1(input_aoc)

Dia02.resolve_parte_2(input)

Dia02.resolve_parte_2(input_aoc)