adventofcode

https://adventofcode.com/
Log | Files | Refs

commit 480bd0503e6b0cc7fd3fc464dc82d5696a089e33
parent c73beb359d0d0416e275dfaa5cdbb798a8704354
Author: mpizzzle <m@michaelpercival.xyz>
Date:   Mon,  7 Dec 2020 02:01:17 +0000

minor refactoring

Diffstat:
M2020/puzzle_4.scm | 57+++++++++++++++++++++------------------------------------
1 file changed, 21 insertions(+), 36 deletions(-)

diff --git a/2020/puzzle_4.scm b/2020/puzzle_4.scm @@ -24,69 +24,54 @@ )) '())) -(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 (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) (tokenize field #:)) passport)) -(define candidate-passports (filter (lambda (passport) (has-required-fields (get-fields passport))) passports)) - -(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 (range lo hi year) + (let ((y (string->number year))) + (and (>= y lo) (<= y hi)))) (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)))) + (and (string=? unit "in") (>= h 59) (<= h 76))))) (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)))))) + (= (length (lset-intersection char=? (cdr c) (string->list "0123456789abcdef"))) (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)))) + (= (length (lset-intersection char=? (string->list id) (string->list "0123456789"))) (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))) + (range 1920 2002 (cadar (filter (lambda (field) (string=? (car field) "byr")) passport))) + (range 2010 2020 (cadar (filter (lambda (field) (string=? (car field) "iyr")) passport))) + (range 2020 2030 (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 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 candidate-passports + (filter (lambda (passport) + (= (length (lset-intersection string=? (map (lambda (field) (car field)) (get-fields passport)) required)) 7)) + (unfold (right-fold batch)))) + +(display (length candidate-passports)) (newline) -(define valid-passports (filter (lambda (passport) (valid-fields passport)) mapped-passports)) +(define valid-passports (filter (lambda (passport) (valid-fields passport)) + (map (lambda (passport) (get-fields passport)) candidate-passports))) (display (length valid-passports)) (newline)