Skip to content

Commit 69ac264

Browse files
author
Björn Walter
committed
Day 4 in Python.
1 parent 6d38754 commit 69ac264

File tree

4 files changed

+245
-2
lines changed

4 files changed

+245
-2
lines changed

3.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ def find_patterns(pattern):
66
"""
77
Function to find matches using re.
88
9-
Arguments: pattern to look for
10-
Return: list of matches.
9+
Args:
10+
pattern: to look for
11+
Returns (List):
12+
list of matches.
1113
"""
1214

1315

4.py

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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

Comments
 (0)