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

  • morrowind
    link
    fedilink
    arrow-up
    1
    ·
    3 days ago

    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].
    	]