Powered by AppSignal & Oban Pro

AOC day 2

2022/aoc-day-2.livemd

AOC day 2

Section

defmodule Foo do
  def parse(line) do
    line
    |> String.split(" ")
    |> then(fn [their, my] ->
      {
        parse_their(their),
        parse_my(my)
      }
    end)
  end

  def parse_their("A"), do: :rock
  def parse_their("B"), do: :paper
  def parse_their("C"), do: :scissors

  def parse_my("X"), do: :rock
  def parse_my("Y"), do: :paper
  def parse_my("Z"), do: :scissors

  def play(:rock, :rock), do: :draw
  def play(:rock, :paper), do: :win
  def play(:rock, :scissors), do: :lose
  def play(:paper, :rock), do: :lose
  def play(:paper, :paper), do: :draw
  def play(:paper, :scissors), do: :win
  def play(:scissors, :rock), do: :win
  def play(:scissors, :paper), do: :lose
  def play(:scissors, :scissors), do: :draw

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

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

input =
  File.read!("02/input.txt")
  |> String.trim()
  |> IO.inspect()
  |> String.split("\n")
  # |> Enum.take(10)
  |> Enum.reduce(0, fn line, score ->
    {their_play, my_play} = Foo.parse(line)

    result = Foo.play(their_play, my_play)

    play_score = Foo.score_play(my_play)
    result_score = Foo.score_result(result)

    IO.puts(
      "#{their_play} <=> #{my_play}: #{result}. Worth: #{play_score} + #{result_score} #Score so far: #{score}"
    )

    score + play_score + result_score
  end)

Version2

defmodule Foo do
  def parse(line) do
    line
    |> String.split(" ")
    |> then(fn [their, my] ->
      {
        parse_their(their),
        parse_my(my)
      }
    end)
  end

  def parse_their("A"), do: :rock
  def parse_their("B"), do: :paper
  def parse_their("C"), do: :scissors

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

  def play(:rock, :rock), do: :draw
  def play(:rock, :paper), do: :win
  def play(:rock, :scissors), do: :lose
  def play(:paper, :rock), do: :lose
  def play(:paper, :paper), do: :draw
  def play(:paper, :scissors), do: :win
  def play(:scissors, :rock), do: :win
  def play(:scissors, :paper), do: :lose
  def play(:scissors, :scissors), do: :draw

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

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

  def play(their_play, wanted_result)
  def play(:rock, :win), do: :paper
  def play(:rock, :draw), do: :rock
  def play(:rock, :lose), do: :scissors
  def play(:paper, :win), do: :scissors
  def play(:paper, :draw), do: :paper
  def play(:paper, :lose), do: :rock
  def play(:scissors, :win), do: :rock
  def play(:scissors, :draw), do: :scissors
  def play(:scissors, :lose), do: :paper
end

input =
  File.read!("02/input.txt")
  |> String.trim()
  |> IO.inspect()
  |> String.split("\n")
  # |> Enum.take(10)
  |> Enum.reduce(0, fn line, score ->
    {their_play, wanted_result} = Foo.parse(line)

    my_play = Foo.play(their_play, wanted_result)

    result = Foo.play(their_play, my_play)

    play_score = Foo.score_play(my_play)
    result_score = Foo.score_result(result)

    IO.puts(
      "#{their_play} <=> #{my_play}: #{result}. Worth: #{play_score} + #{result_score} #Score so far: #{score}"
    )

    score + play_score + result_score
  end)