Initial commit
This commit is contained in:
commit
f242d2b0df
420 changed files with 62521 additions and 0 deletions
99
2020/day04/day04.rkt
Normal file
99
2020/day04/day04.rkt
Normal file
|
@ -0,0 +1,99 @@
|
|||
#lang racket
|
||||
|
||||
(module+ test
|
||||
(require rackunit))
|
||||
|
||||
(module+ main
|
||||
(displayln "Day 4"))
|
||||
|
||||
(define (parse-passport str)
|
||||
(define fields (string-split str #px"\\s+"))
|
||||
(for/hash ([f fields])
|
||||
(apply values (string-split f ":"))))
|
||||
|
||||
(define (read-input filename)
|
||||
(define passports-str (string-split (file->string filename) "\n\n"))
|
||||
(map parse-passport passports-str))
|
||||
|
||||
(define (valid? passport)
|
||||
(for/and ([key '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")])
|
||||
(hash-has-key? passport key)))
|
||||
|
||||
(define (part1 filename)
|
||||
(define passports (read-input filename))
|
||||
(length (filter valid? passports)))
|
||||
|
||||
(module+ test
|
||||
(check-equal? (part1 "test") 2))
|
||||
|
||||
(module+ main
|
||||
(displayln (part1 "input")))
|
||||
|
||||
(define (byr-valid? v)
|
||||
(<= 1920 (string->number v) 2002))
|
||||
|
||||
(module+ test
|
||||
(check-pred byr-valid? "2002")
|
||||
(check-pred (negate byr-valid?) "2003"))
|
||||
|
||||
(define (iyr-valid? v)
|
||||
(<= 2010 (string->number v) 2020))
|
||||
|
||||
(define (eyr-valid? v)
|
||||
(<= 2020 (string->number v) 2030))
|
||||
|
||||
(define (hgt-valid? v)
|
||||
(cond
|
||||
[(string-suffix? v "cm") (<= 150 (string->number (string-trim v "cm")) 193)]
|
||||
[(string-suffix? v "in") (<= 59 (string->number (string-trim v "in")) 76)]
|
||||
[else #f]))
|
||||
|
||||
(module+ test
|
||||
(check-pred hgt-valid? "60in")
|
||||
(check-pred hgt-valid? "190cm")
|
||||
(check-pred (negate hgt-valid?) "190in")
|
||||
(check-pred (negate hgt-valid?) "190"))
|
||||
|
||||
(define (hcl-valid? v)
|
||||
(regexp-match-exact? #px"#[0-9a-f]{6}" v))
|
||||
|
||||
(module+ test
|
||||
(check-pred hcl-valid? "#123abc")
|
||||
(check-pred (negate hcl-valid?) "#123abz")
|
||||
(check-pred (negate hcl-valid?) "123abc"))
|
||||
|
||||
(define (ecl-valid? v)
|
||||
(member v '("amb" "blu" "brn" "gry" "grn" "hzl" "oth")))
|
||||
|
||||
(module+ test
|
||||
(check-pred ecl-valid? "brn")
|
||||
(check-pred (negate ecl-valid?) "wat"))
|
||||
|
||||
(define (pid-valid? v)
|
||||
(regexp-match-exact? #px"[0-9]{9}" v))
|
||||
|
||||
(module+ test
|
||||
(check-pred pid-valid? "000000001")
|
||||
(check-pred (negate pid-valid?) "0123456789"))
|
||||
|
||||
(define (strict-valid? passport)
|
||||
(and (for/and ([key '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")])
|
||||
(hash-has-key? passport key))
|
||||
(byr-valid? (hash-ref passport "byr"))
|
||||
(iyr-valid? (hash-ref passport "iyr"))
|
||||
(eyr-valid? (hash-ref passport "eyr"))
|
||||
(hgt-valid? (hash-ref passport "hgt"))
|
||||
(hcl-valid? (hash-ref passport "hcl"))
|
||||
(ecl-valid? (hash-ref passport "ecl"))
|
||||
(pid-valid? (hash-ref passport "pid"))))
|
||||
|
||||
(define (part2 filename)
|
||||
(define passports (read-input filename))
|
||||
(length (filter strict-valid? passports)))
|
||||
|
||||
(module+ test
|
||||
(check-equal? (part2 "valid") 4)
|
||||
(check-equal? (part2 "invalid") 0))
|
||||
|
||||
(module+ main
|
||||
(displayln (part2 "input")))
|
1069
2020/day04/input
Normal file
1069
2020/day04/input
Normal file
File diff suppressed because it is too large
Load diff
13
2020/day04/invalid
Normal file
13
2020/day04/invalid
Normal file
|
@ -0,0 +1,13 @@
|
|||
eyr:1972 cid:100
|
||||
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
|
||||
|
||||
iyr:2019
|
||||
hcl:#602927 eyr:1967 hgt:170cm
|
||||
ecl:grn pid:012533040 byr:1946
|
||||
|
||||
hcl:dab227 iyr:2012
|
||||
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
|
||||
|
||||
hgt:59cm ecl:zzz
|
||||
eyr:2038 hcl:74454a iyr:2023
|
||||
pid:3556412378 byr:2007
|
13
2020/day04/test
Normal file
13
2020/day04/test
Normal file
|
@ -0,0 +1,13 @@
|
|||
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
|
||||
byr:1937 iyr:2017 cid:147 hgt:183cm
|
||||
|
||||
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
|
||||
hcl:#cfa07d byr:1929
|
||||
|
||||
hcl:#ae17e1 iyr:2013
|
||||
eyr:2024
|
||||
ecl:brn pid:760753108 byr:1931
|
||||
hgt:179cm
|
||||
|
||||
hcl:#cfa07d eyr:2025 pid:166559648
|
||||
iyr:2011 ecl:brn hgt:59in
|
12
2020/day04/valid
Normal file
12
2020/day04/valid
Normal file
|
@ -0,0 +1,12 @@
|
|||
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
|
||||
hcl:#623a2f
|
||||
|
||||
eyr:2029 ecl:blu cid:129 byr:1989
|
||||
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
|
||||
|
||||
hcl:#888785
|
||||
hgt:164cm byr:2001 iyr:2015 cid:88
|
||||
pid:545766238 ecl:hzl
|
||||
eyr:2022
|
||||
|
||||
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
|
Loading…
Add table
Add a link
Reference in a new issue