add day5 aoc 2024
This commit is contained in:
parent
cf21b4cecc
commit
6f5f934166
1 changed files with 58 additions and 0 deletions
58
elixir/livebook/2024/day5.livemd
Normal file
58
elixir/livebook/2024/day5.livemd
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# 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
|
||||||
|
```
|
Loading…
Add table
Reference in a new issue