add day5
This commit is contained in:
65
day5/day5.py
Normal file
65
day5/day5.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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))
|
Reference in New Issue
Block a user