Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advent of Code 2024 - Day 22

2024/day-22.livemd

Advent of Code 2024 - Day 22

Mix.install([
  {:kino_aoc, "~> 0.1.7"}
])

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2024", "22", System.fetch_env!("LB_AOC_SESSION"))
:math.log2(16777216) |> trunc()
defmodule AoC2024.Day22 do
  import Bitwise

  @modulo (16777216 - 1)
  
  def rand(seed) do
    seed =
      seed
      |> bsl(6)
      |> bxor(seed)
      |> band(@modulo)

    seed =
      seed
      |> bsr(5)
      |> bxor(seed)
      |> band(@modulo)

    
    seed
    |> bsl(11)
    |> bxor(seed)
    |> band(@modulo)
  end
end
input =
  puzzle_input
  |> String.split()
  |> Enum.map(&String.to_integer/1)
input
|> Enum.map(fn initial ->
  initial
  |> Stream.iterate(&AoC2024.Day22.rand/1)
  |> Enum.at(2000)
end)
|> Enum.sum()
input
|> Stream.map(fn initial ->
  initial
  |> Stream.iterate(&AoC2024.Day22.rand/1)
  |> Stream.take(2001)
  |> Stream.map(&rem(&1, 10))
  |> Stream.chunk_every(2, 1, :discard)
  |> Stream.map(fn [a, b] -> {b - a, b} end)
  |> Stream.chunk_every(4, 1, :discard)
  |> Stream.map(fn chunk ->
    {Enum.map(chunk, &elem(&1, 0)), elem(List.last(chunk), 1)}
  end)
  |> Enum.reduce(%{}, fn {k, v}, acc ->
    Map.update(acc, k, v, & &1)
  end)
end)
|> Enum.reduce(fn map1, map2 ->
  Map.merge(map1, map2, fn _k, v1, v2 -> v1 + v2 end)
end)
|> Stream.map(&elem(&1, 1))
|> Enum.max()