From 86a0f12e93144b7300be433aab1d374866910790 Mon Sep 17 00:00:00 2001 From: Alan Daniels Date: Sat, 13 Dec 2025 17:14:37 +1100 Subject: [PATCH] day 5 part 2 --- 05b.lisp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 05b.lisp diff --git a/05b.lisp b/05b.lisp new file mode 100644 index 0000000..e0113b0 --- /dev/null +++ b/05b.lisp @@ -0,0 +1,60 @@ +(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")