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