def mix_and_prune(secret, value): secret ^= value secret %= 16777216 return secret def generate_secret_numbers(initial_secret, count): secret = initial_secret for _ in range(count): secret = mix_and_prune(secret, secret * 64) secret = mix_and_prune(secret, secret // 32) secret = mix_and_prune(secret, secret * 2048) return secret def calculate_price_changes(secret_numbers): prices = [s % 10 for s in secret_numbers] changes = [prices[i] - prices[i - 1] for i in range(1, len(prices))] return changes def find_best_sequence(buyers_initial_secrets): max_bananas = 0 best_sequence = None all_changes = [] for initial_secret in buyers_initial_secrets: secret_numbers = [initial_secret] for _ in range(2000): secret_numbers.append(generate_secret_numbers(secret_numbers[-1], 1)) changes = calculate_price_changes(secret_numbers) all_changes.append(changes) # Try all possible sequences of four changes for a in range(-9, 10): for b in range(-9, 10): for c in range(-9, 10): for d in range(-9, 10): sequence = [a, b, c, d] bananas = 0 for changes in all_changes: for i in range(len(changes) - 3): if changes[i:i+4] == sequence: bananas += (changes[i+4] + 10) % 10 break if bananas > max_bananas: max_bananas = bananas best_sequence = sequence return max_bananas def main(): with open("input.txt", "r") as file: buyers_initial_secrets = [int(line.strip()) for line in file.readlines()] # Part 1 sum_of_2000th_secrets = sum(generate_secret_numbers(secret, 2000) for secret in buyers_initial_secrets) print(sum_of_2000th_secrets) # Part 2 max_bananas = find_best_sequence(buyers_initial_secrets) print(max_bananas) main()