day 5 part 2

This commit is contained in:
Alan Daniels 2025-12-13 17:14:37 +11:00
parent 98501dec8b
commit 86a0f12e93

60
05b.lisp Normal file
View file

@ -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")