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

Untitled

2022/day/2/notebook.livemd

Untitled

input = File.read!("2022/day/2/input.txt") |> String.split("\n") |> Enum.drop(-1)

Section

defmodule X do
  @atom_for %{
    "A" => :rock,
    "B" => :paper,
    "C" => :scissor,
    "X" => :rock,
    "Y" => :paper,
    "Z" => :scissor
  }

  def atomize([a, b]), do: [@atom_for[a], @atom_for[b]]

  @win_score 6
  @draw_score 3
  @lose_score 0

  @counter %{
    rock: :paper,
    paper: :scissor,
    scissor: :rock
  }

  @choice_score %{
    rock: 1,
    paper: 2,
    scissor: 3
  }

  def score([elf, me]) do
    @choice_score[me] +
      cond do
        elf == me -> @draw_score
        @counter[elf] == me -> @win_score
        @counter[me] == elf -> @lose_score
      end
  end
end
input
|> Enum.map(&String.split/1)
|> Enum.map(&X.atomize/1)
|> Enum.map(&X.score/1)
|> Enum.sum()
defmodule Y do
  @atom_for %{
    "A" => :rock,
    "B" => :paper,
    "C" => :scissor,
    "X" => :lose,
    "Y" => :draw,
    "Z" => :win
  }

  def atomize([a, b]), do: [@atom_for[a], @atom_for[b]]

  @counter %{
    rock: :paper,
    paper: :scissor,
    scissor: :rock
  }

  @anti_counter @counter
                |> Map.to_list()
                |> Enum.map(fn {a, b} -> {b, a} end)
                |> Map.new()

  def score([x, y]) do
    X.score([
      x,
      case y do
        :draw -> x
        :win -> @counter[x]
        :lose -> @anti_counter[x]
      end
    ])
  end
end
input
|> Enum.map(&String.split/1)
|> Enum.map(&Y.atomize/1)
|> Enum.map(&Y.score/1)
|> Enum.sum()