66 lines
1.5 KiB
Python
66 lines
1.5 KiB
Python
![]() |
import sys
|
||
|
sys.path.append('../aoclib')
|
||
|
|
||
|
from aoclib import Input
|
||
|
from collections import defaultdict
|
||
|
|
||
|
def parse_input(data: list[str]):
|
||
|
rules = defaultdict(set)
|
||
|
updates = []
|
||
|
for line in data:
|
||
|
if '|' in line:
|
||
|
l, r = (int(n) for n in line.split('|'))
|
||
|
rules[l].add(r)
|
||
|
continue
|
||
|
if line == '':
|
||
|
continue
|
||
|
l = [int(n) for n in line.split(',')]
|
||
|
updates.append(l)
|
||
|
|
||
|
return rules, updates
|
||
|
|
||
|
def update_is_correct(rules, upd):
|
||
|
for i, x in enumerate(upd):
|
||
|
for j, y in enumerate(upd):
|
||
|
if i > j and y in rules[x]:
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
def fix_update(rules, upd):
|
||
|
for i, x in enumerate(upd):
|
||
|
for j, y in enumerate(upd):
|
||
|
if i > j and y in rules[x]:
|
||
|
upd[i], upd[j] = upd[j], upd[i]
|
||
|
return upd
|
||
|
|
||
|
def solve1(rules, updates):
|
||
|
count = 0
|
||
|
for upd in updates:
|
||
|
if update_is_correct(rules, upd):
|
||
|
count += upd[len(upd) // 2]
|
||
|
return count
|
||
|
|
||
|
|
||
|
def solve2(rules, updates):
|
||
|
count = 0
|
||
|
|
||
|
for upd in updates:
|
||
|
if not update_is_correct(rules, upd):
|
||
|
upd = fix_update(rules, upd)
|
||
|
count += upd[len(upd) // 2]
|
||
|
|
||
|
return count
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
#lines = Input('input_test.txt').lines()
|
||
|
lines = Input('input.txt').lines()
|
||
|
rules, updates = parse_input(lines)
|
||
|
|
||
|
#part 1
|
||
|
print('part 1:', solve1(rules, updates))
|
||
|
|
||
|
#part 2
|
||
|
print('part 2:', solve2(rules, updates))
|