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()