Files

66 lines
1.5 KiB
Python
Raw Permalink Normal View History

2024-12-11 21:45:33 +03:00
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))