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