add 2024/11

This commit is contained in:
Caleb Webber 2025-01-04 23:29:33 -05:00
parent 2d00afa860
commit 55259e5568

View 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)
```