Finish day 4

This commit is contained in:
Erwin Boskma 2022-12-11 23:33:50 +01:00
parent a56a8ffd18
commit 5bbf30e554
Signed by: erwin
SSH key fingerprint: SHA256:CyeNoWXd3kjX2Nwu6pDxxdS7OqmPVOy0NavA/KU/ntU

122
day4.livemd Normal file
View file

@ -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()
```