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, github: "livebook-dev/kino"}])

kino_input = Kino.Input.textarea("Please paste your input file: ")

Part 1

input = Kino.Input.read(kino_input)

input
|> String.split("\n", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.map(fn number ->
  Enum.reduce(1..2000, number, fn _, current_num ->
    current_num = rem(Bitwise.bxor(current_num, current_num * 64), 16777216)
    current_num = rem(Bitwise.bxor(current_num, div(current_num, 32)), 16777216)
    current_num = rem(Bitwise.bxor(current_num, current_num * 2048), 16777216)

    current_num
  end)
end)
|> Enum.sum()

Part 2

input = Kino.Input.read(kino_input)

step = fn secret_num ->
  secret_num = rem(Bitwise.bxor(secret_num, secret_num * 64), 16777216)
  secret_num = rem(Bitwise.bxor(secret_num, div(secret_num, 32)), 16777216)
  secret_num = rem(Bitwise.bxor(secret_num, secret_num * 2048), 16777216)

  secret_num
end

input
|> String.split("\n", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.map(fn secret_num ->
  1..2000
  |> Enum.map_reduce(secret_num, fn _, current_num ->
    {rem(current_num, 10), step.(current_num)}
  end)
  |> elem(0)
  |> Enum.chunk_every(5, 1, :discard)
  |> Enum.reduce(%{}, fn [a, b, c, d, total_price], changes ->
    Map.put_new(changes, {b - a, c - b, d - c, total_price - d}, total_price)
  end)
end)
|> Enum.reduce(fn map1, map2 ->
  Map.merge(map1, map2, fn _, val1, val2 ->
    val1 + val2
  end)
end)
|> Enum.max_by(fn {_seq, total_price} -> total_price end)
|> elem(1)