Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advent of Code day 4

2022/day4.livemd

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