Skip to content

Commit 12ec873

Browse files
committed
2024 d22: Optimize solution, calc p1 and p2 together
1 parent e72e712 commit 12ec873

File tree

1 file changed

+14
-21
lines changed

1 file changed

+14
-21
lines changed

2024/solutions/day22.py

+14-21
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,8 @@
44
from collections import defaultdict
55

66

7-
def transform(n):
8-
for _ in range(2000):
9-
n = ((n << 6) ^ n) & 0xffffff
10-
n = ((n >> 5) ^ n) & 0xffffff
11-
n = ((n << 11) ^ n) & 0xffffff
12-
13-
return n
14-
15-
167
def map_sequence(n):
17-
value_map = {}
8+
diff_map = {}
189
prev = n % 10
1910
key = 0
2011

@@ -29,30 +20,32 @@ def map_sequence(n):
2920
# Use key as a compact hash of the last 4 diff values, using 5 bits
3021
# per value ([-9, 9] -> [1, 19]) with 0 meaning "no value".
3122
key = ((key & 0x7fff) << 5) | (value - prev + 10)
32-
if key not in value_map:
33-
value_map[key] = value
23+
if key not in diff_map:
24+
diff_map[key] = value
3425

3526
prev = value
3627

37-
return value_map
28+
return n, diff_map
3829

3930

4031
def solve(numbers):
41-
total_value = defaultdict(int)
32+
total_final_values = 0
33+
sequence_value = defaultdict(int)
34+
35+
for final_value, diff_map in map(map_sequence, numbers):
36+
total_final_values += final_value
4237

43-
for value_map in map(map_sequence, numbers):
44-
for seq, value in value_map.items():
45-
total_value[seq] += value
38+
for seq, value in diff_map.items():
39+
sequence_value[seq] += value
4640

47-
return max(total_value.values())
41+
return total_final_values, max(sequence_value.values())
4842

4943

5044
# Open the first argument as input or use stdin if no arguments were given
5145
fin = open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin
5246

5347
numbers = list(map(int, fin.read().splitlines()))
54-
ans1 = sum(map(transform, numbers))
55-
print('Part 1:', ans1)
5648

57-
ans2 = solve(numbers)
49+
ans1, ans2 = solve(numbers)
50+
print('Part 1:', ans1)
5851
print('Part 2:', ans2)

0 commit comments

Comments
 (0)