1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ def parse (data ):
5
+ # Converting to a 2D int array!
6
+ return [[int (x ) for x in line ] for line in data .split ('\n ' )]
7
+
8
+ split_data = parse
9
+ completed = True
10
+ raw_data = None # Not To be touched
11
+
12
+ def part1 (data ):
13
+ movement = [(0 , 1 ), (0 , - 1 ), (1 , 0 ), (- 1 , 0 )]
14
+
15
+ def calc_score (y0 , x0 ):
16
+ seen = set ()
17
+ queue = [(x0 , y0 )]
18
+ score = 0
19
+
20
+ while queue :
21
+ x , y = queue .pop (0 )
22
+
23
+ for dx , dy in movement :
24
+ nx , ny = x + dx , y + dy
25
+ if not (0 <= nx < len (data [0 ]) and 0 <= ny < len (data )): continue # Out of bounds
26
+ if data [ny ][nx ] - data [y ][x ] != 1 : continue # Min increase of 1
27
+ if f"{ nx } ,{ ny } " in seen : continue # Avoid repeats
28
+
29
+ seen .add (f"{ nx } ,{ ny } " )
30
+ if data [ny ][nx ] == 9 :
31
+ score += 1
32
+ else :
33
+ queue .append ((nx , ny ))
34
+
35
+ return score
36
+
37
+ cum = 0
38
+ for y , line in enumerate (data ):
39
+ for x , height in enumerate (line ):
40
+ if height != 0 : continue
41
+ cum += calc_score (y , x )
42
+
43
+
44
+ return cum
45
+
46
+ def part2 (data ):
47
+ movement = [(0 , 1 ), (0 , - 1 ), (1 , 0 ), (- 1 , 0 )]
48
+
49
+ def calc_score (y0 , x0 ):
50
+ # Same stuff but removed the "seen" part!
51
+ queue = [(x0 , y0 )]
52
+ score = 0
53
+
54
+ while queue :
55
+ x , y = queue .pop (0 )
56
+
57
+ for dx , dy in movement :
58
+ nx , ny = x + dx , y + dy
59
+ if not (0 <= nx < len (data [0 ]) and 0 <= ny < len (data )): continue # Out of bounds
60
+ if data [ny ][nx ] - data [y ][x ] != 1 : continue # Min increase of 1
61
+ if data [ny ][nx ] == 9 :
62
+ score += 1
63
+ else :
64
+ queue .append ((nx , ny ))
65
+
66
+ return score
67
+
68
+ cum = 0
69
+ for y , line in enumerate (data ):
70
+ for x , height in enumerate (line ):
71
+ if height != 0 : continue
72
+ cum += calc_score (y , x )
73
+
74
+
75
+ return cum
0 commit comments