diff --git a/aoc2024-eutro.el b/aoc2024-eutro.el index 038f15d..2a578d4 100644 --- a/aoc2024-eutro.el +++ b/aoc2024-eutro.el @@ -54,10 +54,16 @@ With PREFIX, read input from the buffer." (expand-file-name "run.sh" aoc-root) args)) (win (selected-window))) + (set-process-sentinel + proc + (lambda (_proc msg) + (with-selected-window (get-buffer-window buf) + (recenter -1)))) (unless (eq (window-buffer win) buf) - (pop-to-buffer buf 'display-buffer-use-least-recent-window)) - (message "./run.sh %s" (string-join (mapcar #'shell-quote-argument args) " ")) - (unless prefix (select-window win)))) + (if prefix + (pop-to-buffer buf 'display-buffer-use-least-recent-window) + (display-buffer buf 'display-buffer-use-least-recent-window))) + (message "./run.sh %s" (string-join (mapcar #'shell-quote-argument args) " ")))) (defun aoc-copy-part-answer (part) "Copy the answer for the given PART from *aoc-output*." diff --git a/days/day02.st b/days/day02.st index 914434d..f8b7541 100644 --- a/days/day02.st +++ b/days/day02.st @@ -1,26 +1,23 @@ Collection extend [ checkSafeStep: a to: b - [ |delta| (a < 1) | (b > self size) ifTrue: [^true]. - delta := (self at: b) - (self at: a). - ^(1 <= delta) & (delta <= 3) ] + [ (a < 1) | (b > self size) ifTrue: [^true]. + ^(self at: b) - (self at: a) between: 1 and: 3 ] safetyFwd [ | dp | dp := Array new: self size + 1. (self size to: 0 by: -1) do: [ - :i | | v | - v := i + 1 to: self size + 1. - v := v select: [ :j | self checkSafeStep: i to: j ]. - v := v collect: [ :j | (dp at: (j + 1) ifAbsent: [0]) + (j - i - 1) ]. - v := v fold: [ :l :r | l min: r ]. - dp at: (i + 1) put: v ]. + :i | i chain + 1; + to: i + 2; "or `self size + 1`, but only jumps of 1 are possible" + select: [ :j | self checkSafeStep: i to: j ]; + collect: [ :j | (dp at: (j + 1) ifAbsent: [0]) + (j - i - 1) ]; + minimum; >* [ :v | dp at: (i + 1) put: v ] ]. ^dp at: 1 ] safety [ ^self safetyFwd min: self reverse safetyFwd ] ] -AOC input: [ stdin toLines collect: - [ :ln | ((ln tokenize: ' ') - collect: [ :lvl | lvl scanf: '%d' with: [:e|e] ]) - safety ] ]; +AOC input: [ stdin toLines collect: [ + :ln | ln chain tokenize: ' '; + collect: [ :lvl | lvl asNumber ]; safety ] ]; part1: 0; part2: 1; result: [ :reports :damp | reports count: [ :it | it <= damp ] ]; finish diff --git a/days/utils.st b/days/utils.st index 37a9741..31688e9 100644 --- a/days/utils.st +++ b/days/utils.st @@ -20,7 +20,12 @@ AOC class extend [ self runPart: savedP2 part: 2 arg: inp. ] "TODO: save as an image?" - finish [ self run ] + finish + [ | startTime stopTime | + startTime := Time millisecondClock. + self run. + stopTime := Time millisecondClock. + stdout << 'Time elapsed: ' << (stopTime - startTime) << 'ms'; nl. ] ] "--- Scanf ---" @@ -117,7 +122,10 @@ Object extend [ ] Iterable extend [ - sum [ ^self fold: [ :l :r | l + r ] ] + sum [ ^self inject: 0 into: [ :l :r | l + r ] ] + minimum [ ^self inject: FloatD infinity into: [ :l :r | l min: r ] ] + maximum [ ^self inject: FloatD negativeInfinity into: [ :l :r | l max: r ] ] + toList [ ^self toCollection: OrderedCollection ] toBag [ ^self toCollection: Bag ] toSet [ ^self toCollection: Set ] @@ -159,3 +167,14 @@ BlockClosure extend [ Array extend [ letArrayInBlock: block [ ^block valueWithArguments: self ] ] + +"Pipeline proxy class which forwards onto a boxed value" +nil subclass: MessageChain [ + | val | + pipelineValue: v [ val := v ] + yourself [ ^val ] + doesNotUnderstand: msg [ val := msg reinvokeFor: val. ^val ] + >* block [ ^block value: val ] + MessageChain class >> new [ ^self basicNew ] +] +Object extend [ chain [ ^MessageChain new pipelineValue: self ] ] diff --git a/run.sh b/run.sh index b0bfec4..c3dd0de 100755 --- a/run.sh +++ b/run.sh @@ -22,4 +22,4 @@ else fi fi -exec gst "days/utils.st" "days/day$DAYP.st" < "$AOC_INPUT" +exec gst -g "days/utils.st" "days/day$DAYP.st" < "$AOC_INPUT"