Spaces:
Running
Running
File size: 2,072 Bytes
a4da721 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
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() |