(ql:quickload :cl-ppcre) (defun string-to-sequence (range) (let* ((range (cl-ppcre:split "-" range)) (lower (parse-integer (first range))) (upper (parse-integer (second range)))) (loop :for x :from lower :to upper :collect x))) (defun parse-input (input) (cl-ppcre:split "\\n" (uiop:read-file-string input))) (defun containp (pair) (let ((left (string-to-sequence (first (ppcre:split "," pair)))) (right (string-to-sequence (second (ppcre:split "," pair))))) (cond ((search left right) t) ((search right left) t) (t NIL)))) (defun part-one (input) (count 't (mapcar #'containp (parse-input input)))) (defun overlapp (pair) (let ((left (string-to-sequence (first (ppcre:split "," pair)))) (right (string-to-sequence (second (ppcre:split "," pair))))) (if (intersection left right) t))) (defun part-two (input) (count 't (mapcar #'overlapp (parse-input input))))