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

Day 2

2022/day_2.livemd

Day 2

Setup

Mix.install([:kino])
input =
  Kino.Input.textarea("Paste input here",
    default: """
    A Y
    B X
    C Z
    """
  )
games =
  input
  |> Kino.Input.read()
  |> String.split("\n", trim: true)
  |> Stream.map(&String.split(&1, " ", trim: true))
  |> Stream.map(&List.to_tuple/1)

Part 1

defmodule RockPaperScissors1 do
  def get_shape("A"), do: :rock
  def get_shape("X"), do: :rock
  def get_shape("B"), do: :paper
  def get_shape("Y"), do: :paper
  def get_shape("C"), do: :scissors
  def get_shape("Z"), do: :scissors

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

  def get_result(opponent_shape, my_shape) when opponent_shape == my_shape, do: :draw
  def get_result(:rock, :paper), do: :win
  def get_result(:paper, :rock), do: :loss
  def get_result(:rock, :scissors), do: :loss
  def get_result(:scissors, :rock), do: :win
  def get_result(:scissors, :paper), do: :loss
  def get_result(:paper, :scissors), do: :win

  def result_score(:win), do: 6
  def result_score(:draw), do: 3
  def result_score(:loss), do: 0

  def get_score({opponent_move, my_move}) do
    opponent_shape = get_shape(opponent_move)
    my_shape = get_shape(my_move)

    shape_score(my_shape) + (get_result(opponent_shape, my_shape) |> result_score)
  end
end

games
|> Stream.map(&RockPaperScissors1.get_score/1)
|> Enum.sum()

Part 2

defmodule RockPaperScissors2 do
  def get_shape("A"), do: :rock
  def get_shape("B"), do: :paper
  def get_shape("C"), do: :scissors

  def get_response("X"), do: :loss
  def get_response("Y"), do: :draw
  def get_response("Z"), do: :win

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

  def get_shape_for_result(shape, :draw), do: shape
  def get_shape_for_result(:rock, :win), do: :paper
  def get_shape_for_result(:rock, :loss), do: :scissors
  def get_shape_for_result(:paper, :win), do: :scissors
  def get_shape_for_result(:paper, :loss), do: :rock
  def get_shape_for_result(:scissors, :win), do: :rock
  def get_shape_for_result(:scissors, :loss), do: :paper

  def result_score(:win), do: 6
  def result_score(:draw), do: 3
  def result_score(:loss), do: 0

  def get_score({opponent_move, my_response}) do
    opponent_shape = get_shape(opponent_move)
    intended_result = get_response(my_response)

    my_shape = get_shape_for_result(opponent_shape, intended_result)

    shape_score(my_shape) + result_score(intended_result)
  end
end
games
|> Stream.map(&RockPaperScissors2.get_score/1)
|> Enum.sum()