Powered by AppSignal & Oban Pro

Day Two

day2.livemd

Day Two

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

Section

input = Kino.Input.textarea("Input")
defmodule DayTwo do
  def solve1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&score/1)
    |> Enum.sum()
  end

  def solve2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&score2/1)
    |> Enum.sum()
  end

  defp score(s) do
    [a, b] = String.split(s, " ")
    w_score(a, b) + b_score(b)
  end

  defp score2(s) do
    [a, b] = String.split(s, " ")
    c = pick(a, b)
    w_score(a, c) + b_score(c)
  end

  defp b_score("X"), do: 1
  defp b_score("Y"), do: 2
  defp b_score("Z"), do: 3

  defp w_score("A", "X"), do: 3
  defp w_score("A", "Y"), do: 6
  defp w_score("A", "Z"), do: 0
  defp w_score("B", "X"), do: 0
  defp w_score("B", "Y"), do: 3
  defp w_score("B", "Z"), do: 6
  defp w_score("C", "X"), do: 6
  defp w_score("C", "Y"), do: 0
  defp w_score("C", "Z"), do: 3

  defp pick("A", "X"), do: "Z"
  defp pick("A", "Y"), do: "X"
  defp pick("A", "Z"), do: "Y"
  defp pick("B", "X"), do: "X"
  defp pick("B", "Y"), do: "Y"
  defp pick("B", "Z"), do: "Z"
  defp pick("C", "X"), do: "Y"
  defp pick("C", "Y"), do: "Z"
  defp pick("C", "Z"), do: "X"
end

DayTwo.solve2(Kino.Input.read(input))