day 5 part 2
This commit is contained in:
parent
98501dec8b
commit
86a0f12e93
1 changed files with 60 additions and 0 deletions
60
05b.lisp
Normal file
60
05b.lisp
Normal 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")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue