summaryrefslogtreecommitdiff
path: root/2024/day5/solve2.py
blob: 4675e85d0c0735fc111dfb767734276fdba6c455 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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)