from functools import cmp_to_key def is_update_correct(update: list[str], rules: list[tuple[str, str]]) -> bool: for idx, page in enumerate(update): for previous_page in (update[previous_idx] for previous_idx in range(idx)): if (page, previous_page) in rules: return False return True rules = [] updates = [] reading_updates = False with open("input") as f: for line in f.readlines(): if reading_updates: updates.append(line.strip().split(",")) elif line == "\n": reading_updates = True else: rules.append(tuple(line.strip().split("|"))) for idx in range(len(updates) - 1, -1, -1): if is_update_correct(updates[idx], rules): updates.pop(idx) for update in updates: update.sort(key=cmp_to_key(lambda item1, item2: -1 if (item1, item2) in rules else 1 if (item2, item1) in rules else 0)) result = 0 for update in updates: result += int(update[len(update) // 2]) print(result)