|
@@ -0,0 +1,24 @@
|
|
|
|
|
+#!/usr/bin/env python3
|
|
|
|
|
+import sys
|
|
|
|
|
+
|
|
|
|
|
+def reflect(pat, multiplier=100):
|
|
|
|
|
+ for mirror in range(len(pat) - 1):
|
|
|
|
|
+ if all(pat[mirror - dist] == pat[mirror + dist + 1]
|
|
|
|
|
+ for dist in range(min(mirror + 1, len(pat) - mirror - 1))):
|
|
|
|
|
+ yield multiplier * (mirror + 1)
|
|
|
|
|
+ if multiplier == 100:
|
|
|
|
|
+ yield from reflect(list(map(''.join, zip(*pat))), 1)
|
|
|
|
|
+
|
|
|
|
|
+def fix_and_reflect(pat, old_reflection):
|
|
|
|
|
+ for y, row in enumerate(pat):
|
|
|
|
|
+ for x, smudge in enumerate(row):
|
|
|
|
|
+ newrow = row[:x] + '#.'[smudge == '#'] + row[x + 1:]
|
|
|
|
|
+ newpat = pat[:y] + [newrow] + pat[y + 1:]
|
|
|
|
|
+ for reflection in reflect(newpat):
|
|
|
|
|
+ if reflection != old_reflection:
|
|
|
|
|
+ return reflection
|
|
|
|
|
+
|
|
|
|
|
+patterns = [pat.split() for pat in sys.stdin.read().split('\n\n')]
|
|
|
|
|
+reflections = [next(reflect(pat)) for pat in patterns]
|
|
|
|
|
+print(sum(reflections))
|
|
|
|
|
+print(sum(fix_and_reflect(*p) for p in zip(patterns, reflections)))
|