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

Day2

day_02/day_2.livemd

Day2

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

Section

input = Kino.Input.textarea("input")
defmodule PartOne do
  @win 6
  @loss 0
  @draw 3
  @rock 1
  @paper 2
  @scissor 3

  defp parse1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn el ->
      String.split(el)
      |> Enum.map(&map(&1))
    end)
  end

  defp parse2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn el ->
      String.split(el)
      |> Enum.map(&map2(&1))
    end)
  end

  defp map(el) do
    case el do
      "A" -> "Rock"
      "X" -> "Rock"
      "B" -> "Paper"
      "Y" -> "Paper"
      "C" -> "Scissor"
      "Z" -> "Scissor"
    end
  end

  defp map2(el) do
    case el do
      "A" -> "Rock"
      "X" -> "lose"
      "B" -> "Paper"
      "Y" -> "draw"
      "C" -> "Scissor"
      "Z" -> "win"
    end
  end

  defp checkScore(val) do
    case val do
      ["Rock", "Paper"] -> @paper + @win
      ["Rock", "Rock"] -> @rock + @draw
      ["Rock", "Scissor"] -> @loss + @scissor
      ["Paper", "Paper"] -> @paper + @draw
      ["Paper", "Rock"] -> @loss + @rock
      ["Paper", "Scissor"] -> @scissor + @win
      ["Scissor", "Paper"] -> @loss + @paper
      ["Scissor", "Rock"] -> @rock + @win
      ["Scissor", "Scissor"] -> @scissor + @draw
      ["Rock", "lose"] -> @scissor + @loss
      ["Rock", "win"] -> @paper + @win
      ["Rock", "draw"] -> @rock + @draw
      ["Paper", "lose"] -> @rock + @loss
      ["Paper", "win"] -> @scissor + @win
      ["Paper", "draw"] -> @paper + @draw
      ["Scissor", "lose"] -> @paper + @loss
      ["Scissor", "win"] -> @rock + @win
      ["Scissor", "draw"] -> @scissor + @draw
    end
  end

  def result1(data) do
    parse1(data) |> Enum.reduce(0, fn val, acc -> checkScore(val) + acc end)
  end

  def result2(data) do
    parse2(data) |> Enum.reduce(0, fn val, acc -> checkScore(val) + acc end)
  end
end

Test

ExUnit.start(autorun: false)

defmodule Day2Test do
  use ExUnit.Case, async: true
  @input input

  setup do
    %{data: Kino.Input.read(@input)}
  end

  test "part one", %{data: data} do
    assert PartOne.result1(data) == 15422
  end

  test "part two", %{data: data} do
    assert PartOne.result2(data) == 15442
  end
end

ExUnit.run()