@@ -14,45 +14,50 @@ def read_input() -> str:
1414
1515
1616# MAIN
17- def neighbors (x , y , h , w ) -> List [Tuple [int , int ]]:
18- return [(x + i , y + j ) for i in (- 1 , 0 , 1 ) for j in (- 1 , 0 , 1 )
19- if (i , j ) != (0 , 0 ) and - 1 < x + i < h and - 1 < y + j < w ]
2017
18+ def part1 (letters : List [str ]) -> int :
19+ keyword = 'XMAS'
20+ height , width = len (letters ), len (letters [0 ])
2121
22- def part1 (given : List [str ]) -> int :
23- KEYWORD = 'XMAS'
22+ def neighbors (x , y ) -> List [Tuple [int , int ]]:
23+ return [(x + i , y + j ) for i in (- 1 , 0 , 1 ) for j in (- 1 , 0 , 1 )
24+ if (i , j ) != (0 , 0 ) and - 1 < x + i < height and - 1 < y + j < width ]
2425
25- def bfs (letters : List [str ], paths : List [List [Tuple [int , int ]]]):
26- if not paths :
27- return []
28- identified = []
26+ def bfs (paths : List [List [Tuple [int , int ]]]):
27+ # identified = []
28+ counter = 0
2929 for p in paths :
3030 x , y = p [- 1 ]
31- if letters [x ][y ] == KEYWORD [len (p ) - 1 ]:
32- if len (p ) == len (KEYWORD ):
33- identified .append (p )
31+ if letters [x ][y ] == keyword [len (p ) - 1 ]:
32+ if len (p ) == len (keyword ):
33+ # identified.append(p)
34+ counter += 1
3435 else :
35- for nx , ny in neighbors (x , y , len ( letters ), len ( letters [ 0 ]) ):
36+ for nx , ny in neighbors (x , y ):
3637 if len (p ) < 2 or p [- 2 ][0 ] - x == x - nx and p [- 2 ][1 ] - y == y - ny : # word must not break, i.e. have the same direction
37- identified .extend (bfs (letters , [p + [(nx , ny )]]))
38+ # identified.extend(bfs([p + [(nx, ny)]]))
39+ counter += bfs ([p + [(nx , ny )]])
3840
39- return identified
41+ # return identified
42+ return counter
4043
41- height , width = len ( given ), len ( given [ 0 ])
42- found = []
44+ # found = []
45+ result = 0
4346 for x in range (height ):
4447 for y in range (width ):
45- f = bfs (given , [[(x , y )]])
46- found .extend (f )
47- return len (found )
48+ # found.extend(bfs([[(x, y)]]))
49+ result += bfs ([[(x , y )]])
50+ # return len(found)
51+ return result
4852
4953
5054def part2 (given : List [str ]) -> int :
5155 def get_x_chars (letters , x , y ):
5256 return '' .join (letters [i ][j ] for i , j in [(x - 1 , y - 1 ), (x - 1 , y + 1 ), (x + 1 , y - 1 ), (x + 1 , y + 1 )])
5357
5458 height , width = len (given ), len (given [0 ])
55- found = []
59+ # found = []
60+ result = 0
5661 for x , line in enumerate (given ):
5762 for y , char in enumerate (line ):
5863 if (
@@ -63,16 +68,14 @@ def get_x_chars(letters, x, y):
6368 # ..A.. OR ..A.. OR ..A.. OR ..A..
6469 # .S.S. .M.S. .M.M. .S.M.
6570 ):
66- found .append ((x , y ))
67- return len (found )
71+ # found.append((x, y))
72+ result += 1
73+ # return len(found)
74+ return result
6875
6976
7077# TEST
7178def test ():
72- assert neighbors (0 , 0 , 2 , 2 ) == [(0 , 1 ), (1 , 0 ), (1 , 1 )]
73- assert neighbors (1 , 1 , 2 , 2 ) == [(0 , 0 ), (0 , 1 ), (1 , 0 )]
74- assert neighbors (1 , 1 , 3 , 3 ) == [(0 , 0 ), (0 , 1 ), (0 , 2 ), (1 , 0 ), (1 , 2 ), (2 , 0 ), (2 , 1 ), (2 , 2 )]
75-
7679 given = parser ("""
7780MMMSXXMASM
7881MSAMXMSMSA
0 commit comments