2024/22 optimizations
This commit is contained in:
parent
eb433c390d
commit
fe538e867a
1 changed files with 53 additions and 22 deletions
|
@ -8,7 +8,8 @@
|
|||
|
||||
```elixir
|
||||
input = """
|
||||
"""
|
||||
""" |> String.split("\n", trim: true)
|
||||
|> Enum.map(&String.to_integer/1)
|
||||
```
|
||||
|
||||
## Section
|
||||
|
@ -17,28 +18,58 @@ input = """
|
|||
defmodule MonkeyMarket do
|
||||
@doc """
|
||||
|
||||
## Example
|
||||
iex> MonkeyMarket.enc_base19([-1,0,9,-9])
|
||||
-9+10+20*(19+20*(10+20*(9)))
|
||||
"""
|
||||
def enc_base19(ints) do
|
||||
ints
|
||||
|> Enum.reduce(
|
||||
0,
|
||||
fn i, acc -> acc * 20 + i + 10 end
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@doc """
|
||||
## Example
|
||||
iex> MonkeyMarket.dec_base19(-9+10+20*(19+20*(10+20*(9))))
|
||||
[-1,0,9,-9]
|
||||
"""
|
||||
def dec_base19(i) do
|
||||
dec_base19(i, [])
|
||||
end
|
||||
defp dec_base19(0, acc), do: acc
|
||||
defp dec_base19(i, acc) do
|
||||
dec_base19(div(i,20),[Integer.mod(i, 20)-10 | acc])
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
||||
## Example
|
||||
iex> MonkeyMarket.part2([1,2,3,2024])
|
||||
23
|
||||
"""
|
||||
def part2(input) do
|
||||
for m <- (
|
||||
for j <- input do
|
||||
diffs = MonkeyMarket.next(j, 2000)
|
||||
|> Stream.map(&rem(&1, 10))
|
||||
|> Enum.reverse()
|
||||
|> Stream.chunk_every(2, 1, :discard)
|
||||
|> Stream.map(fn [a,b] -> {b, b-a} end)
|
||||
|
||||
for [_,_,_,{n,_}] = chunk <- diffs
|
||||
|> Stream.chunk_every(4, 1, :discard),
|
||||
chunk = chunk |> Enum.map(&(elem(&1, 1))),
|
||||
|
||||
reduce: %{} do
|
||||
acc2 ->
|
||||
acc2 |> Map.update(chunk, n, &(&1))
|
||||
end
|
||||
end), reduce: %{} do
|
||||
tasks = for j <- input do
|
||||
Task.async(fn ->
|
||||
diffs = MonkeyMarket.next(j, 2000)
|
||||
|> Stream.map(&rem(&1, 10))
|
||||
|> Enum.reverse()
|
||||
|> Stream.chunk_every(2, 1, :discard)
|
||||
|> Stream.map(fn [a,b] -> {b, b-a} end)
|
||||
|
||||
for [_,_,_,{n,_}] = chunk <- diffs
|
||||
|> Stream.chunk_every(4, 1, :discard),
|
||||
chunk = chunk |> Enum.map(&(elem(&1, 1))),
|
||||
reduce: %{} do
|
||||
acc2 ->
|
||||
acc2 |> Map.put_new(chunk |> enc_base19, n)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
for m <- Task.await_many(tasks, :infinity), reduce: %{} do
|
||||
acc -> Map.merge(
|
||||
m,
|
||||
acc,
|
||||
|
@ -74,13 +105,13 @@ defmodule MonkeyMarket do
|
|||
end
|
||||
```
|
||||
|
||||
```elixir
|
||||
MonkeyMarket.part2(input)
|
||||
```
|
||||
|
||||
```elixir
|
||||
Benchee.run(%{
|
||||
part1: fn -> MonkeyMarket.part1(input) end
|
||||
})
|
||||
|
||||
```
|
||||
|
||||
```elixir
|
||||
MonkeyMarket.part2(input)
|
||||
```
|
||||
|
|
Loading…
Add table
Reference in a new issue