diff --git a/Day13/README.md b/Day13/README.md index 9b07267..d76e68f 100644 --- a/Day13/README.md +++ b/Day13/README.md @@ -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? \ No newline at end of file +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? \ No newline at end of file diff --git a/Day13/python/solution2.py b/Day13/python/solution2.py new file mode 100644 index 0000000..c68cd10 --- /dev/null +++ b/Day13/python/solution2.py @@ -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()