Powered by AppSignal & Oban Pro

Day 4

advent_of_code/2022/day-04.livemd

Day 4

Day 4: Camp Cleanup

Day 4: Camp Cleanup

Input

input = """
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
"""

Part 1

f = fn lines, delimiter, func ->
  lines
  |> Enum.map(fn s ->
    s
    |> String.split(delimiter)
    |> func.()
  end)
end

input
|> String.split("\n", trim: true)
|> f.(",", fn lines ->
  f.(lines, "-", fn [a, b] ->
    Range.new(String.to_integer(a), String.to_integer(b))
  end)
end)
|> Enum.filter(fn [r1, r2] ->
  if Range.size(r1) < Range.size(r2) do
    Enum.all?(r1, &(&1 in r2))
  else
    Enum.all?(r2, &(&1 in r1))
  end
end)
|> Enum.count()

Part 1 another

input
|> String.split("\n", trim: true)
|> f.(",", & &1)
|> Enum.map(fn lines ->
  f.(lines, "-", fn [a, b] ->
    Range.new(String.to_integer(a), String.to_integer(b))
  end)
end)
|> Enum.filter(fn [r1, r2] ->
  if Range.size(r1) < Range.size(r2) do
    Enum.all?(r1, &(&1 in r2))
  else
    Enum.all?(r2, &(&1 in r1))
  end
end)
|> Enum.count()

Part 2

input
|> String.split("\n", trim: true)
|> f.(",", fn lines ->
  f.(lines, "-", fn [a, b] ->
    Range.new(String.to_integer(a), String.to_integer(b))
  end)
end)
|> Enum.filter(fn [r1, r2] ->
  if Range.size(r1) < Range.size(r2) do
    Enum.any?(r1, &(&1 in r2))
  else
    Enum.any?(r2, &(&1 in r1))
  end
end)
|> Enum.count()