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

AoC 2022 - day 03

tradfursten-elixir/day_03.livemd

AoC 2022 - day 03

Mix.install([:kino])

Section

input = Kino.Input.textarea("input")
defmodule Day01 do
  def solve1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn l ->
      l
      |> String.codepoints()
      |> Enum.split(div(String.length(l), 2))
      |> (fn {a, b} -> {MapSet.new(a), MapSet.new(b)} end).()
    end)
    |> Enum.map(fn {a, b} ->
      MapSet.intersection(a, b)
    end)
    |> Enum.map(&score/1)
    |> Enum.sum()
  end

  def solve2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&String.codepoints/1)
    |> Enum.map(&MapSet.new/1)
    |> Enum.chunk_every(3)
    |> Enum.map(fn [a, b, c] ->
      MapSet.intersection(a, b) |> MapSet.intersection(c)
    end)
    |> Enum.map(&score/1)
    |> Enum.sum()
  end

  defp score(c) do
    [c] = MapSet.to_list(c)

    cond do
      c >= "a" ->
        :binary.first(c) - 96

      true ->
        :binary.first(c) - 64 + 26
    end
  end
end
Kino.Input.read(input) |> Day01.solve1()
Kino.Input.read(input) |> Day01.solve2()