Spaces:
Running
Running
| from collections import defaultdict, deque | |
| def parse_input(file): | |
| with open(file, 'r') as f: | |
| lines = f.read().strip().split('\n') | |
| # Separate rules and updates | |
| rules = [] | |
| updates = [] | |
| is_update_section = False | |
| for line in lines: | |
| if '|' in line: | |
| rules.append(tuple(map(int, line.split('|')))) | |
| else: | |
| updates.append(list(map(int, line.split(',')))) | |
| return rules, updates | |
| def is_correct_order(update, rules): | |
| # Create a map of page to its index in the update | |
| index_map = {page: i for i, page in enumerate(update)} | |
| for x, y in rules: | |
| if x in index_map and y in index_map: | |
| if index_map[x] > index_map[y]: | |
| return False | |
| return True | |
| def find_middle_page(update): | |
| n = len(update) | |
| return update[n // 2] | |
| def reorder_update(update, rules): | |
| # Create a graph and in-degree count for topological sorting | |
| graph = defaultdict(list) | |
| in_degree = defaultdict(int) | |
| # Only consider rules that involve pages in the current update | |
| update_set = set(update) | |
| for x, y in rules: | |
| if x in update_set and y in update_set: | |
| graph[x].append(y) | |
| in_degree[y] += 1 | |
| # Initialize queue with nodes having zero in-degree | |
| queue = deque([page for page in update if in_degree[page] == 0]) | |
| sorted_update = [] | |
| while queue: | |
| node = queue.popleft() | |
| sorted_update.append(node) | |
| for neighbor in graph[node]: | |
| in_degree[neighbor] -= 1 | |
| if in_degree[neighbor] == 0: | |
| queue.append(neighbor) | |
| return sorted_update | |
| def main(): | |
| file = "input.txt" | |
| rules, updates = parse_input(file) | |
| correct_order_sum = 0 | |
| incorrect_order_sum = 0 | |
| for update in updates: | |
| if is_correct_order(update, rules): | |
| correct_order_sum += find_middle_page(update) | |
| else: | |
| reordered_update = reorder_update(update, rules) | |
| incorrect_order_sum += find_middle_page(reordered_update) | |
| print(correct_order_sum) | |
| print(incorrect_order_sum) | |
| main() |