add 2024/11
This commit is contained in:
parent
2d00afa860
commit
55259e5568
1 changed files with 95 additions and 0 deletions
95
elixir/livebook/2024/day11.livemd
Normal file
95
elixir/livebook/2024/day11.livemd
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# AOC 2024 Day 11
|
||||||
|
|
||||||
|
## Section
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
input = """
|
||||||
|
""" |> String.trim()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
defmodule Blink do
|
||||||
|
def blink(stones) do
|
||||||
|
blink(stones |> Map.to_list(), %{})
|
||||||
|
end
|
||||||
|
|
||||||
|
def blink([], acc), do: acc
|
||||||
|
|
||||||
|
def blink([{0, n} | rest], acc) do
|
||||||
|
blink(rest, acc |> Map.update(1, n, &(&1 + n)))
|
||||||
|
end
|
||||||
|
|
||||||
|
def blink([{stone, n} | rest], acc) do
|
||||||
|
case even_digits?(stone) do
|
||||||
|
{true, x} ->
|
||||||
|
left = left(stone, div(x, 2))
|
||||||
|
right = stone - shift_left(left, div(x, 2))
|
||||||
|
|
||||||
|
blink(
|
||||||
|
rest,
|
||||||
|
acc
|
||||||
|
|> Map.update(left, n, &(&1 + n))
|
||||||
|
|> Map.update(right, n, &(&1 + n))
|
||||||
|
)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
blink(
|
||||||
|
rest,
|
||||||
|
acc |> Map.update(stone * 2024, n, &(&1 + n))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def split_n(n, m) do
|
||||||
|
{left(n, m), right(n, m)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def left(n, 0), do: n
|
||||||
|
|
||||||
|
def left(n, m) do
|
||||||
|
left(div(n, 10), m - 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def right(n, m) do
|
||||||
|
left = left(n, m)
|
||||||
|
right = n - shift_left(left, m)
|
||||||
|
right
|
||||||
|
end
|
||||||
|
|
||||||
|
def shift_left(n, 0), do: n
|
||||||
|
|
||||||
|
def shift_left(n, m) do
|
||||||
|
shift_left(n * 10, m - 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def even_digits?(0), do: {false, 1}
|
||||||
|
|
||||||
|
def even_digits?(n) do
|
||||||
|
even_digits?(n, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
def even_digits?(0, a), do: {rem(a, 2) == 0, a}
|
||||||
|
def even_digits?(n, a), do: even_digits?(div(n, 10), a + 1)
|
||||||
|
|
||||||
|
def solve(input, n) do
|
||||||
|
input = input |> String.split(" ") |> Enum.map(&String.to_integer/1) |> Enum.frequencies()
|
||||||
|
for _ <- 1..n, reduce: input do
|
||||||
|
acc -> Blink.blink(acc)
|
||||||
|
end
|
||||||
|
|> Map.values()
|
||||||
|
|> Enum.sum()
|
||||||
|
end
|
||||||
|
|
||||||
|
def part1(input), do: solve(input, 25)
|
||||||
|
def part2(input), do: solve(input, 75)
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
Blink.part1(input)
|
||||||
|
```
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
Blink.part2(input)
|
||||||
|
```
|
Loading…
Add table
Reference in a new issue