From 8a74cdd86d814952a33b9abbb90fa34cc3aed755 Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Tue, 31 Dec 2024 14:14:39 -0500 Subject: [PATCH] add 2024 day 22 --- elixir/livebook/2024/day22.livemd | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 elixir/livebook/2024/day22.livemd diff --git a/elixir/livebook/2024/day22.livemd b/elixir/livebook/2024/day22.livemd new file mode 100644 index 0000000..27aca69 --- /dev/null +++ b/elixir/livebook/2024/day22.livemd @@ -0,0 +1,86 @@ +# Untitled notebook + +```elixir +[{:kino_benchee, "~> 0.1.0"}] |> Mix.install +``` + +## Section + +```elixir +input = """ +""" +``` + +## Section + +```elixir +defmodule MonkeyMarket do + @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 + acc -> Map.merge( + m, + acc, + fn _, s1, s2 -> + s1+s2 + end + ) + end + |> Enum.max_by(&elem(&1, 1)) + |> elem(1) + end + @doc """ + + ## Example + iex> MonkeyMarket.part1([1,10,100,2024]) + 37327623 + """ + def part1(input) do + input + |> Stream.map(&hd(MonkeyMarket.next(&1, 2000))) + |> Enum.sum() + end + + def next(a) do + a = a |> Bitwise.bsl(6) |> Bitwise.bxor(a) |> Bitwise.band(16777215) + a = a |> Bitwise.bsr(5) |> Bitwise.bxor(a) |> Bitwise.band(16777215) + a |> Bitwise.bsl(11) |> Bitwise.bxor(a) |> Bitwise.band(16777215) + end + + def next(a, x) when is_integer(a), do: next([a], x) + def next(a, 0), do: a + def next([prev | _ ] = a, n), do: next([next(prev) | a], n - 1) +end +``` + +```elixir +Benchee.run(%{ + part1: fn -> MonkeyMarket.part1(input) end +}) + +``` + +```elixir +MonkeyMarket.part2(input) +```