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

Day2

day2.livemd

Day2

Part 1

path = "Projects/aoc/2022/day2.txt"
input = File.read!(path)
defmodule RPS do
  @moves %{
    "A" => :rock,
    "B" => :paper,
    "C" => :scissors,
    "X" => :rock,
    "Y" => :paper,
    "Z" => :scissors
  }
  @scores %{rock: 1, paper: 2, scissors: 3}
  def run(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.reduce(0, fn x, acc ->
      l = String.split(x)
      calculate_pts(l) + acc
    end)
  end

  def calculate_pts([h, t]) do
    alien_move = Map.get(@moves, h)
    you_move = Map.get(@moves, t)
    score = Map.get(@scores, you_move)

    case play(alien_move, you_move) do
      :win -> score + 6
      :draw -> score + 3
      :lose -> score + 0
    end
  end

  def play(a, b) when a == b, do: :draw
  def play(:rock, :paper), do: :win
  def play(:rock, :scissors), do: :lose
  def play(:paper, :scissors), do: :win
  def play(:paper, :rock), do: :lose
  def play(:scissors, :rock), do: :win
  def play(:scissors, :paper), do: :lose
end

RPS.run(input)

Part 2

defmodule RPS do
  @moves %{"A" => :rock, "B" => :paper, "C" => :scissors, "X" => :lose, "Y" => :draw, "Z" => :win}
  @scores %{rock: 1, paper: 2, scissors: 3}

  def run(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.reduce(0, fn x, acc ->
      l = String.split(x)
      calculate_pts(l) + acc
    end)
  end

  def calculate_pts([h, t]) do
    alien_move = Map.get(@moves, h)
    desired_outcome = Map.get(@moves, t)
    you_move = determine_play(alien_move, desired_outcome)
    score = Map.get(@scores, you_move)

    case play(alien_move, you_move) do
      :win -> score + 6
      :draw -> score + 3
      :lose -> score + 0
    end
  end

  def determine_play(alien, :win) do
    case alien do
      :rock -> :paper
      :paper -> :scissors
      :scissors -> :rock
    end
  end

  def determine_play(alien, :lose) do
    case alien do
      :rock -> :scissors
      :paper -> :rock
      :scissors -> :paper
    end
  end

  def determine_play(alien, :draw), do: alien

  def play(a, b) when a == b, do: :draw
  def play(:rock, :paper), do: :win
  def play(:rock, :scissors), do: :lose
  def play(:paper, :rock), do: :lose
  def play(:paper, :scissors), do: :win
  def play(:scissors, :rock), do: :win
  def play(:scissors, :paper), do: :lose
end

RPS.run(input)