; run sbcl --load ~/.sbclrc --script solver.lisp (ql:quickload '(:uiop :fiveam)) (defun elves-rations (input) (reduce (lambda (acc value) (if (equal value "") (cons 0 acc) (progn (incf (car acc) (parse-integer value)) acc))) 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 (uiop:read-file-lines "input")))) ;; calculate the maximum from each elves 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 (reduce #'+ (subseq (sort rations #'>) 0 3))))))