Powered by AppSignal & Oban Pro

Day 2: Rock Paper Scissors

day-2-rock-paper-scissors.livemd

Day 2: Rock Paper Scissors

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

Puzzle Input

input = Kino.Input.textarea("Input")

Part 1

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(&String.split(&1, " "))
|> Enum.map(fn [a, b] ->
  score =
    cond do
      a === "C" && b === "X" -> 6
      a === "A" && b === "Y" -> 6
      a === "B" && b === "Z" -> 6
      a === "A" && b === "X" -> 3
      a === "B" && b === "Y" -> 3
      a === "C" && b === "Z" -> 3
      true -> 0
    end

  type =
    cond do
      b === "X" -> 1
      b === "Y" -> 2
      b === "Z" -> 3
      true -> 0
    end

  score + type
end)
|> Enum.sum()

Part 2

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(fn x -> String.split(x, " ") end)
|> Enum.map(fn [a, b] ->
  win = [
    {"A", 2},
    {"B", 3},
    {"C", 1}
  ]

  draw = [
    {"A", 1},
    {"B", 2},
    {"C", 3}
  ]

  lose = [
    {"B", 1},
    {"C", 2},
    {"A", 3}
  ]

  cond do
    b === "X" ->
      Enum.reduce_while(lose, 0, fn {opt, score}, acc ->
        if opt === a, do: {:halt, 0 + score}, else: {:cont, acc}
      end)

    b === "Y" ->
      Enum.reduce_while(draw, 0, fn {opt, score}, acc ->
        if opt === a, do: {:halt, 3 + score}, else: {:cont, acc}
      end)

    b === "Z" ->
      Enum.reduce_while(win, 0, fn {opt, score}, acc ->
        if opt === a, do: {:halt, 6 + score}, else: {:cont, acc}
      end)

    true ->
      0
  end
end)
|> Enum.sum()