4
4
from collections import defaultdict
5
5
6
6
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
-
16
7
def map_sequence (n ):
17
- value_map = {}
8
+ diff_map = {}
18
9
prev = n % 10
19
10
key = 0
20
11
@@ -29,30 +20,32 @@ def map_sequence(n):
29
20
# Use key as a compact hash of the last 4 diff values, using 5 bits
30
21
# per value ([-9, 9] -> [1, 19]) with 0 meaning "no value".
31
22
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
34
25
35
26
prev = value
36
27
37
- return value_map
28
+ return n , diff_map
38
29
39
30
40
31
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
42
37
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
46
40
47
- return max (total_value .values ())
41
+ return total_final_values , max (sequence_value .values ())
48
42
49
43
50
44
# Open the first argument as input or use stdin if no arguments were given
51
45
fin = open (sys .argv [1 ]) if len (sys .argv ) > 1 else sys .stdin
52
46
53
47
numbers = list (map (int , fin .read ().splitlines ()))
54
- ans1 = sum (map (transform , numbers ))
55
- print ('Part 1:' , ans1 )
56
48
57
- ans2 = solve (numbers )
49
+ ans1 , ans2 = solve (numbers )
50
+ print ('Part 1:' , ans1 )
58
51
print ('Part 2:' , ans2 )
0 commit comments