1 (in-package #:adventofcode2020)
3 (defun valid-password-count? (pw-spec)
4 (destructuring-bind (count-str char-str passwd) (split " " pw-spec)
5 (let ((countp (destructuring-bind (count-low count-high) (mapcar #'parse-integer (split "-" count-str))
7 (<= count-low n count-high))))
8 (char-count (loop with char = (char char-str 0)
10 summing (if (char= c char) 1 0))))
11 (funcall countp char-count))))
13 (defun valid-password-index? (pw-spec)
14 (destructuring-bind (index-str char-str passwd) (split " " pw-spec)
15 (let* ((indices (mapcar (compose #'1- #'parse-integer) (split "-" index-str)))
16 (char (char char-str 0))
17 (get-char (lambda (n) (char passwd n))))
18 (->> (mapcar get-char indices)
24 (let ((pws-and-specs (list-from input)))
25 (part1 (->> pws-and-specs
26 (remove-if-not #'valid-password-count?)
28 (part2 (->> pws-and-specs
29 (remove-if-not #'valid-password-index?)
35 (test valid-password-count?
38 (mapcar #'valid-password-count?
39 '("1-3 a: abcde" "1-3 b: cdefg" "2-9 c: ccccccccc")))))
41 (test valid-password-index?
44 (mapcar #'valid-password-index?
45 '("1-3 a: abcde" "1-3 b: cdefg" "2-9 c: ccccccccc")))))