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

Advent of Code day 2

2022/day2.livemd

Advent of Code day 2

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

Puzzle input

example = "A Y
B X
C Z"
"A Y\nB X\nC Z"
input = Kino.Input.textarea("Puzzle input")
parsed =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(&String.split/1)
  |> Enum.map(fn round ->
    Enum.map(round, fn val ->
      cond do
        val in ["A", "X"] -> 1
        val in ["B", "Y"] -> 2
        val in ["C", "Z"] -> 3
      end
    end)
  end)
[
  [1, 2],
  [2, 3],
  [3, 2],
  [2, 2],
  [1, 2],
  [1, 2],
  [1, 1],
  [1, 2],
  [2, 3],
  [1, 2],
  [2, 2],
  [1, 3],
  [1, 2],
  [3, 3],
  [1, 3],
  [1, 2],
  [2, 2],
  [1, 2],
  [1, 2],
  [2, 3],
  [1, 3],
  [3, 2],
  [1, 1],
  [2, 3],
  [2, 3],
  [2, 2],
  [1, 2],
  [1, 2],
  [2, 3],
  [2, 3],
  [2, 3],
  [2, 3],
  [1, 2],
  [3, 3],
  [1, 1],
  [2, 3],
  [2, 3],
  [2, 2],
  [2, 3],
  [1, 2],
  [2, 2],
  [2, 3],
  [2, 2],
  [1, 2],
  [2, 2],
  [2, 3],
  [2, 3],
  [1, 2],
  [2, ...],
  [...],
  ...
]

Part 1

parsed
|> Enum.map(fn [opponent, player] ->
  cond do
    opponent == player -> player + 3
    opponent == 1 and player == 2 -> player + 6
    opponent == 2 and player == 3 -> player + 6
    opponent == 3 and player == 1 -> player + 6
    opponent == 1 and player == 3 -> player
    opponent == 2 and player == 1 -> player
    opponent == 3 and player == 2 -> player
  end
end)
|> Enum.sum()
15632

Part 2

parsed
|> Enum.map(fn [opponent, player] ->
  cond do
    player == 2 -> opponent + 3
    player == 1 and opponent == 1 -> 3
    player == 1 and opponent == 2 -> 1
    player == 1 and opponent == 3 -> 2
    player == 3 and opponent == 1 -> 2 + 6
    player == 3 and opponent == 2 -> 3 + 6
    player == 3 and opponent == 3 -> 1 + 6
  end
end)
|> Enum.sum()
14416