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() |