commit - d23cd36cd3c107662e3ba682530ec7350c7b9a71
commit + 8d76db913773c02a383f070c9c57bb5b0a491cfc
blob - fa4081ed4165f94c0b38d988f06ef7179295c57d
blob + 19d0ab12276a756d06ec7d08b240b542db2083ca
--- src/day-9.lisp
+++ src/day-9.lisp
(: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))))