|
1 | 1 | import numpy as np
|
| 2 | +import math |
2 | 3 |
|
3 | 4 |
|
4 | 5 | def find_symmetry(pattern):
|
5 | 6 | #horizontal
|
6 |
| - for i, row in enumerate(pattern): |
7 |
| - top = pattern[:i] |
8 |
| - bottom = np.flip(pattern[i:i*2], axis=0) |
| 7 | + for i, _ in enumerate(pattern): |
| 8 | + if i < len(pattern)/2: |
| 9 | + top = pattern[:i] |
| 10 | + bottom = np.flip(pattern[i:i*2], axis=0) |
| 11 | + else: |
| 12 | + bottom = np.flip(pattern[i:], axis=0) |
| 13 | + top = pattern[i-len(bottom):i] |
| 14 | + if np.array_equal(top, bottom) and i != 0: |
| 15 | + return i*100 |
| 16 | + #vertical |
| 17 | + hpattern = pattern.T |
| 18 | + |
| 19 | + for i, _ in enumerate(hpattern): |
| 20 | + if i < len(hpattern)/2: |
| 21 | + top = hpattern[:i] |
| 22 | + bottom = np.flip(hpattern[i:i*2], axis=0) |
| 23 | + else: |
| 24 | + bottom = np.flip(hpattern[i:], axis=0) |
| 25 | + top = hpattern[i-len(bottom):i] |
9 | 26 | if np.array_equal(top, bottom) and i != 0:
|
10 |
| - return i, "horizontal" |
11 |
| - for j, _ in enumerate(pattern[0]): |
12 |
| - left = pattern[:,:j] |
13 |
| - right = np.flip(pattern[:, j:j*2], axis=0) |
14 |
| - print(left, right) |
15 |
| - if np.array_equal(left, right) and j != 0: |
16 |
| - return j, "vertical" |
| 27 | + return i |
| 28 | + |
| 29 | +def all_versions(pattern): |
| 30 | + versions = [] |
| 31 | + |
| 32 | + r, c = len(pattern), len(pattern[0]) |
| 33 | + |
| 34 | + for i in range(r): |
| 35 | + for j in range(c): |
| 36 | + smudged_pattern = [row.copy() for row in pattern] |
| 37 | + smudged_pattern[i][j] = "#" if pattern[i][j] == "." else "." |
| 38 | + |
| 39 | + versions.append(smudged_pattern) |
| 40 | + return versions |
17 | 41 |
|
18 | 42 |
|
19 | 43 | def main():
|
20 |
| - with open("inputs/13_test.txt", "r") as file: |
| 44 | + with open("inputs/13.txt", "r") as file: |
21 | 45 | lines = file.readlines()
|
22 | 46 | patterns = []
|
23 | 47 | pattern = []
|
24 | 48 | for i, line in enumerate(lines):
|
25 |
| - if line == "\n" or i == len(lines)-1: |
26 |
| - patterns.append(np.array([list(map(str, row)) for row in pattern])) |
| 49 | + if i == len(lines)-1: |
| 50 | + pattern.append(line.strip("\n")) |
| 51 | + patterns.append(np.array([list(map(str, row)) for row in pattern])) |
| 52 | + if line == "\n": |
| 53 | + patterns.append(np.array([list(map(str, row)) for row in pattern])) |
27 | 54 | pattern = []
|
28 | 55 | else:
|
29 | 56 | pattern.append(line.strip("\n"))
|
30 |
| - find_symmetry(patterns[0]) |
| 57 | + scores = [] |
| 58 | + #find_symmetry(patterns[2]) |
| 59 | + for pattern in patterns: |
| 60 | + score = find_symmetry(pattern) |
| 61 | + if score: |
| 62 | + scores.append(score) |
| 63 | + print(len(scores)) |
| 64 | + print(sum(scores)) |
| 65 | + |
| 66 | + #part 2 |
| 67 | + |
| 68 | + extended_patterns = [] |
| 69 | + for pattern in patterns: |
| 70 | + extended_pattern = all_versions(pattern) |
| 71 | + |
| 72 | + extended_patterns += extended_pattern |
| 73 | + #print(extended_pattern) |
| 74 | + |
| 75 | + scores2 = [] |
| 76 | + for pattern in extended_patterns: |
31 | 77 |
|
| 78 | + score = find_symmetry(pattern) |
| 79 | + if score: |
| 80 | + scores2.append(score) |
| 81 | + print(len(scores2)) |
| 82 | + print(sum(scores2)) |
32 | 83 |
|
33 | 84 | #print(patterns)
|
34 | 85 | if __name__ == "__main__":
|
|
0 commit comments