Skip to content

Commit 627cfd8

Browse files
Advent of Code 2024 - Day 4 : Python version (#43)
1 parent 6559ca6 commit 627cfd8

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
2+
prefix_dir = {
3+
"up": [-1, 0],
4+
"down": [1, 0],
5+
"left": [0, -1],
6+
"right": [0, 1],
7+
"up-left": [-1, -1],
8+
"up-right": [-1, 1],
9+
"down-left": [1, -1],
10+
"down-right": [1, 1],
11+
}
12+
13+
def _solve_matrix_part1(matrix:list[str], target:str, x:int, y:int, dir:str) -> bool:
14+
15+
if x<0 or x>len(matrix)-1 or y<0 or y>len(matrix[0])-1:
16+
return False
17+
if matrix[x][y] != target[0]:
18+
return False
19+
if len(target) == 1:
20+
return True
21+
return _solve_matrix_part1(matrix,target[1:],x+prefix_dir[dir][0], y+prefix_dir[dir][1], dir)
22+
23+
def solve_day4_part1(matrix:list[str]) -> int:
24+
25+
target = "XMAS"
26+
res = 0
27+
for i in range(len(matrix)):
28+
for j in range(len(matrix[0])):
29+
for dir in prefix_dir.keys():
30+
res += int(_solve_matrix_part1(matrix, target, i, j, dir))
31+
32+
return res
33+
34+
def _solve_matrix_part2(matrix:list[str], x:int, y:int) -> bool:
35+
36+
if x+2>len(matrix)-1 or y+2>len(matrix[0])-1:
37+
return False
38+
x1_char = matrix[x][y] + matrix[x+1][y+1] + matrix[x+2][y+2]
39+
x2_char = matrix[x][y+2] + matrix[x+1][y+1] + matrix[x+2][y]
40+
41+
targets = ("MAS", "SAM")
42+
if x1_char in targets and x2_char in targets:
43+
return True
44+
45+
return False
46+
47+
def solve_day4_part2(matrix:list[str]) -> int:
48+
49+
res = 0
50+
for i in range(len(matrix)):
51+
for j in range(len(matrix[0])):
52+
res += _solve_matrix_part2(matrix, i, j)
53+
return res
54+
55+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import unittest
2+
3+
from day4 import solve_day4_part1, solve_day4_part2
4+
5+
6+
matrix_day4 = [
7+
"MMMSXXMASM",
8+
"MSAMXMSMSA",
9+
"AMXSXMAAMM",
10+
"MSAMASMSMX",
11+
"XMASAMXAMM",
12+
"XXAMMXXAMA",
13+
"SMSMSASXSS",
14+
"SAXAMASAAA",
15+
"MAMMMXMMMM",
16+
"MXMXAXMASX",
17+
]
18+
19+
20+
21+
class TestDay4(unittest.TestCase):
22+
23+
def test_part1(self):
24+
self.assertEqual(solve_day4_part1(matrix_day4), 18)
25+
26+
def test_part2(self):
27+
self.assertEqual(solve_day4_part2(matrix_day4), 9)
28+
29+
if __name__ == "__main__":
30+
unittest.main()

0 commit comments

Comments
 (0)