diff --git a/elixir/livebook/2024/day22.livemd b/elixir/livebook/2024/day22.livemd index 5b8ce16..df2bc54 100644 --- a/elixir/livebook/2024/day22.livemd +++ b/elixir/livebook/2024/day22.livemd @@ -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) -```