Powered by AppSignal & Oban Pro

Day 3

2022/elixir_2022/day_03.livemd

Day 3

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

Input

input = Kino.Input.textarea("Please paste your input file:")

Helpers

defmodule Day03 do
  defp upcase?(char) do
    char == String.upcase(char)
  end

  def char_to_priority(char) do
    <> = char

    cond do
      upcase?(char) -> code - 38
      true -> code - 96
    end
  end

  def common_chars(words) do
    words
    |> Enum.map(&amp;String.graphemes/1)
    |> Enum.map(&amp;MapSet.new/1)
    |> Enum.reduce(&amp;MapSet.intersection(&amp;1, &amp;2))
    # Guaranteed to always have one common value at the end
    |> Enum.at(0)
  end
end

Part 1

input
|> Kino.Input.read()
|> String.splitter("\n")
|> Enum.map(fn line ->
  line
  |> String.split_at(div(String.length(line), 2))
  |> Tuple.to_list()
  |> Day03.common_chars()
  |> Day03.char_to_priority()
end)
|> Enum.sum()

Part 2

input
|> Kino.Input.read()
|> String.splitter("\n")
|> Enum.chunk_every(3)
|> Enum.map(fn group ->
  group
  |> Day03.common_chars()
  |> Day03.char_to_priority()
end)
|> Enum.sum()