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