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

Day 2

2022/day_02.livemd

Day 2

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

Common

defmodule Day1 do
  def parse_input(textarea) do
    textarea
    |> Kino.Input.read()
    |> String.split("\n", trim: true)
    |> Enum.map(fn <<
                     opponent::binary-size(1),
                     " ",
                     me::binary-size(1)
                   >> ->
      {opponent, me}
    end)
  end

  def game_score(opponent, me)
  def game_score(:rock, :paper), do: 6
  def game_score(:paper, :scissors), do: 6
  def game_score(:scissors, :rock), do: 6
  def game_score(shape, shape), do: 3
  def game_score(_, _), do: 0

  def shape_score(:rock), do: 1
  def shape_score(:paper), do: 2
  def shape_score(:scissors), do: 3

  def score(opponent, me), do: game_score(opponent, me) + shape_score(me)

  def shape("A"), do: :rock
  def shape("B"), do: :paper
  def shape("C"), do: :scissors
  def shape("X"), do: :rock
  def shape("Y"), do: :paper
  def shape("Z"), do: :scissors
end

Input

textarea = Kino.Input.textarea("Input:")
input = Day1.parse_input(textarea)

Part 1

defmodule Day1.Part1 do
  def run(input) do
    input
    |> Enum.map(fn {opponent, me} ->
      opponent = Day1.shape(opponent)
      me = Day1.shape(me)

      Day1.score(opponent, me)
    end)
    |> Enum.sum()
  end
end
Day1.Part1.run(input)

Part 2

defmodule Day1.Part2 do
  def run(input) do
    input
    |> Enum.map(fn {opponent, result} ->
      opponent = Day1.shape(opponent)
      result = result(result)
      me = shape_for_result(opponent, result)

      Day1.score(opponent, me)
    end)
    |> Enum.sum()
  end

  defp shape_for_result(opponent_shape, needed_result)
  defp shape_for_result(shape, :draw), do: shape
  defp shape_for_result(:rock, :win), do: :paper
  defp shape_for_result(:rock, :lose), do: :scissors
  defp shape_for_result(:paper, :win), do: :scissors
  defp shape_for_result(:paper, :lose), do: :rock
  defp shape_for_result(:scissors, :win), do: :rock
  defp shape_for_result(:scissors, :lose), do: :paper

  defp result("X"), do: :lose
  defp result("Y"), do: :draw
  defp result("Z"), do: :win
end
Day1.Part2.run(input)