solve Day13 with Python

This commit is contained in:
WieErWill 2023-12-15 21:50:12 +01:00
parent 264a904644
commit 55799cbd22
2 changed files with 128 additions and 1 deletions

View File

@ -65,4 +65,64 @@ 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.
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
View 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()