Skip to content
This repository was archived by the owner on Oct 6, 2025. It is now read-only.

Commit 162bc4e

Browse files
authored
Solve both parts
1 parent 271124d commit 162bc4e

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

Day22/python/paul2708/day22.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
from typing import Tuple, List, Dict
2+
3+
from tqdm import tqdm
4+
5+
from shared.paul2708.input_reader import *
6+
from shared.paul2708.output import write
7+
8+
lines = read_plain_input(day=22)
9+
initial_secrets = [int(line) for line in lines]
10+
11+
12+
def mix(secret: int, given_value: int) -> int:
13+
return secret ^ given_value
14+
15+
16+
def prune(secret: int) -> int:
17+
return secret % 16777216
18+
19+
20+
def next_secret(secret: int) -> int:
21+
intermediate = prune(mix(secret, secret << 6))
22+
intermediate = prune(mix(intermediate, intermediate >> 5))
23+
intermediate = prune(mix(intermediate, intermediate << 11))
24+
25+
return intermediate
26+
27+
28+
def compute_secrets(init_secret: int) -> List[int]:
29+
secrets = [init_secret]
30+
31+
current_secret = init_secret
32+
for _ in range(2000):
33+
current_secret = next_secret(current_secret)
34+
secrets.append(current_secret)
35+
36+
return secrets
37+
38+
39+
def last_digit(val: int) -> int:
40+
return val % 10
41+
42+
43+
def prepare_changes_and_bananas(sequence: List[int]) -> Dict[Tuple, int]:
44+
diff_sequence = []
45+
46+
for i in range(len(sequence) - 1):
47+
diff_sequence.append(last_digit(sequence[i + 1]) - last_digit(sequence[i]))
48+
49+
bananas = dict()
50+
for i in range(len(diff_sequence) - 4):
51+
if tuple(diff_sequence[i:i + 4]) in bananas:
52+
continue
53+
54+
bananas[tuple(diff_sequence[i:i + 4])] = last_digit(sequence[i + 4])
55+
56+
return bananas
57+
58+
59+
changes_and_bananas = []
60+
monkey_instructions = set()
61+
secrets_sum = 0
62+
63+
for initial_secret in tqdm(initial_secrets):
64+
sequence = compute_secrets(initial_secret)
65+
changes_and_bananas.append(prepare_changes_and_bananas(sequence))
66+
67+
monkey_instructions.update(changes_and_bananas[-1].keys())
68+
69+
secrets_sum += sequence[-1]
70+
71+
write(f"The sum of all generated secrets is <{secrets_sum}>.")
72+
73+
total_bananas = -1
74+
for monkey_diff in tqdm(monkey_instructions):
75+
bananas = 0
76+
77+
for i in range(len(changes_and_bananas)):
78+
if monkey_diff in changes_and_bananas[i]:
79+
bananas += changes_and_bananas[i][monkey_diff]
80+
81+
if bananas > total_bananas:
82+
total_bananas = bananas
83+
84+
write(f"In total, I can get <{total_bananas}> bananas.")

0 commit comments

Comments
 (0)