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

Day4

day04.livemd

Day4

Mix.install([
  {:req, "~> 0.3.0"}
])

Input

# thanks to https://twitter.com/ryoung786/status/1598415749638397962?s=20&t=TLW9UlzqB9uOYhPjuGQuSQ

day = 4
aoc_session = System.fetch_env!("LB_AOC_SESSION_COOKIE")
input_url = "https://adventofcode.com/2022/day/#{day}/input"

input = Req.get!(input_url, headers: [cookie: "session=#{aoc_session}"]).body
input =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(fn line ->
    line
    |> String.split(",")
    |> Enum.map(fn range ->
      [from, to] = String.split(range, "-")

      [String.to_integer(from), String.to_integer(to)]
    end)
  end)

Part 1

input
|> Enum.filter(fn [[from1, to1], [from2, to2]] ->
  (from1 <= from2 and to1 >= to2) or (from2 <= from1 and to2 >= to1)
end)
|> Enum.count()

Part 2

input
|> Enum.map(fn [[from1, to1], [from2, to2]] ->
  range1 = MapSet.new(from1..to1)
  range2 = MapSet.new(from2..to2)

  MapSet.intersection(range1, range2)
end)
|> Enum.reject(&amp;Enum.empty?/1)
|> Enum.count()