day 5 part 1

This commit is contained in:
Alan Daniels 2025-12-13 13:42:48 +11:00
parent 9959416bcc
commit 98501dec8b
3 changed files with 71 additions and 1 deletions

59
05a.lisp Normal file
View file

@ -0,0 +1,59 @@
(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 "6")
(defun in-set-last (item setp)
(let ((first (car setp)) (last (cdr setp)))
(if (and (>= item first) (<= item last))
(+ last 1))))
(defun in-set-first (item setp)
(let ((first (car setp)) (last (cdr setp)))
(if (and (>= item first) (<= item last))
(- first 1))))
(in-set-first 5 (cons 5 15))
(defun in-superset (item superset test)
(loop for setp in superset
when (funcall test item setp)
return (funcall test item setp))
)
(in-superset 10 (list (parse-line "5-15") (parse-line "20-30")) #'in-set-first)
(in-superset 10 (list (parse-line "5-15") (parse-line "20-30")) #'in-set-last)
(defun set-transform (set superset)
(let ((first (car set)) (last (cdr set)))
(setq first (or (in-superset first superset #'in-set-last) first))
(setq last (or (in-superset last superset #'in-set-first) last))
(if (< first last)
(cons first last))))
(set-transform (cons 14 115) (list (cons 5 15) (cons 20 30)))
(defun count-fresh-ingredients (filename)
(let ((superset ())
(fresh-count 0))
(loop for line in (str:lines (str:from-file filename) :omit-nulls t)
do (let ((parsed (parse-line line)))
(if (consp parsed)
; consp
(alexandria:if-let (parsed (set-transform parsed superset))
(setf superset (push parsed superset)))
; integerp
(if (in-superset parsed superset #'in-set-last) (setq fresh-count (+ fresh-count 1)))
)))
;; (print superset)
fresh-count))
(count-fresh-ingredients "05example.txt")
(count-fresh-ingredients "05data.txt")