(load (sb-ext:posix-getenv "ASDF")) (asdf:load-system 'str) (asdf:load-system 'alexandria) (defun parse-line (line) (str:match line ((first "-" last) (cons (parse-integer first) (parse-integer last)) ) ((test) (parse-integer test)) ) ) (parse-line "5-15") (parse-line "15-5") (parse-line "6") (defun in-set (item subset) (let ((first (car subset)) (last (cdr subset))) (and (>= item first) (<= item last)))) (defun in-superset (item superset) (loop for subset in superset when (in-set item subset) return subset) ) (in-superset 10 (list (cons 5 15) (cons 20 30))) (defun set-transform (subset superset) (let ((first (car subset)) (last (cdr subset))) (loop while (in-superset first superset) do (setq first (+ (cdr (in-superset first superset)) 1))) (loop while (in-superset last superset) do (setq last (- (car (in-superset last superset)) 1))) ;; (format t "~A -> ~A~%" subset (cons first last)) (if (<= first last) (cons first last)))) (set-transform (cons 3 17) (list (cons 5 15) (cons 20 30))) (set-transform (cons 5 15) (list (cons 5 15) (cons 20 30))) (defun count-fresh-ingredients (filename) (let ((superset ())) (loop for line in (str:lines (str:from-file filename) :omit-nulls t) do (let ((parsed (parse-line line))) (if (consp parsed) ; consp (let ((inner-set (set-transform parsed superset))) (if inner-set (progn (delete-if (lambda (inner) (not (set-transform inner (list inner-set)))) superset) (setq superset (push inner-set superset))))) ))) ;; (print superset) (loop for subset in superset sum (+ (- (cdr subset) (car subset)) 1)) )) (count-fresh-ingredients "05example.txt") (count-fresh-ingredients "05data.txt")