aoc2022/day4.livemd
2022-12-11 23:33:50 +01:00

2 KiB

AOC 2022 - Template - fork

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

Puzzle description

Day 4: Camp Cleanup.

Input

defmodule Load do
  def input do
    aoc_session = System.fetch_env!("LB_AOC_SESSION")
    input_url = "https://adventofcode.com/2022/day/4/input"
    Req.get!(input_url, headers: [cookie: "session=#{aoc_session}"]).body
  end
end

Solution

defmodule Util do
  def process(input) do
    input
    |> String.trim()
    |> String.split("\n", trim: true)
    |> Enum.map(&pairs_to_range/1)
  end

  defp pairs_to_range(pairs) do
    pairs
    |> String.split(",")
    |> Enum.map(&to_range/1)
  end

  defp to_range(pair) do
    pair =
      pair
      |> String.split("-")
      |> Enum.map(&String.to_integer/1)

    apply(Range, :new, pair)
  end
end
defmodule Part1 do
  def run(input) do
    input
    |> Util.process()
    |> Enum.reduce(0, fn [first, second], acc ->
      first = MapSet.new(first)
      second = MapSet.new(second)

      if MapSet.subset?(first, second) or MapSet.subset?(second, first) do
        acc + 1
      else
        acc
      end
    end)
  end
end

defmodule Part2 do
  def run(input) do
    input
    |> Util.process()
    |> Enum.reduce(0, fn [first, second], acc ->
      first = MapSet.new(first)
      second = MapSet.new(second)

      if MapSet.disjoint?(first, second) do
        acc
      else
        acc + 1
      end
    end)
  end
end

ExUnit.start(autorun: false)

defmodule Test do
  use ExUnit.Case, async: true
  @example_input ~s(2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8)
  @input Load.input()

  test "it loads the input" do
    assert String.length(@input) > 0
  end

  test "part 1 example" do
    assert Part1.run(@example_input) === 2
  end

  test "part 1" do
    assert Part1.run(@input) === 441
  end

  test "part 2 example" do
    assert Part2.run(@example_input) === 4
  end

  test "part 2" do
    assert Part2.run(@input) === 861
  end
end

ExUnit.run()