Powered by AppSignal & Oban Pro

Day 4: Camp Cleanup

day-4-camp-cleanup.livemd

Day 4: Camp Cleanup

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

Input

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

Part 1

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(fn x ->
  String.split(x, ",")
  |> Enum.map(&String.split(&1, "-"))
  |> Enum.map(fn [left, right] ->
    Enum.to_list(String.to_integer(left)..String.to_integer(right))
    |> MapSet.new()
  end)
end)
|> Enum.map(fn [left, right] ->
  MapSet.difference(left, right)
  |> MapSet.to_list()
  |> length() < 1 ||
    MapSet.difference(right, left)
    |> MapSet.to_list()
    |> length() < 1
end)
|> Enum.filter(&amp; &amp;1)
|> Enum.count()
# Optimized
Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(fn x ->
  String.split(x, ",")
  |> Enum.map(&amp;String.split(&amp;1, "-"))
  |> Enum.map(fn [left, right] -> [String.to_integer(left), String.to_integer(right)] end)
end)
|> Enum.map(fn [[a, b], [c, d]] ->
  if (a < c &amp;&amp; b < d) || (c < a &amp;&amp; d < b), do: 0, else: 1
end)
|> Enum.sum()

Part 2

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(fn x ->
  String.split(x, ",")
  |> Enum.map(&amp;String.split(&amp;1, "-"))
  |> Enum.map(fn [left, right] ->
    Enum.to_list(String.to_integer(left)..String.to_integer(right))
    |> MapSet.new()
  end)
end)
|> Enum.map(fn [left, right] ->
  MapSet.intersection(left, right)
  |> MapSet.to_list()
  |> length() > 0
end)
|> Enum.filter(&amp; &amp;1)
|> Enum.count()
# Optimized
Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(fn x ->
  String.split(x, ",")
  |> Enum.map(&amp;String.split(&amp;1, "-"))
  |> Enum.map(fn [left, right] -> [String.to_integer(left), String.to_integer(right)] end)
end)
|> Enum.map(fn [[a, b], [c, d]] ->
  if !(b < c) &amp;&amp; !(d < a), do: 1, else: 0
end)
|> Enum.sum()