commit 8d76db913773c02a383f070c9c57bb5b0a491cfc from: Lukas Henkel date: Sat Dec 09 05:20:41 2023 UTC Day 9 task 2 commit - d23cd36cd3c107662e3ba682530ec7350c7b9a71 commit + 8d76db913773c02a383f070c9c57bb5b0a491cfc blob - fa4081ed4165f94c0b38d988f06ef7179295c57d blob + 19d0ab12276a756d06ec7d08b240b542db2083ca --- src/day-9.lisp +++ src/day-9.lisp @@ -3,18 +3,30 @@ (:export #:day-9)) (in-package #:aoc/day-9) +(defun diff-sequence (numbers) + (loop with last = (first numbers) + for number in (rest numbers) + collect (- number last) + do (setf last number))) + (defun find-next-value (numbers) - (let ((new-sequence (loop with last = (first numbers) - for number in (rest numbers) - collect (- number last) - do (setf last number)))) + (let ((new-sequence (diff-sequence numbers))) (if (every (curry #'= 0) new-sequence) (first numbers) (+ (lastcar numbers) (find-next-value new-sequence))))) +(defun find-previous-value (numbers) + (let ((new-sequence (diff-sequence numbers))) + (if (every (curry #'= 0) new-sequence) + (first numbers) + (- (first numbers) + (find-previous-value new-sequence))))) + (defun day-9 (input) (loop for line = (read-line input nil) while line for numbers = (read-number-list line) - sum (find-next-value numbers) fixnum)) + sum (find-next-value numbers) into task-1 fixnum + sum (find-previous-value numbers) into task-2 fixnum + finally (return (values task-1 task-2))))