diff --git a/02b.lisp b/02b.lisp new file mode 100644 index 0000000..c0d09ab --- /dev/null +++ b/02b.lisp @@ -0,0 +1,48 @@ +(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"))