Powered by AppSignal & Oban Pro

Day 2

2022/elixir_2022/day_02.livemd

Day 2

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

Input

input = Kino.Input.textarea("Please paste your input file:")

Helpers

myMoveMap = %{
  "X" => 0,
  "Y" => 1,
  "Z" => 2
}

opponentMoveMap = %{
  "A" => 0,
  "B" => 1,
  "C" => 2
}

defmodule Day02 do
  def computeScore(opponentMove, myMove) do
    winningMove = (opponentMove + 1) |> rem(3)
    score = myMove + 1

    cond do
      myMove == winningMove -> score + 6
      myMove == opponentMove -> score + 3
      true -> score
    end
  end
end

parsed_input =
  input
  |> Kino.Input.read()
  |> String.splitter("\n")

Part 1

parsed_input
|> Enum.map(fn line ->
  [opponentMove, myMove] = String.split(line)
  Day02.computeScore(opponentMoveMap[opponentMove], myMoveMap[myMove])
end)
|> Enum.sum()

Part 2

parsed_input
|> Enum.map(fn line ->
  [opponentMove, gameResult] = String.split(line)

  myMove =
    cond do
      gameResult == "X" -> (opponentMoveMap[opponentMove] + 2) |> rem(3)
      gameResult == "Y" -> opponentMoveMap[opponentMove]
      gameResult == "Z" -> (opponentMoveMap[opponentMove] + 1) |> rem(3)
    end

  Day02.computeScore(opponentMoveMap[opponentMove], myMove)
end)
|> Enum.sum()