Powered by AppSignal & Oban Pro

Day 3

2022/day3.livemd

Day 3

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

Section

input = Kino.Input.textarea("input fileP")

Common

defmodule Day3 do
  def find_intersection([backpack1, backpack2]) do
    MapSet.to_list(MapSet.intersection(MapSet.new(backpack1), MapSet.new(backpack2)))
    |> hd()
  end

  def find_intersection_in_group([group1, group2, group3]) do
    MapSet.to_list(
      MapSet.intersection(
        MapSet.intersection(MapSet.new(group1), MapSet.new(group2)),
        MapSet.new(group3)
      )
    )
    |> hd
  end

  def find_char_value(char) do
    case is_lowercase?(char) do
      true -> (char |> String.to_charlist() |> hd) - 96
      false -> (char |> String.to_charlist() |> hd) - 38
    end
  end

  defp is_lowercase?(value), do: Regex.match?(~r/[a-z]/, value)
end

Part 1

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(fn rucksack ->
  rucksack
  |> String.split("", trim: true)
  |> Enum.chunk_every(round(String.length(rucksack) / 2))
  |> Day3.find_intersection()
  |> Day3.find_char_value()
end)
|> Enum.sum()

Part 2

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.chunk_every(3)
|> Enum.map(fn rucksack_group ->
  rucksack_group
  |> Enum.map(fn rucksack ->
    rucksack
    |> String.split("", trim: true)
  end)
  |> Day3.find_intersection_in_group()
  |> Day3.find_char_value()
end)
|> Enum.sum()