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