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
Smalltalk
parsing logic is duplicated between the two, and I probably could use part2’s logic for part 1, but yeah
part 1
day5p1: in | rules pages i j input | input := in lines. i := input indexOf: ''. rules := ((input copyFrom: 1 to: i-1) collect: [:l | (l splitOn: '|') collect: #asInteger]). pages := (input copyFrom: i+1 to: input size) collect: [:l | (l splitOn: ',') collect: #asInteger]. ^ pages sum: [ :p | (rules allSatisfy: [ :rule | i := p indexOf: (rule at: 1). j := p indexOf: (rule at: 2). (i ~= 0 & (j ~= 0)) ifTrue: [ i < j ] ifFalse: [ true ] ]) ifTrue: [p at: ((p size / 2) round: 0) ] ifFalse: [0]. ]
part 2
day5p2: in | rules pages i pnew input | input := in lines. i := input indexOf: ''. rules := ((input copyFrom: 1 to: i-1) collect: [:l | (l splitOn: '|') collect: #asInteger]). pages := (input copyFrom: i+1 to: input size) collect: [:l | (l splitOn: ',') collect: #asInteger]. ^ pages sum: [ :p | pnew := p sorted: [ :x :y | rules anySatisfy: [ :r | (r at: 1) = x and: [ (r at: 2) = y]] ]. pnew ~= p ifTrue: [ pnew at: ((pnew size / 2) round: 0) ] ifFalse: [0]. ]