Finish day 4
This commit is contained in:
parent
a56a8ffd18
commit
5bbf30e554
1 changed files with 122 additions and 0 deletions
122
day4.livemd
Normal file
122
day4.livemd
Normal 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()
|
||||||
|
```
|
Loading…
Reference in a new issue