Day 5: Print Queue
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
python
solution
import re import aoc def setup(): lines = aoc.get_lines(5) return ([list(map(int, re.findall(r'\d+', x))) for x in lines if re.search(r'\|', x)], [list(map(int, re.findall(r'\d+', x))) for x in lines if re.search(r',', x)], 0) def one(): rules, updates, acc = setup() for update in updates: v = 1 for i, u in enumerate(update): r = [x[0] for x in rules if x[1] == u and x[0] in update] if not all(n in update[:i] for n in r): v = 0 break if v: acc += update[len(update) // 2] print(acc) def fix(update, rules): c = 1 while c: c = 0 for i, u in enumerate(update): r = [x[0] for x in rules if x[1] == u and x[0] in update] for p in r: pi = update.index(p) if pi > i: update[i], update[pi] = update[pi], update[i] c = 1 return update[len(update) // 2] def two(): rules, updates, acc = setup() for update in updates: v = 1 for i, u in enumerate(update): r = [x[0] for x in rules if x[1] == u and x[0] in update] if not all(n in update[:i] for n in r): v = 0 break if not v: acc += fix(update, rules) print(acc) one() two()