1
+ import re
2
+ import numpy as np
3
+
4
+ """Day 4 of Advent of Code 2024"""
5
+
6
+ def get_all_diagonals (matrix ):
7
+ """Get diagonals."""
8
+ diags = []
9
+ n = len (matrix )
10
+ mat = np .array ([list (s ) for s in matrix ])
11
+ flip_mat = np .fliplr (mat )
12
+
13
+ for i in range (n * 2 - 1 ):
14
+
15
+ # Diagonals
16
+ diag = np .diagonal (mat , i - n + 1 )
17
+ diag_str = ""
18
+ for s in diag :
19
+ diag_str += s
20
+ diags .append (diag_str )
21
+
22
+ # Anti diagonals
23
+ anti_diag = np .diagonal (flip_mat , i - n + 1 )
24
+ anti_diag_str = "" .join (anti_diag )
25
+ diags .append (anti_diag_str )
26
+ return diags
27
+
28
+
29
+ def find_xmas (line ):
30
+ """find the sequence XMAS backwards or forwards."""
31
+ score = 0
32
+ pattern_template = r"XMAS"
33
+ forward = re .findall (pattern_template ,line )
34
+ backward = re .findall (pattern_template , line [::- 1 ])
35
+ score = len (backward ) + len (forward )
36
+ return score
37
+
38
+ def part1 ():
39
+ with open ("./input/4" , 'r' ) as f :
40
+ lines = f .readlines ()
41
+ score = 0
42
+ matrix = []
43
+ for line in lines :
44
+ matrix .append (line .strip ())
45
+ # Horizontal
46
+ for item in matrix :
47
+ score += find_xmas (item )
48
+ # Vertical
49
+ for i in range (len (matrix )):
50
+ line = ""
51
+ for j in range (len (matrix )):
52
+ line += matrix [j ][i ]
53
+ score += find_xmas (line )
54
+ # Diagonals
55
+ diagonals = get_all_diagonals (matrix )
56
+ for diag in diagonals :
57
+ score += find_xmas (diag )
58
+
59
+ return score
60
+
61
+ def x_mas (mat ):
62
+ """Check if 3x3-box contains an 'X-MAS'. """
63
+ diag = "" .join (np .diagonal (mat ))
64
+ anti_diag = "" .join (np .diagonal (np .fliplr (mat )))
65
+ if diag == "MAS" or diag == "SAM" :
66
+ if anti_diag == "MAS" or anti_diag == "SAM" :
67
+ return True
68
+ return False
69
+
70
+
71
+ def part2 ():
72
+ with open ("./input/4" , 'r' ) as f :
73
+ lines = f .readlines ()
74
+ score = 0
75
+ data = []
76
+ for line in lines :
77
+ data .append (line .strip ())
78
+ n = len (data )
79
+ matrix = np .array ([list (s ) for s in data ])
80
+ # 3x3 moving window
81
+ for i in range (n - 2 ):
82
+ for j in range (n - 2 ):
83
+ sub_matrix = matrix [i :i + 3 ,j :j + 3 ]
84
+ if x_mas (sub_matrix ):
85
+ score += 1
86
+
87
+ return score
88
+
89
+ if __name__ == "__main__" :
90
+ print (f"Answer part 1: { part1 ()} " )
91
+ print (f"Answer part 2: { part2 ()} " )
0 commit comments