Solve 2024:5 p1-2 "Print Queue"
In p2, it took some tries to find a correct way to rearrange incorrect pagesets. The code ended up just rearranging first found incorrect order and readding the updated pageset to queue.
This commit is contained in:
parent
f751b3b8d5
commit
44f6aa0f53
1 changed files with 77 additions and 0 deletions
77
2024-python/output/day_05.py
Normal file
77
2024-python/output/day_05.py
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
from output import ints
|
||||||
|
|
||||||
|
|
||||||
|
def solve(data):
|
||||||
|
rules, pagelists = data.split("\n\n")
|
||||||
|
rules, pagelists = (
|
||||||
|
set(map(lambda line: tuple(ints(line)), rules.splitlines())),
|
||||||
|
list(map(lambda line: ints(line), pagelists.splitlines())),
|
||||||
|
)
|
||||||
|
|
||||||
|
corrects = []
|
||||||
|
incorrects = []
|
||||||
|
adjusted = []
|
||||||
|
|
||||||
|
for pagelist in pagelists:
|
||||||
|
ok = True
|
||||||
|
|
||||||
|
for i, page in enumerate(pagelist):
|
||||||
|
prevpages, nextpages = pagelist[:i], pagelist[i + 1 :]
|
||||||
|
|
||||||
|
if not all((pp, page) in rules for pp in prevpages) or not all(
|
||||||
|
(page, np) in rules for np in nextpages
|
||||||
|
):
|
||||||
|
ok = False
|
||||||
|
break
|
||||||
|
|
||||||
|
if ok:
|
||||||
|
corrects.append(pagelist)
|
||||||
|
else:
|
||||||
|
incorrects.append(pagelist)
|
||||||
|
|
||||||
|
while incorrects:
|
||||||
|
pagelist = incorrects.pop(0)
|
||||||
|
changed = False
|
||||||
|
|
||||||
|
for i, page in enumerate(pagelist):
|
||||||
|
prevpages, nextpages = pagelist[:i], pagelist[i + 1 :]
|
||||||
|
|
||||||
|
for prevpage in prevpages:
|
||||||
|
if (prevpage, page) in rules:
|
||||||
|
continue
|
||||||
|
|
||||||
|
nextpages.append(prevpages.pop())
|
||||||
|
pagelist = prevpages + [page] + nextpages
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if not changed:
|
||||||
|
for nextpage in nextpages:
|
||||||
|
if (page, nextpage) in rules:
|
||||||
|
continue
|
||||||
|
prevpages.append(nextpages.pop())
|
||||||
|
pagelist = prevpages + [page] + nextpages
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
break
|
||||||
|
|
||||||
|
if not changed:
|
||||||
|
adjusted.append(pagelist)
|
||||||
|
else:
|
||||||
|
incorrects.append(pagelist)
|
||||||
|
|
||||||
|
p1 = sum(c[len(c) // 2] for c in corrects)
|
||||||
|
p2 = sum(r[len(r) // 2] for r in adjusted)
|
||||||
|
return p1, p2
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
with open("./input/05.txt", "r") as f:
|
||||||
|
inp = f.read().strip()
|
||||||
|
|
||||||
|
p1, p2 = solve(inp)
|
||||||
|
|
||||||
|
print(p1)
|
||||||
|
print(p2)
|
||||||
Loading…
Add table
Reference in a new issue