3
3
import numpy
4
4
from numpy .lib .stride_tricks import sliding_window_view
5
5
6
- from . import SeparateRunner
6
+ from . import CombinedRunner
7
7
8
8
9
9
def advance (secrets : numpy .array ) -> numpy .array :
@@ -15,18 +15,9 @@ def advance(secrets: numpy.array) -> numpy.array:
15
15
return new_secrets
16
16
17
17
18
- class DayRunner (SeparateRunner ):
18
+ class DayRunner (CombinedRunner ):
19
19
@classmethod
20
- def part1 (cls , input : str ) -> int :
21
- secrets = numpy .fromstring (input , dtype = int , sep = "\n " )
22
-
23
- for _ in range (2000 ):
24
- secrets = advance (secrets )
25
-
26
- return secrets .sum ()
27
-
28
- @classmethod
29
- def part2 (cls , input : str ) -> int :
20
+ def run_both (cls , input : str ) -> tuple [int , int ]:
30
21
secrets = numpy .fromstring (input , dtype = int , sep = "\n " )
31
22
32
23
progression = [secrets ]
@@ -37,15 +28,14 @@ def part2(cls, input: str) -> int:
37
28
38
29
field = numpy .stack (progression , axis = - 1 ) % 10
39
30
delta = field [:, 1 :] - field [:, :- 1 ]
31
+ windows = sliding_window_view (delta , 4 , axis = 1 )
40
32
41
33
per_signal = defaultdict (int )
42
34
43
- for row_scores , row_deltas in zip (field , delta ):
44
- unique , positions = numpy .unique (
45
- sliding_window_view (row_deltas , 4 ), return_index = True , axis = 0
46
- )
35
+ for row_scores , row_deltas in zip (field , windows ):
36
+ unique , positions = numpy .unique (row_deltas , return_index = True , axis = 0 )
47
37
48
- for key , index in zip (unique , positions ):
49
- per_signal [tuple (key )] += row_scores [ index + 4 ]
38
+ for key , bananas in zip (unique , row_scores [ positions + 4 ] ):
39
+ per_signal [tuple (key )] += bananas
50
40
51
- return max (per_signal .values ())
41
+ return secrets . sum (), max (per_signal .values ())
0 commit comments