(require :uiop) (load (sb-ext:posix-getenv "ASDF")) (asdf:load-system 'str) (defun get-range (range) (let ((range (str:split "-" range))) (loop for i from (parse-integer (car range)) to (parse-integer (car (cdr range))) collect i))) (get-range "11-22") (defun get-ranges (instr) (loop for range in (str:split "," (string-trim '(#\Newline) instr)) collect (get-range range))) (get-ranges "1-3,4-5") (defun match-sequence (seq-len seq remaining) (setq rem-len (length remaining)) (cond ((not (integerp (/ rem-len seq-len))) nil) ((string= seq remaining) t) ((not (string= seq (subseq remaining 0 seq-len))) nil) (t (match-sequence seq-len seq (subseq remaining seq-len))))) (match-sequence 2 "12" "2212") (match-sequence 2 "12" "121") (match-sequence 2 "12" "1212") (match-sequence 2 "12" "12") (defun validate-product-id (product-id) (setq product-id (format nil "~A" product-id)) (not (loop for seq-len from 1 to (floor (/ (length product-id) 2)) when (match-sequence seq-len (subseq product-id 0 seq-len) (subseq product-id seq-len)) do (+ 1 2); not sure how to remove this? and return t))) (validate-product-id 1212) (validate-product-id 121212) (validate-product-id 123) (validate-product-id 1234) (defun sum-all-invalid-ids (text) (reduce #'+ (remove-if #'validate-product-id (reduce #'append (get-ranges text))))) (sum-all-invalid-ids (uiop:read-file-string "02example.txt")) (sum-all-invalid-ids (uiop:read-file-string "02data.txt"))