-
Notifications
You must be signed in to change notification settings - Fork 0
/
day4.lisp
63 lines (51 loc) · 2.11 KB
/
day4.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(in-package #:advent2020)
(defun read-passports ()
(split "\\n\\n" (uiop:read-file-string
(asdf:system-relative-pathname 'advent2020 "inputs/day4"))))
(defun is-passport-semivalid-p (passport)
(let ((fields-in-passport (loop for field in (split "\\s" passport)
collect (first (split ":" field)))))
(every (lambda (f)
(find f fields-in-passport :test #'string=))
'("byr" "iyr" "eyr" "hgt"
"hcl" "ecl" "pid"))))
(defun day4/solution1 ()
(count-if #'is-passport-semivalid-p (read-passports)))
(defun valid-byr (byr-str)
(let ((byr (parse-integer byr-str)))
(and (>= byr 1920) (<= byr 2002))))
(defun valid-iyr (iyr-str)
(let ((iyr (parse-integer iyr-str)))
(and (>= iyr 2010) (<= iyr 2020))))
(defun valid-eyr (eyr-str)
(let ((eyr (parse-integer eyr-str)))
(and (>= eyr 2020) (<= eyr 2030))))
(defun valid-hgt (hgt-str)
(register-groups-bind ((#'parse-integer height) unit)
("\(\\d+\)\(..\)" hgt-str)
(if (string= "in" unit)
(and (>= height 59) (<= height 76))
(and (>= height 150) (<= height 193)))))
(defun valid-hcl (hcl-str)
(scan "^#[a-f0-9]{6}$" hcl-str))
(defun valid-ecl (ecl-str)
(find ecl-str '("amb" "blu" "brn" "gry" "grn" "hzl" "oth") :test #'string=))
(defun valid-pid (pid-str)
(scan "^\\d{9}$" pid-str))
(defun is-passport-valid-p (passport-str)
(let ((passport (make-hash-table :test 'equal)))
(loop for (key . value) in (mapcar (lambda (f)
(split ":" f))
(split "\\s" passport-str))
do (setf (gethash key passport) (first value)))
(and (is-passport-semivalid-p passport-str)
(valid-byr (gethash "byr" passport))
(valid-iyr (gethash "iyr" passport))
(valid-eyr (gethash "eyr" passport))
(valid-hgt (gethash "hgt" passport))
(valid-hcl (gethash "hcl" passport))
(valid-ecl (gethash "ecl" passport))
(valid-pid (gethash "pid" passport))
)))
(defun day4/solution2 ()
(count-if #'is-passport-valid-p (read-passports)))