93 lines
2.7 KiB
Python
93 lines
2.7 KiB
Python
|
|
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)
|