From b96d15bd46450926ff4b2713669244958e374273 Mon Sep 17 00:00:00 2001 From: kageru Date: Fri, 4 Dec 2020 10:17:59 +0100 Subject: [PATCH] Add 2020/04 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using a yaml parser for this is a stupid meme. Don’t try this at home, kids. --- 2020/04/Cargo.toml | 13 + 2020/04/input | 1096 +++++++++++++++++++++++++++++++++++++++++++ 2020/04/src/main.rs | 145 ++++++ 3 files changed, 1254 insertions(+) create mode 100644 2020/04/Cargo.toml create mode 100644 2020/04/input create mode 100644 2020/04/src/main.rs diff --git a/2020/04/Cargo.toml b/2020/04/Cargo.toml new file mode 100644 index 0000000..d8a846b --- /dev/null +++ b/2020/04/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "day04" +version = "0.1.0" +authors = ["kageru "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +itertools = "0.9.0" +regex = "1.4.2" +serde = { version = "1.0.117", features = ["derive"] } +serde_yaml = "0.8.14" diff --git a/2020/04/input b/2020/04/input new file mode 100644 index 0000000..6262a2c --- /dev/null +++ b/2020/04/input @@ -0,0 +1,1096 @@ +eyr:2027 +hcl:#602927 +hgt:186cm byr:1939 iyr:2019 pid:552194973 ecl:hzl + +pid:657988073 eyr:2020 byr:1996 +ecl:brn +hcl:#866857 iyr:2015 +hgt:164cm + +hcl:#fffffd +byr:1951 cid:321 iyr:2017 eyr:2022 ecl:brn hgt:62in pid:#6ef4e1 + +eyr:2025 iyr:2011 +byr:1980 +hcl:#fffffd cid:129 pid:420023864 +hgt:150cm +ecl:brn + +eyr:2029 +hcl:#ceb3a1 hgt:187cm +byr:1925 ecl:amb pid:223151011 iyr:2016 + +hcl:#cfa07d ecl:brn eyr:2022 pid:135392110 iyr:2010 +hgt:190cm +byr:1959 + +eyr:2024 cid:225 iyr:2018 +pid:522856696 byr:1961 +hcl:#a97842 ecl:grn + +eyr:2024 byr:1964 ecl:brn iyr:1976 +hcl:#866857 hgt:190cm pid:562135232 + +hgt:193cm pid:#6e4342 iyr:2011 byr:1936 cid:296 hcl:z +ecl:#3b8ed3 eyr:2022 + +cid:154 byr:1985 +pid:503255860 ecl:gry eyr:2023 +hcl:#efcc98 iyr:2014 + +eyr:2026 iyr:2012 pid:631051435 byr:1986 +ecl:amb +hgt:154cm hcl:#341e13 + +hcl:#623a2f +pid:318048681 ecl:brn +eyr:2035 +hgt:155cm +cid:179 +byr:1984 +iyr:2019 + +iyr:2013 hcl:#733820 +eyr:2024 hgt:189cm ecl:amb byr:1969 pid:185953891 + +hcl:#cfa07d +ecl:#38f2a6 iyr:2013 hgt:61cm eyr:2021 +byr:2012 pid:33668114 + +pid:47030948 hcl:4946ca iyr:2019 +hgt:189 +ecl:#1d136d byr:2013 eyr:2024 cid:51 + +ecl:grn iyr:2011 hgt:162cm byr:1935 hcl:#c0946f +pid:883047970 cid:51 +eyr:2020 + +pid:013760919 +iyr:2018 +byr:1942 ecl:blu hcl:#623a2f eyr:2020 +cid:221 hgt:155cm + +hgt:152cm eyr:2030 ecl:amb iyr:1986 hcl:#7d3b0c pid:29797863 +byr:2000 + +hgt:176cm +byr:1995 pid:546676799 iyr:2013 ecl:brn hcl:#fffffd +eyr:2023 + +byr:1955 pid:634493767 +eyr:2028 iyr:2015 ecl:oth + +hcl:#7d3b0c iyr:2020 cid:150 hgt:174cm pid:893757190 +eyr:2027 ecl:oth byr:2002 + +eyr:2029 pid:790648045 byr:1978 +iyr:2012 hcl:#efcc98 ecl:blu hgt:66in cid:256 + +iyr:2020 +byr:1945 hgt:155cm +cid:209 +eyr:2027 +hcl:#0eeb2d ecl:hzl pid:048725571 + +hcl:#cfa07d byr:2000 iyr:2011 +pid:381372526 ecl:oth eyr:2023 hgt:162cm + +ecl:blu pid:544462408 eyr:2030 hgt:171cm iyr:2018 +hcl:#602927 byr:1994 + +hcl:#733820 +iyr:2011 hgt:187cm ecl:hzl pid:533405863 byr:1962 cid:266 +eyr:2025 + +byr:1975 +hcl:#b6652a +iyr:2019 pid:967013712 +eyr:2029 hgt:155cm +ecl:oth + +iyr:2010 +eyr:2022 ecl:amb pid:052112145 byr:1982 hgt:190cm hcl:#b6652a + +iyr:2012 hgt:183cm hcl:#b6652a +byr:1950 ecl:hzl pid:946714779 eyr:2030 + +eyr:2027 +pid:686010502 +cid:103 byr:1993 hcl:#ceb3a1 ecl:gry hgt:70in iyr:2018 + +hcl:#733820 iyr:2012 hgt:157cm byr:1976 +eyr:2030 ecl:gry + +ecl:hzl byr:1955 hgt:180cm iyr:2017 eyr:2022 hcl:#6b5442 +pid:732940101 + +cid:299 hgt:188cm byr:1924 ecl:oth pid:905274031 iyr:2010 eyr:2024 hcl:#18171d + +eyr:2024 +hgt:174cm byr:1999 iyr:2013 +pid:021076124 hcl:#7f450a ecl:gry + +hcl:#866857 +iyr:2016 ecl:oth hgt:176cm +byr:1940 +pid:398320693 eyr:2026 + +hgt:172cm eyr:2020 +hcl:#733820 iyr:1931 ecl:#a0c290 pid:158cm + +ecl:blu iyr:2018 eyr:2025 +hcl:#341e13 +byr:1990 pid:444561212 hgt:182cm + +hcl:#602927 hgt:165cm pid:240732315 ecl:oth +eyr:2023 byr:1976 + +iyr:2016 ecl:brn pid:377612846 eyr:2021 +byr:1967 hcl:#733820 hgt:153cm + +hgt:187cm +iyr:2018 +eyr:2030 ecl:blu byr:1925 +hcl:#733820 cid:114 +pid:207103786 + +hgt:184cm ecl:blu +cid:111 iyr:2018 +pid:361909532 eyr:2025 + +ecl:grn byr:1968 iyr:2019 +hgt:184cm +pid:381103495 hcl:#7d3b0c eyr:2026 + +iyr:2019 byr:1945 +pid:727826617 hcl:#01adfd eyr:2020 +hgt:151cm + +cid:280 +iyr:2011 hcl:#efcc98 ecl:hzl eyr:2029 byr:1924 hgt:171cm +pid:235809608 + +hcl:#602927 byr:1973 pid:599786261 eyr:2029 hgt:172cm iyr:2010 ecl:gry cid:97 + +iyr:2017 +eyr:2027 +pid:768895320 hgt:163cm hcl:#866857 +byr:1940 ecl:oth + +hgt:178cm hcl:#6b5442 iyr:2013 byr:1959 pid:823221334 + +iyr:2014 pid:534201972 ecl:hzl hgt:150cm +hcl:#da8af3 byr:1945 cid:263 +eyr:2024 + +pid:469575516 +hgt:189cm byr:1994 eyr:2025 +iyr:2010 ecl:blu hcl:#efcc98 +cid:341 + +cid:167 eyr:2024 byr:1999 pid:797138561 hcl:#888785 +hgt:60in iyr:2015 + +iyr:2014 hcl:#866857 cid:103 +pid:909549652 byr:1967 hgt:174cm ecl:amb +eyr:2023 + +pid:813003671 ecl:oth hgt:61in cid:95 +iyr:2016 byr:1995 eyr:2027 + +eyr:2021 +hcl:#fffffd +pid:000088706 iyr:2014 ecl:blu +hgt:166cm byr:1951 + +cid:287 +ecl:grn byr:1941 iyr:2017 hcl:#18171d hgt:162cm pid:511728076 eyr:2022 + +pid:209898040 byr:1968 eyr:2025 hcl:#18171d +ecl:brn iyr:2017 +hgt:191cm + +byr:1932 +hcl:z hgt:190cm +cid:201 iyr:2016 pid:#02dfcc ecl:#6b9341 eyr:2004 + +iyr:2013 hcl:#ceb3a1 +hgt:191cm pid:501799813 +ecl:hzl +byr:1993 eyr:2020 + +ecl:blu cid:315 +pid:897450687 hgt:179cm byr:1984 eyr:2029 iyr:2012 hcl:#a97842 + +iyr:2011 ecl:gry hcl:#6b5442 pid:299193732 eyr:2020 byr:1945 hgt:190in + +hgt:158cm eyr:2022 pid:090738381 byr:1992 iyr:2017 +hcl:#fffffd ecl:oth + +eyr:2028 cid:92 ecl:amb hcl:#573edf pid:765588435 +iyr:2016 +hgt:179cm +byr:2002 + +eyr:2025 +pid:128081454 hcl:#967d2f hgt:190cm iyr:2015 ecl:oth + +hgt:189cm eyr:2025 +ecl:gry +hcl:#888785 +byr:1993 pid:001825574 cid:239 iyr:2019 + +byr:2013 pid:0758189515 hcl:z eyr:2034 iyr:1971 ecl:gry hgt:100 + +eyr:2026 byr:1943 hcl:#3638a2 iyr:2011 pid:539139386 +hgt:156cm ecl:hzl + +eyr:2030 pid:016597738 iyr:2017 +hgt:173cm ecl:brn hcl:#733820 byr:1956 + +eyr:2028 +iyr:2018 +pid:822607758 hcl:#cfa07d ecl:brn hgt:167cm byr:1974 + +eyr:2020 +byr:1980 +hgt:65in iyr:2020 +ecl:oth hcl:#efcc98 +pid:397182705 + +iyr:2015 byr:1954 +hcl:#ceb3a1 eyr:2024 pid:398087239 + +cid:256 hcl:234fc4 ecl:zzz +hgt:177in eyr:2027 iyr:2015 pid:159cm byr:2022 + +iyr:2018 cid:209 hcl:#a928b0 byr:1976 ecl:hzl pid:920448637 eyr:2025 hgt:158cm + +pid:96925844 iyr:2016 eyr:2030 hcl:#888785 ecl:gry +byr:1984 cid:223 hgt:165cm + +byr:1964 pid:831479208 hgt:153cm iyr:2014 +eyr:2024 +ecl:brn hcl:#18171d + +iyr:2019 ecl:brn +hgt:185cm +byr:1958 hcl:#ceb3a1 +eyr:2026 +pid:827043482 + +iyr:2020 hgt:67in cid:116 +hcl:#733820 ecl:blu pid:426593479 byr:1922 eyr:2026 + +eyr:2022 hcl:#fffffd +cid:330 pid:951768959 byr:1969 iyr:2019 hgt:156cm + +eyr:2030 ecl:oth byr:1929 +hgt:151cm cid:223 hcl:#111544 pid:083495633 +iyr:2019 + +eyr:2025 +iyr:2016 ecl:blu hgt:166cm byr:1967 +pid:739606431 + +eyr:2021 ecl:gry hcl:#ceb3a1 +pid:788420638 byr:1922 iyr:2020 hgt:161cm + +byr:1956 eyr:2025 +hcl:#888785 ecl:oth +pid:705051840 +hgt:158cm + +pid:047851403 byr:1937 hcl:#cfa07d +iyr:2015 +hgt:192cm eyr:2025 + +hgt:178cm cid:194 +iyr:2019 byr:1923 hcl:#c0946f pid:411527076 ecl:gry eyr:2022 + +hgt:186cm +iyr:2014 byr:1956 eyr:2027 ecl:brn +pid:976268893 hcl:#341e13 + +iyr:2011 cid:81 hcl:#18171d hgt:183cm byr:1958 ecl:brn eyr:2025 pid:389943720 + +eyr:2028 byr:1972 ecl:amb hcl:#c0946f pid:593351635 hgt:165cm + +iyr:2012 byr:1991 ecl:blu hcl:#341e13 hgt:169cm cid:156 pid:599766528 + +byr:2029 +hgt:75cm +pid:319443119 iyr:2001 eyr:2020 cid:306 ecl:zzz + +hcl:#866857 cid:273 ecl:grn byr:1948 hgt:167cm iyr:2014 pid:256331758 eyr:2021 + +iyr:2016 eyr:2024 ecl:oth hcl:#733820 +byr:1977 +pid:423680717 hgt:158cm cid:241 + +hcl:#341e13 pid:788619400 byr:1954 ecl:hzl cid:153 hgt:185cm eyr:2024 iyr:2017 + +hcl:#cfa07d ecl:blu hgt:161cm eyr:2026 pid:621023569 byr:1928 iyr:2016 + +cid:91 +byr:2024 hgt:168in +iyr:1951 +ecl:xry +eyr:1979 +hcl:aa8fc8 +pid:166cm + +eyr:2028 cid:155 hgt:159cm +byr:1952 +pid:875326712 +ecl:brn +iyr:2012 +hcl:#18171d + +eyr:2026 hcl:#733820 byr:1990 +hgt:163cm +ecl:amb iyr:2015 pid:162682954 + +iyr:2020 pid:936952728 byr:1969 ecl:brn +hgt:151cm hcl:#c0946f eyr:2029 + +hgt:189cm pid:132928469 +ecl:amb hcl:#866857 +byr:1928 eyr:2026 iyr:2013 + +ecl:grn pid:185240766 iyr:2012 +hgt:190cm byr:1952 hcl:#623a2f +eyr:2020 + +byr:2021 +eyr:2026 hgt:67cm ecl:#ef67e5 hcl:z iyr:1935 +pid:4900748653 cid:64 + +hgt:69in hcl:#7d3b0c cid:248 +eyr:2022 pid:076116194 byr:1979 +ecl:gry iyr:2016 + +byr:1991 eyr:2021 hgt:180cm iyr:2020 +cid:127 ecl:blu +hcl:#44e350 + +byr:1954 hcl:#733820 iyr:2018 pid:002868205 +hgt:150cm +ecl:brn +eyr:2021 + +pid:524531652 hcl:#623a2f cid:80 +ecl:amb +iyr:2017 +eyr:2020 hgt:170cm byr:1927 + +pid:424660272 iyr:2018 hcl:#efcc98 eyr:2021 cid:238 hgt:187cm byr:1970 ecl:blu + +byr:1923 +pid:946014113 cid:273 +iyr:2013 hgt:175cm ecl:brn hcl:#602927 eyr:2020 + +hcl:#6b5442 cid:88 ecl:gry iyr:2012 byr:1929 +hgt:71in +eyr:2022 pid:581329373 + +eyr:1960 +ecl:oth +iyr:2017 pid:022131529 cid:79 +hgt:184 +byr:2005 hcl:#6b5442 + +eyr:2030 pid:422677836 iyr:2011 +hcl:#fffffd byr:1925 hgt:60in ecl:gry + +cid:325 hgt:158cm byr:1971 ecl:hzl pid:517329528 hcl:#18171d eyr:2026 iyr:2011 + +byr:1937 +cid:259 +eyr:2030 hgt:176cm ecl:blu pid:321795494 iyr:2017 + +pid:551525002 +ecl:grn +eyr:2026 iyr:2013 cid:230 hgt:74in hcl:#cfa07d byr:1954 + +pid:004366607 +hcl:c39522 hgt:66cm +ecl:#21a3e9 eyr:2024 cid:139 + +ecl:xry +eyr:2037 byr:2016 iyr:1994 cid:98 pid:522572315 +hgt:158cm hcl:0ee9d4 + +cid:70 eyr:2028 hgt:179cm +pid:073189127 ecl:grn iyr:2018 hcl:#142217 +byr:1977 + +pid:045852463 +cid:69 iyr:2020 ecl:brn byr:1948 eyr:2020 hgt:64in hcl:#733820 + +cid:268 +byr:1970 eyr:2025 hgt:178cm pid:512594967 iyr:2011 ecl:brn hcl:#733820 + +eyr:2025 hcl:#18171d +iyr:2014 byr:1950 hgt:161cm +pid:329927551 + +byr:1956 eyr:2024 hgt:163cm pid:965746490 +hcl:#a97842 ecl:brn +cid:100 iyr:2010 + +cid:112 eyr:2027 pid:864571411 hgt:190cm +iyr:2011 byr:1962 ecl:grn hcl:#602927 + +ecl:gry cid:54 iyr:2011 hcl:#6b5442 byr:1922 +eyr:2025 pid:689641249 +hgt:159cm + +eyr:2028 +cid:323 iyr:2020 +hgt:158cm +ecl:hzl pid:876082513 byr:1941 + +hcl:#18171d hgt:160cm pid:910116712 +ecl:oth iyr:2014 byr:1927 +eyr:2023 +cid:226 + +iyr:2030 hcl:#602927 eyr:2030 ecl:grn cid:183 hgt:186cm byr:1963 +pid:706533329 + +cid:279 +eyr:2026 iyr:2015 byr:1958 pid:120633047 hgt:150cm +ecl:hzl hcl:#866857 + +iyr:2019 +byr:1989 hcl:#733820 ecl:hzl pid:470596304 hgt:187cm eyr:2022 + +eyr:2027 hcl:#888785 cid:346 +iyr:2013 hgt:167cm ecl:hzl byr:1994 pid:528844948 + +hcl:#fffffd pid:969181309 +iyr:2014 +hgt:192cm eyr:2025 byr:1970 +ecl:amb + +eyr:2026 iyr:2012 +hcl:#341e13 ecl:oth pid:053348609 +byr:1931 hgt:167cm + +eyr:2029 ecl:grn pid:030276279 iyr:2013 hgt:182cm hcl:#fffffd +byr:1967 + +byr:1949 +eyr:2022 +hcl:#ceb3a1 iyr:2016 ecl:oth hgt:177cm +cid:224 pid:745439371 + +iyr:2016 byr:1940 eyr:2028 pid:351021541 hcl:#341e13 ecl:amb hgt:64in + +cid:309 +hgt:74in pid:698666542 +hcl:#866857 ecl:oth byr:1953 +iyr:2019 +eyr:2021 + +iyr:2013 +byr:1979 eyr:2023 hgt:186cm ecl:brn +cid:236 +pid:727367898 +hcl:#733820 + +hgt:65cm byr:1956 +eyr:2025 pid:371685442 iyr:2016 ecl:oth cid:245 hcl:#623a2f + +hgt:155cm ecl:grn hcl:#888785 +eyr:2027 iyr:2010 byr:1927 +pid:916070590 + +hgt:179cm +ecl:blu hcl:#866857 byr:1993 iyr:2019 cid:332 eyr:2022 pid:354895012 + +iyr:2029 hgt:69cm +hcl:#efcc98 +pid:179cm cid:216 byr:2007 ecl:oth +eyr:2025 + +iyr:1988 hgt:187 hcl:z +ecl:#30e67c byr:2020 +pid:225115160 eyr:2037 + +eyr:2021 iyr:2011 hgt:188cm +ecl:hzl +byr:1965 pid:455044780 + +ecl:gry pid:750994177 +byr:2002 +iyr:2016 +eyr:2023 hgt:61in +hcl:#fffffd + +iyr:2020 +ecl:gry pid:304482618 +hcl:#18171d eyr:2027 +byr:1955 hgt:177cm + +hgt:187cm byr:1981 pid:795201673 +eyr:2020 +cid:154 +hcl:#b6652a iyr:2017 ecl:oth + +ecl:gry byr:1954 hgt:151cm iyr:2019 +cid:101 +eyr:2026 hcl:#cfa07d pid:930011749 + +ecl:zzz eyr:1955 pid:#d45ed4 cid:338 iyr:2030 hcl:z +byr:1999 + +eyr:2020 pid:861636258 hgt:166cm hcl:#7d3b0c ecl:brn +iyr:2018 cid:125 byr:1958 + +iyr:2014 eyr:2022 +hgt:67 +hcl:#7d3b0c ecl:brn byr:1935 pid:409864761 + +hcl:#866857 iyr:2012 cid:94 +pid:483584137 byr:2000 ecl:blu hgt:178cm eyr:2022 + +byr:1946 ecl:hzl iyr:2015 eyr:2028 hgt:184cm +hcl:#602927 +pid:947292495 + +byr:1974 cid:96 hgt:59in eyr:2028 pid:358779220 hcl:#6b5442 ecl:gry iyr:2014 + +hcl:#61154f byr:1932 +hgt:167cm ecl:brn cid:126 eyr:2022 + +ecl:gry +iyr:2014 hgt:169cm +byr:1926 eyr:2020 +hcl:#866857 +pid:463772660 + +pid:654733578 ecl:hzl cid:111 iyr:2010 +hcl:#fffffd eyr:2024 hgt:191cm byr:1943 + +eyr:2021 +hgt:74cm hcl:#c0946f iyr:2026 +pid:164776417 byr:1977 + +ecl:#6db74f iyr:1921 pid:442332495 +byr:2018 +hcl:z cid:101 eyr:1949 + +cid:332 byr:2022 +ecl:blu +eyr:2038 +iyr:1939 +hcl:518816 hgt:191cm +pid:10107923 + +pid:168853141 iyr:2010 eyr:2021 byr:1996 ecl:hzl hgt:183cm +hcl:#733820 + +hgt:62in pid:556617728 +hcl:336a3b eyr:2023 +byr:2029 +ecl:xry iyr:2016 +cid:89 + +ecl:hzl hcl:#efcc98 +iyr:2020 cid:297 hgt:181cm +pid:075811396 eyr:2023 byr:1960 + +eyr:2030 hcl:#602927 ecl:brn +iyr:2015 hgt:75in byr:1995 + +ecl:grn cid:237 hcl:#8936bb hgt:183cm eyr:2028 +iyr:2015 byr:1998 + +pid:550427102 hgt:67in byr:1991 ecl:gry hcl:#efcc98 + +cid:274 hgt:70cm +iyr:2022 eyr:1961 hcl:00f05b +byr:1948 ecl:gmt + +ecl:blu iyr:2018 +hgt:153cm eyr:2020 pid:831302208 byr:1927 hcl:#18171d cid:150 + +iyr:2018 +byr:1973 hcl:#ceb3a1 +cid:215 +hgt:192cm pid:770473271 eyr:2027 ecl:blu + +iyr:2019 eyr:2021 hcl:#623a2f ecl:hzl hgt:174cm byr:1962 +pid:589533254 + +iyr:2012 ecl:hzl +hgt:184cm cid:292 byr:1991 pid:677889195 hcl:#a97842 + +iyr:2010 +pid:#4f47c3 +hgt:154in +cid:69 +hcl:z byr:2022 +ecl:#e36a65 + +ecl:#5ff50c pid:499582878 hcl:#b6652a hgt:171cm iyr:2016 +byr:1930 eyr:2024 + +hgt:159cm byr:1936 eyr:2028 +hcl:#6b5442 ecl:amb iyr:2015 pid:658019126 + +byr:1928 pid:599970280 eyr:2026 ecl:grn hgt:158cm hcl:#18171d +cid:239 iyr:2013 + +pid:684820830 hgt:182cm ecl:oth hcl:#c0946f eyr:2023 +iyr:2018 + +iyr:2019 ecl:blu pid:668361647 cid:348 +byr:1952 hcl:#602927 +eyr:2021 hgt:71in + +hgt:165cm +ecl:grn eyr:2030 iyr:2010 pid:256350027 hcl:#7d5994 cid:193 byr:1947 + +hcl:#602927 iyr:2019 ecl:gry eyr:2029 +byr:1931 cid:118 hgt:153cm pid:911300650 + +eyr:2025 hgt:154cm +hcl:#866857 iyr:2016 ecl:grn pid:515526226 byr:1936 + +hcl:#623a2f hgt:160cm iyr:2019 ecl:oth +pid:932621460 +eyr:2030 +byr:1990 + +hcl:#623a2f ecl:blu eyr:2027 cid:277 pid:662549708 +byr:1949 iyr:2016 hgt:176cm + +iyr:2010 eyr:2021 +byr:1947 +pid:223603325 ecl:gry + +ecl:gry pid:145738978 eyr:2029 iyr:2020 +hcl:#733820 byr:1949 hgt:183cm + +hgt:63in eyr:2028 iyr:2011 hcl:#a97842 byr:1941 ecl:gry +pid:091089766 + +hcl:#fffffd +cid:275 hgt:157cm +eyr:2021 byr:1978 +ecl:hzl iyr:2020 pid:242258232 + +pid:239061408 ecl:oth +eyr:2023 iyr:2011 hgt:192cm byr:1949 hcl:#733820 cid:132 + +byr:1954 +hgt:152cm ecl:brn pid:667414305 eyr:2021 +cid:282 +iyr:2014 +hcl:#341e13 + +iyr:2018 +pid:745564182 hgt:186cm eyr:2028 hcl:#7d3b0c byr:1935 ecl:gry + +iyr:2014 +eyr:2026 hcl:d26483 +byr:1972 pid:611712147 hgt:163cm ecl:#57d27c + +cid:322 eyr:2025 byr:1937 +iyr:2020 +ecl:blu hcl:#cfa07d hgt:158cm +pid:150255302 + +eyr:2030 iyr:2011 hcl:#866857 byr:1974 ecl:blu pid:755213661 hgt:155cm +cid:116 + +hcl:#866857 pid:679616797 +ecl:gry hgt:166cm byr:1999 iyr:2014 eyr:2025 + +iyr:2019 hcl:#fffffd +hgt:158cm +eyr:2028 pid:835993614 byr:1920 + +ecl:brn pid:742320152 iyr:2013 +hgt:151cm eyr:2025 cid:63 byr:1931 hcl:#200aaa + +byr:1950 cid:155 ecl:xry +hgt:150cm +iyr:2014 +eyr:2027 hcl:#615954 pid:596469710 + +byr:1946 hgt:166cm ecl:gry +hcl:#18171d cid:261 iyr:2016 pid:267318602 eyr:2021 + +ecl:gry hgt:185cm iyr:2013 pid:092573029 +eyr:2023 byr:1956 hcl:#b6652a + +byr:1997 hgt:172cm eyr:2021 iyr:2014 pid:337403043 +ecl:blu hcl:#efcc98 + +hgt:190cm iyr:2015 byr:1949 eyr:2023 +pid:230935940 + +byr:1980 hgt:171cm eyr:2021 pid:9435249395 +ecl:oth +hcl:#a97842 +iyr:2017 + +byr:2011 hcl:#b6652a eyr:2039 ecl:hzl iyr:1923 +hgt:186cm pid:239188418 cid:93 + +pid:791787662 cid:51 ecl:gry hcl:#602927 hgt:160cm iyr:2020 +eyr:2028 byr:1975 + +ecl:amb pid:720900081 byr:1978 hcl:#a97842 hgt:183cm iyr:2016 +eyr:2022 + +eyr:2027 hgt:157cm pid:628454234 +hcl:#18171d ecl:gry iyr:2017 cid:345 byr:1988 + +byr:1985 pid:996422540 +iyr:2013 hgt:66in ecl:grn +eyr:2020 hcl:#341e13 + +eyr:2022 +pid:186cm +cid:214 iyr:2017 hcl:#866857 ecl:brn byr:1988 hgt:161cm + +iyr:2019 eyr:2025 pid:752184592 hgt:154cm byr:1966 hcl:#18171d cid:119 ecl:grn + +hcl:#b6652a cid:100 byr:1974 pid:477922277 eyr:2024 ecl:grn iyr:2011 hgt:59in + +iyr:2013 ecl:brn +hgt:184cm eyr:2023 byr:1969 +pid:514127885 hcl:#6b5442 + +hcl:#cfa07d +iyr:2020 byr:1923 ecl:gry hgt:64in eyr:2029 cid:111 + +byr:1921 hgt:73in pid:971490088 iyr:2016 eyr:2025 hcl:#866857 cid:271 ecl:blu + +ecl:oth +eyr:2023 iyr:2019 hgt:179cm +byr:1953 pid:226869705 hcl:#602927 +cid:63 + +hgt:175cm ecl:hzl iyr:2010 byr:1938 eyr:2021 pid:718683561 hcl:#341e13 + +iyr:2023 hgt:189in byr:2030 pid:171cm ecl:#447c00 hcl:z eyr:2022 + +ecl:blu eyr:2026 +hgt:191cm iyr:2020 hcl:#888785 pid:128824091 cid:99 byr:1982 + +eyr:2026 pid:333173949 iyr:2017 ecl:oth byr:1928 hcl:#fffffd +hgt:151cm + +hcl:#6b5442 ecl:grn byr:1945 +pid:888990994 +cid:168 eyr:2026 iyr:2016 +hgt:158cm + +ecl:grn iyr:2013 +byr:1931 pid:716975878 hgt:168cm hcl:#cfa07d eyr:2023 + +pid:815050555 +ecl:blu +hgt:161cm hcl:#888785 eyr:2025 +iyr:2020 byr:1980 + +pid:470039281 +byr:1967 iyr:2017 +ecl:gry eyr:2021 +hgt:171cm +hcl:#7d3b0c + +hcl:#bdf8d6 iyr:2018 byr:1954 eyr:2030 +ecl:blu hgt:184cm pid:694267794 + +hcl:#cfa07d byr:1971 ecl:brn +iyr:2016 hgt:167cm eyr:2027 pid:237865320 + +byr:1921 eyr:2028 +iyr:2014 pid:186145415 cid:215 ecl:oth hgt:176cm +hcl:#a97842 + +pid:925805272 +hcl:#7d3b0c +eyr:2030 +hgt:65in ecl:blu + +byr:1992 +cid:278 +ecl:oth hgt:65in hcl:#c0946f +iyr:2013 +pid:092712496 eyr:2024 + +hgt:151cm +iyr:2018 hcl:#18171d +byr:1971 pid:599220575 cid:321 +eyr:2030 +ecl:brn + +byr:1956 iyr:2016 hcl:#b6652a +pid:109381754 +ecl:hzl cid:233 + +iyr:2015 byr:1988 +hcl:#866857 ecl:amb +pid:274656754 +hgt:152cm eyr:2022 + +eyr:2028 ecl:amb cid:285 +byr:1947 +hgt:186cm pid:165847317 hcl:#733820 iyr:2013 + +hcl:#866857 pid:601229952 eyr:2023 ecl:brn +hgt:191cm +cid:183 + +hgt:191cm iyr:2018 hcl:#b50bab byr:1936 eyr:2025 pid:422563929 ecl:oth + +ecl:gry +eyr:2025 hgt:181cm +hcl:#a97842 +byr:1971 iyr:2010 pid:267796608 + +hcl:#0fd3b0 eyr:2030 +iyr:2014 ecl:oth pid:606512017 hgt:173cm cid:301 +byr:1999 + +byr:1937 cid:277 +pid:148179917 hgt:179cm hcl:#602927 iyr:2018 +eyr:2029 ecl:grn + +hcl:#7d3b0c +byr:1960 +ecl:hzl hgt:162cm +iyr:2015 pid:014246579 +eyr:2023 + +ecl:blu eyr:2020 +iyr:2011 byr:1955 hcl:#777876 hgt:188cm pid:988764375 + +iyr:2012 ecl:amb hcl:#18171d +pid:524961020 byr:1983 hgt:173cm eyr:2028 + +hgt:153cm hcl:#efcc98 pid:127759635 +iyr:2019 byr:1932 +ecl:hzl eyr:2020 + +eyr:2025 pid:421725637 +ecl:gry iyr:2013 +hcl:#c0946f +byr:1971 + +iyr:2015 pid:654033544 +cid:176 +hgt:163cm +byr:1923 ecl:brn hcl:#866857 + +hcl:#623a2f byr:2013 +hgt:76cm ecl:#5cd4a8 iyr:2007 +eyr:2035 cid:128 pid:122621229 + +hcl:#927794 iyr:2019 byr:1964 hgt:158cm +ecl:oth pid:269737193 eyr:2025 + +iyr:2014 cid:181 +ecl:blu byr:1949 hcl:#341e13 eyr:2026 pid:120077363 hgt:174cm + +cid:161 eyr:2024 hcl:z +pid:638178037 hgt:151cm byr:1920 ecl:oth +iyr:2011 + +ecl:brn eyr:2023 hgt:161cm hcl:#a97842 byr:1977 cid:79 pid:177001463 iyr:2014 + +byr:1938 eyr:1967 +ecl:grn pid:302413712 hcl:#888785 hgt:183cm iyr:2010 + +hgt:164cm +byr:1955 pid:772380994 iyr:2015 hcl:#c0946f eyr:2025 ecl:amb + +hcl:#602927 +eyr:2021 byr:1924 hgt:171cm cid:161 ecl:amb iyr:2019 + +hgt:119 +hcl:7d1404 eyr:1957 +pid:143311761 iyr:2027 +byr:1939 ecl:#de1d21 + +hgt:182cm +iyr:2015 ecl:blu cid:205 pid:136552613 hcl:#ceb3a1 byr:1992 + +ecl:blu iyr:2013 cid:54 byr:1998 +hcl:z hgt:172cm eyr:2034 pid:#ec3c3a + +byr:1975 ecl:blu eyr:2025 hcl:#623a2f +pid:358585328 +iyr:2012 + +pid:282306278 +byr:1958 ecl:grn hgt:190cm iyr:2020 hcl:#18171d cid:276 eyr:2024 + +byr:1955 eyr:2028 iyr:2017 +hgt:177cm ecl:grn +pid:111002386 hcl:#6b5442 + +eyr:2026 pid:694088201 hcl:#866857 hgt:169cm byr:1957 ecl:amb iyr:2018 cid:109 + +hgt:171cm ecl:blu iyr:2013 +eyr:2021 +hcl:#6b5442 byr:1965 +pid:268169550 + +pid:803092066 +eyr:2023 iyr:2010 hcl:#a97842 ecl:grn byr:1956 hgt:191cm cid:173 + +eyr:2024 +iyr:2012 byr:1991 ecl:gry pid:946620993 +hgt:190cm hcl:#b6652a cid:181 + +iyr:2019 hcl:#cfa07d cid:75 hgt:175cm +eyr:2022 pid:062548271 ecl:oth + +cid:262 +byr:1956 +iyr:2014 pid:860561420 hcl:#888785 hgt:176cm + +hcl:#efcc98 hgt:188cm pid:828180303 iyr:2013 byr:1932 ecl:gry eyr:2028 + +eyr:2029 +hcl:#341e13 byr:1992 ecl:brn iyr:2012 cid:292 +pid:644391775 hgt:150cm + +ecl:grn hgt:182cm eyr:2026 hcl:#ceb3a1 byr:1982 pid:625704144 iyr:2013 + +byr:1926 +iyr:2013 ecl:brn hcl:#812218 eyr:2025 hgt:150cm pid:610910806 + +hgt:61in byr:1926 iyr:2017 eyr:2020 ecl:oth +hcl:#623a2f pid:347974562 + +hgt:185cm eyr:2023 ecl:blu byr:1940 pid:123961293 iyr:2014 +hcl:#a97842 + +iyr:2011 byr:1984 hgt:172cm eyr:2020 hcl:#692e6c ecl:grn pid:342962046 + +ecl:blu hcl:#b08932 pid:343331979 +iyr:2019 +hgt:193cm byr:1985 +cid:269 eyr:2023 + +hcl:#fffffd ecl:blu +pid:483091240 +iyr:2011 eyr:2022 byr:1988 + +iyr:2019 +hgt:177cm +pid:516533115 +cid:294 ecl:amb hcl:#ceb3a1 byr:1922 + +byr:1965 eyr:2023 hcl:#cfa07d +iyr:2013 +hgt:193cm ecl:grn +pid:931305875 + +ecl:hzl +byr:1944 hgt:164cm +hcl:#fffffd +iyr:2019 eyr:2029 pid:141532765 cid:209 + +iyr:2013 hgt:189cm +ecl:brn +pid:604140631 eyr:2022 hcl:#ceb3a1 +byr:1935 + +ecl:amb hcl:#888785 byr:1959 +cid:287 pid:849438430 hgt:152cm +eyr:2027 +iyr:2020 + +byr:1988 hcl:#623a2f eyr:2029 ecl:brn iyr:2018 hgt:167cm pid:470443459 + +cid:276 +hcl:#341e13 +eyr:2021 +iyr:2012 ecl:hzl hgt:175cm +byr:2027 pid:271833606 + +eyr:2027 +iyr:2010 pid:970527839 hgt:164cm byr:1974 hcl:#623a2f +ecl:amb + +eyr:2020 ecl:grn byr:1932 iyr:2013 pid:104193512 +hcl:#c0946f + +eyr:2030 +byr:1982 hgt:65in ecl:blu +hcl:#623a2f +pid:570953460 iyr:2020 + +eyr:2020 byr:1922 +hcl:#602927 pid:803264417 iyr:2019 +ecl:grn +hgt:169cm + +ecl:amb hcl:#866857 byr:1963 hgt:170cm +eyr:2028 +pid:762546796 iyr:2017 + +eyr:2035 pid:54291174 +cid:184 +iyr:1980 hgt:176cm ecl:gry hcl:#733820 byr:1974 + +iyr:2013 hcl:#c0946f pid:408646971 hgt:63in cid:84 +byr:1951 +ecl:amb eyr:2028 + +eyr:2021 hcl:#6b5442 byr:1994 hgt:170cm ecl:amb pid:348959147 +iyr:2013 + +byr:1957 +ecl:hzl hgt:156cm pid:890752588 eyr:2025 +hcl:e7c520 cid:199 iyr:2017 + +hgt:169cm iyr:2016 +cid:180 hcl:#733820 eyr:2024 ecl:hzl pid:661114936 byr:1928 + +iyr:2015 eyr:2020 byr:1941 hgt:179cm pid:148063033 +hcl:#6b5442 ecl:brn + +iyr:1935 pid:14292032 byr:2020 +eyr:1956 ecl:#c9bc33 +hgt:59cm hcl:#cfa07d + +hgt:165cm iyr:2010 +eyr:2023 +hcl:#733820 pid:312465756 +cid:112 byr:1993 ecl:amb + +eyr:2032 ecl:grt iyr:1963 +byr:1964 +pid:#f5628c +hcl:z hgt:111 + +hgt:169cm iyr:2012 +hcl:#623a2f cid:291 ecl:oth +pid:809080900 byr:1979 eyr:2023 + +iyr:2021 eyr:2033 ecl:gmt hgt:59cm byr:1967 +pid:2498700612 + +byr:1953 ecl:oth iyr:2013 +hcl:#b6652a pid:442586860 + +pid:095687847 eyr:2022 hgt:151cm byr:1967 iyr:2017 ecl:oth hcl:#866857 + +hcl:#866857 pid:983640144 hgt:61cm +ecl:hzl +byr:1991 +iyr:1930 eyr:2024 + +ecl:oth hcl:#602927 eyr:2025 iyr:2013 hgt:151cm byr:1992 pid:812583062 diff --git a/2020/04/src/main.rs b/2020/04/src/main.rs new file mode 100644 index 0000000..9b288d1 --- /dev/null +++ b/2020/04/src/main.rs @@ -0,0 +1,145 @@ +#![feature(test)] +extern crate test; +use itertools::Itertools; +use regex::Regex; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Passport { + byr: usize, + iyr: usize, + eyr: usize, + hgt: String, + hcl: String, + ecl: String, + pid: String, // can’t be usize because yaml doesn’t like 0-leading numbers + cid: Option, +} + +fn read_input() -> String { + std::fs::read_to_string("input").unwrap() +} + +/// When I first saw the input and puzzle, I thought +/// “well, this is stupid, so I’ll do something stupid and parse it as yaml with serde”. +/// That decision was objectively awful and not even worth it for the meme, +/// but I’m too stubborn to give up now. +/// Also, I didn’t know the yaml spec was *that* broken. Fucking hell. +fn parse_input(s: &str) -> Vec { + s.replace(' ', "\n") + .replace(':', ": ") + .replace('#', "§") // # is a comment in yaml rooDerp + .split("\n\n") + .map(serde_yaml::from_str) + .filter_map(Result::ok) + .collect() +} + +fn validate_height(hgt: &str) -> bool { + if let Some(cm) = hgt.strip_suffix("cm").and_then(|s| s.parse::().ok()) { + cm >= 150 && cm <= 193 + } else if let Some(inch) = hgt.strip_suffix("in").and_then(|s| s.parse::().ok()) { + inch >= 59 && inch <= 76 + } else { + false + } +} + +fn part2(ps: &Vec) -> usize { + let hcl_regex = Regex::new("§[0-9a-f]{6}").unwrap(); + let ecl_regex = Regex::new("(amb|blu|brn|gry|grn|hzl|oth)").unwrap(); + let pid_regex = Regex::new(r"^\d{9}$").unwrap(); + ps.iter() + .filter(|p| { + p.byr >= 1920 + && p.byr <= 2002 + && p.iyr >= 2010 + && p.iyr <= 2020 + && p.eyr >= 2020 + && p.eyr <= 2030 + && validate_height(&p.hgt) + && hcl_regex.is_match(&p.hcl) + && ecl_regex.is_match(&p.ecl) + && pid_regex.is_match(&p.pid) + }) + .count() +} + +fn main() { + let i = parse_input(&read_input()); + println!("Part 1: {}", i.len()); + println!("Part 2: {}", part2(&i)); +} + +#[cfg(test)] +mod tests { + use super::*; + use test::black_box; + + const TEST_INPUT: &str = "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"; + + #[test] + fn part1_test() { + assert_eq!(parse_input(TEST_INPUT).len(), 2); + } + + const P2_INVALID: &str = "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"; + + const P2_VALID: &str = "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"; + + #[test] + fn part2_test() { + let valid = parse_input(P2_VALID); + assert_eq!(part2(&valid), valid.len()); + + let invalid = parse_input(P2_INVALID); + assert_eq!(part2(&invalid), 0); + } + + #[bench] + fn bench_input_parsing(b: &mut test::Bencher) { + let raw = read_input(); + b.iter(|| assert_eq!(parse_input(black_box(&raw)).len(), 235)) + } + + #[bench] + fn bench_part2(b: &mut test::Bencher) { + let parsed = parse_input(&read_input()); + b.iter(|| assert_eq!(black_box(part2(&parsed)), 194)) + } +}