35 lines
1.2 KiB
Python
Executable File
35 lines
1.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
from collections.abc import Iterable
|
|
|
|
import regex as re
|
|
from common import parse
|
|
|
|
|
|
def transposed(
|
|
matrix: list[str],
|
|
) -> Iterable: # see https://docs.python.org/3/library/itertools.html for the base "transpose" function
|
|
return map(lambda x: "".join(x), zip(*matrix, strict=True))
|
|
|
|
|
|
def solve(input: list[str]) -> int:
|
|
diagonal = 0
|
|
horizontal = sum([len(re.findall(r"(XMAS|SAMX)", line, overlapped=True)) for line in input]) # Horizontal
|
|
vertical = sum([len(re.findall(r"(XMAS|SAMX)", line, overlapped=True)) for line in transposed(input)]) # Vertical
|
|
|
|
for y in range(len(input) - 3):
|
|
for x in range(len(input) - 3):
|
|
# print(y, x, "\\", "".join([input[y + i][x + i] for i in range(4)]))
|
|
diagonal += 1 if "".join([input[y + i][x + i] for i in range(4)]) in ["XMAS", "SAMX"] else 0
|
|
# print(y + 3, x, "/", "".join([input[y + 3 - i][x + i] for i in range(4)]))
|
|
diagonal += 1 if "".join([input[y + 3 - i][x + i] for i in range(4)]) in ["XMAS", "SAMX"] else 0
|
|
# print(diagonal, horizontal, vertical)
|
|
return diagonal + horizontal + vertical
|
|
|
|
|
|
def main():
|
|
print(solve(parse("input")))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|