58 lines
1,014 B
Markdown
58 lines
1,014 B
Markdown
# AOC 2024 Day 5
|
|
|
|
## Section
|
|
|
|
```elixir
|
|
input = """
|
|
"""
|
|
```
|
|
|
|
```elixir
|
|
[rules, updates] = input |> String.split("\n\n")
|
|
```
|
|
|
|
```elixir
|
|
rules = for rule <- rules |> String.split("\n"),
|
|
[a, b] = rule |> String.split("|"),
|
|
a = String.to_integer(a),
|
|
b = String.to_integer(b)
|
|
do
|
|
{a, b}
|
|
end
|
|
```
|
|
|
|
```elixir
|
|
updates = for update <- updates |> String.trim() |> String.split("\n"),
|
|
update = update |> String.trim() |> String.split(",") do
|
|
for page <- update,
|
|
page = String.to_integer(page) do
|
|
page
|
|
end
|
|
end
|
|
```
|
|
|
|
```elixir
|
|
rule_sorter = fn a, b ->
|
|
a_precedes_b = Enum.any?(rules, &(&1 == {a, b}))
|
|
b_precedes_a = Enum.any?(rules, &(&1 == {b, a}))
|
|
cond do
|
|
b_precedes_a -> false
|
|
a_precedes_b -> true
|
|
true -> true
|
|
end
|
|
end
|
|
```
|
|
|
|
```elixir
|
|
for update <- updates,
|
|
sorted = Enum.sort(update, rule_sorter),
|
|
sorted != update,
|
|
reduce: 0 do
|
|
acc ->
|
|
len = sorted |> Enum.count
|
|
mid_idx = floor(len / 2)
|
|
acc + Enum.at(sorted, mid_idx)
|
|
end
|
|
|
|
# 10495 too high
|
|
```
|