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

day-2

advent_of_code_2022/day2.livemd

day-2

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

Section

input = Kino.Input.textarea("Input")
defmodule RPS do
  def decode_move("A"), do: "Rock"
  def decode_move("B"), do: "Paper"
  def decode_move("C"), do: "Scisors"
  def decode_move("X"), do: "Rock"
  def decode_move("Y"), do: "Paper"
  def decode_move("Z"), do: "Scisors"

  def play("Rock", "Rock"), do: 3
  def play("Rock", "Paper"), do: 6
  def play("Rock", "Scisors"), do: 0
  def play("Paper", "Rock"), do: 0
  def play("Paper", "Paper"), do: 3
  def play("Paper", "Scisors"), do: 6
  def play("Scisors", "Rock"), do: 6
  def play("Scisors", "Paper"), do: 0
  def play("Scisors", "Scisors"), do: 3

  def score_move("Rock"), do: 1
  def score_move("Paper"), do: 2
  def score_move("Scisors"), do: 3
end

input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.map(fn row ->
  [oponent, me] = String.split(row, " ")
  oponent_move = RPS.decode_move(oponent)
  me_move = RPS.decode_move(me)
  RPS.play(oponent_move, me_move) + RPS.score_move(me_move)
end)
|> Enum.sum()
defmodule RPS2 do
  def decode_move("A"), do: "Rock"
  def decode_move("B"), do: "Paper"
  def decode_move("C"), do: "Scisors"

  def decode_outcome("X"), do: :lose
  def decode_outcome("Y"), do: :draw
  def decode_outcome("Z"), do: :win

  def score_outcome(:lose), do: 0
  def score_outcome(:win), do: 6
  def score_outcome(:draw), do: 3

  def get_move("Rock", :lose), do: "Scisors"
  def get_move("Rock", :win), do: "Paper"
  def get_move("Rock", :draw), do: "Rock"
  def get_move("Paper", :lose), do: "Rock"
  def get_move("Paper", :win), do: "Scisors"
  def get_move("Paper", :draw), do: "Paper"
  def get_move("Scisors", :lose), do: "Paper"
  def get_move("Scisors", :win), do: "Rock"
  def get_move("Scisors", :draw), do: "Scisors"

  def score_move("Rock"), do: 1
  def score_move("Paper"), do: 2
  def score_move("Scisors"), do: 3
end

input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.map(fn row ->
  [oponent, outcome] = String.split(row, " ")
  oponent_move = RPS2.decode_move(oponent)
  outcome = RPS2.decode_outcome(outcome)
  move = RPS2.get_move(oponent_move, outcome)
  RPS2.score_outcome(outcome) + RPS.score_move(move)
end)
|> Enum.sum()