Advent of Code day 4
Mix.install([
{:kino, "~> 0.7.0"}
])
:ok
Puzzle input
example = "2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8"
"2-4,6-8\n2-3,4-5\n5-7,7-9\n2-8,3-7\n6-6,4-6\n2-6,4-8"
input = Kino.Input.textarea("Puzzle input")
defmodule Day4 do
def parse(input) do
input
|> String.split("\n")
|> Enum.map(&transform_pair/1)
end
defp transform_pair(pair) do
pair
|> String.split(",")
|> Enum.map(&transform_range/1)
|> Enum.map(fn [rstart, rend] -> Range.new(rstart, rend) end)
end
defp transform_range(range) do
range
|> String.split("-")
|> Enum.map(&parse_integer!/1)
end
defp parse_integer!(value) do
{int, _} = Integer.parse(value)
int
end
end
{:module, Day4, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:parse_integer!, 1}}
# parsed = Day4.parse(example)
parsed = input |> Kino.Input.read() |> Day4.parse()
[
[20..45, 13..44],
[7..8, 8..28],
[3..39, 14..97],
[35..99, 35..98],
[18..49, 17..19],
[33..34, 34..46],
[46..58, 58..75],
[4..93, 25..97],
[92..99, 7..91],
[61..62, 24..61],
[35..62, 34..63],
[85..87, 3..86],
[9..49, 7..48],
[5..87, 87..95],
[3..3, 3..82],
[13..63, 25..62],
[4..99, 1..98],
[72..80, 74..77],
[9..96, 95..97],
[50..68, 51..76],
[34..80, 33..33],
[37..98, 21..37],
[9..71, 10..72],
[40..94, 39..94],
[1..88, 88..92],
[46..47, 46..51],
[14..59, 14..60],
[69..99, 22..95],
[9..66, 9..65],
[62..69, 64..69],
[6..40, 16..70],
[58..97, 9..82],
[12..56, 12..46],
[71..85, 25..70],
[70..86, 86..97],
[47..70, 46..69],
[11..65, 65..66],
[56..58, 57..85],
[33..66, 33..65],
[67..67, 10..67],
[21..55, 20..22],
[15..72, 15..71],
[19..92, 45..93],
[38..82, 38..83],
[23..90, 90..90],
[96..98, 5..97],
[33..38, 32..33],
[42..42, 26..41],
[31..92, ...],
[...],
...
]
Part 1
parsed
|> Enum.reduce(0, fn [range1, range2], acc ->
range1 = MapSet.new(range1)
range2 = MapSet.new(range2)
if MapSet.subset?(range1, range2) or
MapSet.subset?(range2, range1) do
acc + 1
else
acc
end
end)
441
Part 2
parsed
|> Enum.reduce(0, fn [range1, range2], acc ->
range1 = MapSet.new(range1)
range2 = MapSet.new(range2)
unless MapSet.disjoint?(range1, range2) do
acc + 1
else
acc
end
end)
861