Spaces:
Running
Running
| import re | |
| def parse_instructions(memory): | |
| # Regular expression to find valid mul(X,Y) instructions | |
| mul_pattern = re.compile(r'mul\((\d{1,3}),(\d{1,3})\)') | |
| # Regular expression to find do() and don't() instructions | |
| do_pattern = re.compile(r'do\(\)') | |
| dont_pattern = re.compile(r"don't\(\)") | |
| # Find all mul instructions | |
| mul_matches = mul_pattern.finditer(memory) | |
| # Find all do() and don't() instructions | |
| do_matches = list(do_pattern.finditer(memory)) | |
| dont_matches = list(dont_pattern.finditer(memory)) | |
| # Sort do and don't matches by their start position | |
| control_matches = sorted(do_matches + dont_matches, key=lambda m: m.start()) | |
| # Part 1: Sum of all valid mul instructions | |
| part1_sum = 0 | |
| for match in mul_matches: | |
| x, y = int(match.group(1)), int(match.group(2)) | |
| part1_sum += x * y | |
| # Part 2: Sum of enabled mul instructions | |
| part2_sum = 0 | |
| mul_matches = mul_pattern.finditer(memory) # Re-iterate over mul matches | |
| enabled = True # Initially, mul instructions are enabled | |
| control_index = 0 | |
| for match in mul_matches: | |
| # Check if there are any control instructions before this mul | |
| while control_index < len(control_matches) and control_matches[control_index].start() < match.start(): | |
| if control_matches[control_index].group() == 'do()': | |
| enabled = True | |
| elif control_matches[control_index].group() == "don't()": | |
| enabled = False | |
| control_index += 1 | |
| if enabled: | |
| x, y = int(match.group(1)), int(match.group(2)) | |
| part2_sum += x * y | |
| return part1_sum, part2_sum | |
| # Read the input file | |
| with open('input.txt', 'r') as file: | |
| memory = file.read() | |
| # Get the results for both parts | |
| result1, result2 = parse_instructions(memory) | |
| # Print the results | |
| print(result1) | |
| print(result2) |