solve Day13 with Python
This commit is contained in:
parent
264a904644
commit
55799cbd22
@ -66,3 +66,63 @@ This pattern reflects across the horizontal line between rows 4 and 5. Row 1 wou
|
|||||||
To summarize your pattern notes, add up the number of columns to the left of each vertical line of reflection; to that, also add 100 multiplied by the number of rows above each horizontal line of reflection. In the above example, the first pattern's vertical line has 5 columns to its left and the second pattern's horizontal line has 4 rows above it, a total of 405.
|
To summarize your pattern notes, add up the number of columns to the left of each vertical line of reflection; to that, also add 100 multiplied by the number of rows above each horizontal line of reflection. In the above example, the first pattern's vertical line has 5 columns to its left and the second pattern's horizontal line has 4 rows above it, a total of 405.
|
||||||
|
|
||||||
Find the line of reflection in each of the patterns in your notes. What number do you get after summarizing all of your notes?
|
Find the line of reflection in each of the patterns in your notes. What number do you get after summarizing all of your notes?
|
||||||
|
|
||||||
|
## Part Two
|
||||||
|
You resume walking through the valley of mirrors and - SMACK! - run directly into one. Hopefully nobody was watching, because that must have been pretty embarrassing.
|
||||||
|
|
||||||
|
Upon closer inspection, you discover that every mirror has exactly one smudge: exactly one . or # should be the opposite type.
|
||||||
|
|
||||||
|
In each pattern, you'll need to locate and fix the smudge that causes a different reflection line to be valid. (The old reflection line won't necessarily continue being valid after the smudge is fixed.)
|
||||||
|
|
||||||
|
Here's the above example again:
|
||||||
|
```
|
||||||
|
#.##..##.
|
||||||
|
..#.##.#.
|
||||||
|
##......#
|
||||||
|
##......#
|
||||||
|
..#.##.#.
|
||||||
|
..##..##.
|
||||||
|
#.#.##.#.
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
#...##..#
|
||||||
|
#....#..#
|
||||||
|
..##..###
|
||||||
|
#####.##.
|
||||||
|
#####.##.
|
||||||
|
..##..###
|
||||||
|
#....#..#
|
||||||
|
```
|
||||||
|
|
||||||
|
The first pattern's smudge is in the top-left corner. If the top-left # were instead ., it would have a different, horizontal line of reflection:
|
||||||
|
|
||||||
|
```
|
||||||
|
1 ..##..##. 1
|
||||||
|
2 ..#.##.#. 2
|
||||||
|
3v##......#v3
|
||||||
|
4^##......#^4
|
||||||
|
5 ..#.##.#. 5
|
||||||
|
6 ..##..##. 6
|
||||||
|
7 #.#.##.#. 7
|
||||||
|
```
|
||||||
|
|
||||||
|
With the smudge in the top-left corner repaired, a new horizontal line of reflection between rows 3 and 4 now exists. Row 7 has no corresponding reflected row and can be ignored, but every other row matches exactly: row 1 matches row 6, row 2 matches row 5, and row 3 matches row 4.
|
||||||
|
|
||||||
|
In the second pattern, the smudge can be fixed by changing the fifth symbol on row 2 from . to #:
|
||||||
|
|
||||||
|
```
|
||||||
|
1v#...##..#v1
|
||||||
|
2^#...##..#^2
|
||||||
|
3 ..##..### 3
|
||||||
|
4 #####.##. 4
|
||||||
|
5 #####.##. 5
|
||||||
|
6 ..##..### 6
|
||||||
|
7 #....#..# 7
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, the pattern has a different horizontal line of reflection between rows 1 and 2.
|
||||||
|
|
||||||
|
Summarize your notes as before, but instead use the new different reflection lines. In this example, the first pattern's new horizontal line has 3 rows above it and the second pattern's new horizontal line has 1 row above it, summarizing to the value 400.
|
||||||
|
|
||||||
|
In each pattern, fix the smudge and find the different line of reflection. What number do you get after summarizing the new reflection line in each pattern in your notes?
|
67
Day13/python/solution2.py
Normal file
67
Day13/python/solution2.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
from itertools import groupby
|
||||||
|
|
||||||
|
def find_mirror(group):
|
||||||
|
"""
|
||||||
|
Find the line of symmetry in the pattern, considering there may be one smudge.
|
||||||
|
Returns the position of the line of symmetry or 0 if none found.
|
||||||
|
"""
|
||||||
|
for i in range(1, len(group)):
|
||||||
|
above = group[:i][::-1]
|
||||||
|
below = group[i:]
|
||||||
|
if sum(sum(a != b for a, b in zip(x, y)) for x, y in zip(above, below)) == 1:
|
||||||
|
return i
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def process_file(filename):
|
||||||
|
"""
|
||||||
|
Process the given file to find the sum of mirror lines considering smudges.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(filename) as f:
|
||||||
|
lines = f.read().splitlines()
|
||||||
|
|
||||||
|
groups = [tuple(group) for not_empty, group in groupby(lines, bool) if not_empty]
|
||||||
|
|
||||||
|
res = 0
|
||||||
|
for group in groups:
|
||||||
|
# Vertical reflection
|
||||||
|
res += find_mirror(group) * 100
|
||||||
|
# Horizontal reflection
|
||||||
|
res += find_mirror(tuple(zip(*group)))
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error processing file {filename}: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def test():
|
||||||
|
"""
|
||||||
|
Test function to verify the algorithm with test data.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
test_result = process_file("../test.txt")
|
||||||
|
print(f"Test result: {test_result}")
|
||||||
|
expected_result = 400 # Adjust this based on the expected outcome of the test data
|
||||||
|
assert test_result == expected_result, f"Test failed. Expected result is {expected_result}."
|
||||||
|
print("Test passed.")
|
||||||
|
except AssertionError as ae:
|
||||||
|
print(ae)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Test error: {e}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function to process the actual input file.
|
||||||
|
"""
|
||||||
|
print("Starting tests...")
|
||||||
|
test()
|
||||||
|
|
||||||
|
try:
|
||||||
|
final_result = process_file("../input.txt")
|
||||||
|
print(f"Final result: {final_result}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"An error occurred: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user