Powered by AppSignal & Oban Pro

Day 3

2022/elixir/day-3.livemd

Day 3

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

Section

input = Kino.Input.textarea("")
defmodule Part1 do
  def solve(input) do
    input
    |> String.split("\n")
    |> Enum.map(&String.split_at(&1, String.length(&1) |> div(2)))
    |> Enum.map(fn {front, back} ->
      f = String.to_charlist(front)
      b = String.to_charlist(back)

      f
      |> Enum.find(&(&1 in b))
      |> priority()
    end)
    |> Enum.sum()
  end

  defp priority(c) when c >= ?a, do: c - ?a + 1
  defp priority(c), do: c - ?A + 27
end

Kino.Input.read(input)
|> Part1.solve()
defmodule Part2 do
  def solve(input) do
    input
    |> String.split("\n")
    |> Enum.chunk_every(3)
    |> Enum.map(fn [l1, l2, l3] ->
      s1 = String.to_charlist(l1) |> MapSet.new()
      s2 = String.to_charlist(l2) |> MapSet.new()
      s3 = String.to_charlist(l3) |> MapSet.new()

      s1
      |> MapSet.intersection(s2)
      |> MapSet.intersection(s3)
      |> Enum.to_list()
      |> hd()
      |> priority()
    end)
    |> Enum.sum()
  end

  defp priority(c) when c >= ?a, do: c - ?a + 1
  defp priority(c), do: c - ?A + 27
end

Kino.Input.read(input)
|> Part2.solve()