Powered by AppSignal & Oban Pro

AoC 2022 Day 4

2022/day04.livemd

AoC 2022 Day 4

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

Input

input_field = Kino.Input.textarea("Puzzle input")
input = Kino.Input.read(input_field)

Part 1

to_range = fn str ->
  [from, to] = String.split(str, "-") |> Enum.map(&String.to_integer/1)
  from..to
end

pairs =
  input
  |> String.split("\n")
  |> Enum.map(fn pair ->
    pair
    |> String.split(",")
    |> Enum.map(to_range)
    |> Enum.map(&MapSet.new/1)
    |> List.to_tuple()
  end)

pairs
|> Enum.filter(fn {left, right} ->
  MapSet.subset?(left, right) || MapSet.subset?(right, left)
end)
|> Enum.count()

Part 2

pairs
|> Enum.reject(fn {l, r} -> MapSet.disjoint?(l, r) end)
|> Enum.count()