about summary refs log tree commit diff
path: root/aoc/2024/04/part-one.py
diff options
context:
space:
mode:
Diffstat (limited to 'aoc/2024/04/part-one.py')
-rw-r--r--aoc/2024/04/part-one.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/aoc/2024/04/part-one.py b/aoc/2024/04/part-one.py
new file mode 100644
index 0000000..ba25336
--- /dev/null
+++ b/aoc/2024/04/part-one.py
@@ -0,0 +1,23 @@
+from sys import stdin
+
+
+def index(m, n, i, j, c):
+    return (m[i][j], m[n-j-1][i], m[n-i-1][n-j-1], m[j][n-i-1])[c]
+
+
+def rot(m, c):
+    n = len(m)
+    if n != len(m[0]): raise ValueError
+    for i in range(n):
+        yield ''.join(index(m, n, i-j, j, c) for j in range(i+1))
+    for i in range(1, n):
+        yield ''.join(index(m, n, n-j-1, i+j, c) for j in range(n-i))
+
+
+reverse_all = lambda strings: (s[::-1] for s in strings)
+count = lambda strings: sum(s.count('XMAS') for s in strings)
+lines = tuple(map(str.strip, stdin.readlines()))
+columns = tuple(''.join(column) for column in zip(*lines))
+print((count(lines) + count(reverse_all(lines))
+       + count(columns) + count(reverse_all(columns))
+       + sum(count(rot(lines, c)) for c in range(4))))