advent-of-code/2024-python/output/day_04.py

93 lines
2.7 KiB
Python
Raw Normal View History

import re
def solve(data):
row_count = len(data.split())
col_count = len(data.split()[0])
grid = [c for r in data.split() for c in r]
grid_rotated = [c for r in zip(*data.split()[::-1]) for c in r]
needle = r"(?=(XMAS|SAMX))"
p1 = len(re.findall(needle, data))
p1 += len(
re.findall(
needle,
"\n".join(["".join(r) for r in list(zip(*data.split()))]),
)
)
for cells, o in [
(grid, col_count),
(grid[::-1], col_count),
(grid_rotated, row_count),
(grid_rotated[::-1], row_count),
]:
p1 += sum(
all(
[
i % o < (o - 3),
cells[i] == "X",
cells[i + o + 1] == "M",
cells[i + 2 * (o + 1)] == "A",
cells[i + 3 * (o + 1)] == "S",
]
)
for i in range(len(cells) - 3 * (o + 1))
)
p2 = sum(
[
1 <= (i % col_count) < col_count - 1
and grid[i] == "A"
and any(
[
all(
[
grid[i - col_count - 1] == "M",
grid[i - col_count + 1] == "M",
grid[i + col_count - 1] == "S",
grid[i + col_count + 1] == "S",
]
),
all(
[
grid[i - col_count - 1] == "S",
grid[i - col_count + 1] == "S",
grid[i + col_count - 1] == "M",
grid[i + col_count + 1] == "M",
]
),
all(
[
grid[i - col_count - 1] == "M",
grid[i - col_count + 1] == "S",
grid[i + col_count - 1] == "M",
grid[i + col_count + 1] == "S",
]
),
all(
[
grid[i - col_count - 1] == "S",
grid[i - col_count + 1] == "M",
grid[i + col_count - 1] == "S",
grid[i + col_count + 1] == "M",
]
),
]
)
for i in range(col_count + 1, len(grid) - col_count - 1)
]
)
return p1, p2
if __name__ == "__main__":
with open("./input/04.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)