AOC 2022-04 (Camp Cleanup)

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

Common Code

Input

input = Kino.Input.textarea("Input")
teams =
  input
  |> Kino.Input.read()
  |> String.split()

Part 1

How many elfs have section asignments totally covered by their partner?

Enum.map(teams, fn team ->
  team
  |> String.split(",")
  |> Enum.flat_map(fn assignment ->
    assignment
    |> String.split("-")
    |> Enum.map(&String.to_integer/1)
    |> Enum.chunk_every(2)
  end)
end)
|> Enum.map(fn [[a1, a2], [b1, b2]] ->
  a = MapSet.new(a1..a2)
  b = MapSet.new(b1..b2)

  cond do
    MapSet.subset?(a, b) -> 1
    MapSet.subset?(b, a) -> 1
    true -> 0
  end
end)
|> Enum.sum()

Part 2

How many teams overlap at all?

Enum.map(teams, fn team ->
  team
  |> String.split(",")
  |> Enum.flat_map(fn assignment ->
    assignment
    |> String.split("-")
    |> Enum.map(&String.to_integer/1)
    |> Enum.chunk_every(2)
  end)
end)
|> Enum.map(fn [[a1, a2], [b1, b2]] ->
  a = MapSet.new(a1..a2)
  b = MapSet.new(b1..b2)

  cond do
    MapSet.disjoint?(a, b) -> 0
    true -> 1
  end
end)
|> Enum.sum()