Powered by AppSignal & Oban Pro

Day Three

day3.livemd

Day Three

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

Section

input = Kino.Input.textarea("Input")
defmodule DayThree do
  def solve1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&score/1)
    |> Enum.sum()
  end

  def solve2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.chunk_every(3)
    |> Enum.map(&score2/1)
    |> Enum.sum()
  end

  defp score(s) do
    s
    |> String.to_charlist()
    |> Enum.split(floor(String.length(s) / 2))
    |> then(fn {a, b} -> [a, b] end)
    |> Enum.map(&MapSet.new/1)
    |> Enum.reduce(&MapSet.intersection/2)
    |> Enum.to_list()
    |> hd()
    |> priority()
  end

  defp score2(g) do
    g
    |> Enum.map(&String.to_charlist/1)
    |> Enum.map(&MapSet.new/1)
    |> Enum.reduce(&MapSet.intersection/2)
    |> Enum.to_list()
    |> hd()
    |> priority()
  end

  defp priority(c) do
    if ?a <= c && c <= ?z do
      c - ?a + 1
    else
      c - ?A + 27
    end
  end
end

DayThree.solve2(Kino.Input.read(input))