StyleInCode

RSS

 

Day 22 - Advent of Code 2024

22 December 2024

Working solutions for the day 22 puzzles.

Part One

""" day_22_01.py """

# usage: python3 day_22_01.py < input

import sys


def next_secret(x):
    """ next secret number after x """
    def mix(x, y):
        """ x xor y """
        return x ^ y

    def prune(x):
        """ x % (2 ** 24) """
        return x & ((1 << 24) - 1)

    num = prune(mix(x << 6, x))
    num = prune(mix(num >> 5, num))
    num = prune(mix(num << 11, num))

    return num


def next_secret_post_generation(x, gen):
    """ next secret after gen iterations """
    num = x
    for _ in range(gen):
        num = next_secret(num)
    return num


with sys.stdin as infile:
    print(sum(next_secret_post_generation(int(line), 2000) for line in infile))

Part Two

""" day_22_02.py """

# usage: python3 day_22_02.py < input

import sys


def next_secret(x):
    """ next secret number after x """
    def mix(x, y):
        """ x xor y """
        return x ^ y

    def prune(x):
        """ x % (2 ** 24) """
        return x & ((1 << 24) - 1)

    num = prune(mix(x << 6, x))
    num = prune(mix(num >> 5, num))
    num = prune(mix(num << 11, num))

    return num


log = []
with sys.stdin as infile:
    for line in infile:
        s = int(line)
        u = s % 10
        seller = []
        for _ in range(2000):
            secret = next_secret(s)
            units = secret % 10
            diff = units - u
            seller.append((units, diff))
            s, u = secret, units
        log.append(seller)

bananas = {}
for j, seller in enumerate(log):
    processed = set()
    for i in range(len(seller) - 3):
        order = tuple(d for _, d in seller[i:i + 4])
        if order not in processed:
            processed.add(order)
            b = bananas.get(order, 0)
            bananas[order] = b + log[j][i + 3][0]

print(max(bananas.values()))

Categories

Links