diff options
Diffstat (limited to 'AoC2022/01/solver.lisp')
-rwxr-xr-x | AoC2022/01/solver.lisp | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/AoC2022/01/solver.lisp b/AoC2022/01/solver.lisp index d39bb7c..dd09c07 100755 --- a/AoC2022/01/solver.lisp +++ b/AoC2022/01/solver.lisp @@ -2,22 +2,46 @@ (ql:quickload '(:uiop :fiveam)) -(defun elves-rations () +(defun elves-rations (input) (reduce (lambda (acc value) - (if (string= value "") + (if (equal value "") (cons 0 acc) (progn (incf (car acc) (parse-integer value)) acc))) - (uiop:read-file-lines "input") + input :initial-value (list 0))) +(defun elves-rations-nc (filename) + (with-open-file (in filename) + (let ((acc (list 0))) + (loop for line = (read-line in nil) while line + for num = (parse-integer line :junk-allowed t) + if (numberp num) do + (incf (car acc) num) + else do + (push 0 acc)) + acc))) + +(defun elves-rations-max (filename) + (with-open-file (in filename) + (let ((max 0) + (elf 0)) + (loop for line = (read-line in nil) while line + for num = (parse-integer line :junk-allowed t) + if (numberp num) do + (incf elf num) + else do + (setf max (max elf max)) + (setf elf 0)) + (max elf max)))) + (fiveam:test results - (let ((rations (elves-rations))) + (let ((rations (elves-rations (uiop:read-file-lines "input")))) ;; calculate the maximum from each elves rations - (fiveam:is (= 75622 (apply #'max rations))) + (fiveam:is (= 75622 (reduce #'max rations))) + (fiveam:is (= 75622 (reduce #'max (elves-rations-nc "input")))) + (fiveam:is (= 75622 (elves-rations-max "input"))) ;; calculate the maximum from each elves rations - (fiveam:is (= 213159 (apply #'+ (subseq (sort rations #'>) 0 3)))))) - - + (fiveam:is (= 213159 (reduce #'+ (subseq (sort rations #'>) 0 3)))))) |