60 lines
1.9 KiB
Common Lisp
60 lines
1.9 KiB
Common Lisp
(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")
|