(ql:quickload :fiveam) (defun recover-item (bitfield-int) (loop for i from 0 when (logbitp i bitfield-int) return i)) (defun priority (value) (if (< value 31) ;; It is a capital letter in range [1;26] (+ value 26) (- value 32))) (defun line-priority (str) (let ((mid (/ (length str) 2)) (left-pack 0) (right-pack 0)) (loop with cross = 0 for l across (subseq str 0 mid) for r across (subseq str mid) do (progn (setf left-pack (logior left-pack (ash 1 (- (char-code l) 64)))) (setf right-pack (logior right-pack (ash 1 (- (char-code r) 64)))) (setf cross (logand left-pack right-pack))) when (< 0 cross) return (priority (recover-item cross))))) (defun prio () (with-open-file (in "input") (loop :for l = (read-line in nil nil) :while l :sum (line-priority l)))) (defun pick-badge (str) (loop with stack = 0 for i across str do (setf stack (logior stack (ash 1 (- (char-code i) 64)))) finally (return stack))) (defun badge () (with-open-file (in "input") (loop :for b = (loop repeat 3 for l = (read-line in nil nil) while l collect (pick-badge l)) :while b :sum (priority (recover-item (apply #'logand b)))))) ;; (pick-badge "LdHVLDLDdHdtLMhcqCqGWcWg" ) (fiveam:test intermediate (fiveam:is (= 12 (recover-item 4096))) (fiveam:is (= 20 (line-priority "gzCjffWZCtCfZZVdqVSqJdvJndSt")))) (fiveam:test results (fiveam:is (= 8072 (prio))) (fiveam:is (= 2567 (badge)))) (fiveam:run-all-tests)