diff --git a/day4.livemd b/day4.livemd new file mode 100644 index 0000000..c8bd64a --- /dev/null +++ b/day4.livemd @@ -0,0 +1,122 @@ +# AOC 2022 - Template - fork + +```elixir +Mix.install([ + {:req, "~> 0.3.3"} +]) +``` + +## Puzzle description + +[Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4). + +## Input + +```elixir +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 + +```elixir +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 +``` + +```elixir +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() +```