Spaces:
Running
Running
| 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() |