commit c73beb359d0d0416e275dfaa5cdbb798a8704354 parent 51f6bb18101d12818d6c6ebdde53ca6ed0169214 Author: mpizzzle <m@michaelpercival.xyz> Date: Mon, 7 Dec 2020 01:37:42 +0000 puzzle 4 complete. avert your eyes Diffstat:
| M | 2020/puzzle_4.scm | | | 74 | +++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- |
1 file changed, 51 insertions(+), 23 deletions(-)
diff --git a/2020/puzzle_4.scm b/2020/puzzle_4.scm @@ -27,38 +27,66 @@ (define batch (read-lines "files/4.txt" (lambda (x) x))) (define required '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")) (define eye-colours '("amb" "blu" "brn" "gry" "grn" "hzl" "oth")) +(define hair-colour "0123456789abcdef") +(define passport-id "0123456789") (define passports (unfold (right-fold batch))) -(define fields (map (lambda (passport) (map (lambda (s) (car (tokenize s #:))) passport)) passports)) -(define (has-required-fields fields) - (= (length (lset-intersection string=? fields required)) 7)) +(define (has-required-fields full-fields) + (= (length (lset-intersection string=? (map (lambda (field) (car field)) full-fields) required)) 7)) (define (get-fields passport) - (map (lambda (field) (car (tokenize field #:))) passport)) + (map (lambda (field) (tokenize field #:)) passport)) -(define valid-passports (filter (lambda (passport) (has-required-fields (get-fields passport))) passports)) +(define candidate-passports (filter (lambda (passport) (has-required-fields (get-fields passport))) passports)) -(display (length valid-passports)) (newline) +(display (length candidate-passports)) (newline) + +(define (valid-birth-year byr) + (let ((b (string->number byr))) + (and (>= b 1920) (<= b 2002)))) + +(define (valid-issue-year iyr) + (let ((i (string->number iyr))) + (and (>= i 2010) (<= i 2020)))) + +(define (valid-expiration-year eyr) + (let ((e (string->number eyr))) + (and (>= e 2020) (<= e 2030)))) -(define (valid-birth-year date) -) - -(define (valid-issue-year date) -) - -(define (valid-expiration-year date) -) - (define (valid-height height) -) - + (let ((unit (substring height (- (string-length height) 2) (string-length height))) + (h (string->number (substring height 0 (- (string-length height) 2))))) + (if (string=? unit "cm") + (and (>= h 150) (<= h 193)) + (if (string=? unit "in") + (and (>= h 59) (<= h 76)) + #f)))) + (define (valid-hair-colour colour) -) - + (let ((c (string->list colour))) + (and (char=? (car c) ##) + (= (length (lset-intersection char=? (cdr c) (string->list hair-colour))) (length (cdr c)))))) + (define (valid-eye-colour colour) -) - + (find (lambda (c) (string=? c colour)) eye-colours)) + (define (valid-passport-id id) -) - + (and (= (string-length id) 9) + (= (length (lset-intersection char=? (string->list id) (string->list passport-id))) (string-length id)))) + +(define (valid-fields passport) + (and + (valid-birth-year (cadar (filter (lambda (field) (string=? (car field) "byr")) passport))) + (valid-issue-year (cadar (filter (lambda (field) (string=? (car field) "iyr")) passport))) + (valid-expiration-year (cadar (filter (lambda (field) (string=? (car field) "eyr")) passport))) + (valid-height (cadar (filter (lambda (field) (string=? (car field) "hgt")) passport))) + (valid-hair-colour (cadar (filter (lambda (field) (string=? (car field) "hcl")) passport))) + (valid-eye-colour (cadar (filter (lambda (field) (string=? (car field) "ecl")) passport))) + (valid-passport-id (cadar (filter (lambda (field) (string=? (car field) "pid")) passport))))) + +(define mapped-passports (map (lambda (passport) (get-fields passport)) candidate-passports)) + +(define valid-passports (filter (lambda (passport) (valid-fields passport)) mapped-passports)) + +(display (length valid-passports)) (newline)