From efd70672fb0bc5cc29672b480401cc7be2466c57 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 4 Dec 2020 15:59:15 -0500 Subject: day 4 --- data/4.txt | 1169 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/2020/4/mod.rs | 132 ++++++ src/2020/mod.rs | 4 + src/util.rs | 11 +- 4 files changed, 1315 insertions(+), 1 deletion(-) create mode 100644 data/4.txt create mode 100644 src/2020/4/mod.rs diff --git a/data/4.txt b/data/4.txt new file mode 100644 index 0000000..646dcfe --- /dev/null +++ b/data/4.txt @@ -0,0 +1,1169 @@ +byr:2024 iyr:2016 +eyr:2034 ecl:zzz pid:985592671 hcl:033b48 +hgt:181 cid:166 + +hgt:66cm +pid:152cm +hcl:cfb18a eyr:1947 +byr:2020 ecl:zzz iyr:2029 + +ecl:gry hcl:#888785 eyr:2023 cid:63 +iyr:2019 hgt:177cm +pid:656793259 + +pid:#5e832a +ecl:dne hcl:#7d3b0c byr:2018 eyr:1928 hgt:61cm iyr:1936 cid:241 + +hcl:#888785 ecl:oth eyr:2025 +pid:597580472 +iyr:2017 hgt:187cm byr:1957 cid:247 + +eyr:2029 cid:145 iyr:2026 pid:178cm hgt:162in ecl:gry +hcl:#a5d09f byr:2002 + +eyr:2024 +ecl:amb +pid:349191561 iyr:2018 hgt:156cm byr:1972 +hcl:#341e13 + +byr:1998 pid:408617933 +hcl:#fffffd hgt:193cm eyr:2021 ecl:brn iyr:2013 + +eyr:1964 byr:2026 +hcl:#cfa07d hgt:154cm pid:175cm cid:85 iyr:2018 ecl:gmt + +hgt:161cm +pid:021086946 +iyr:2020 ecl:blu eyr:2024 +byr:1921 + +pid:173cm cid:235 eyr:1935 iyr:1952 ecl:utc byr:2015 hgt:187 +hcl:6239ed + +iyr:2015 hcl:#18171d pid:2691566700 ecl:gmt hgt:68cm eyr:2032 byr:2016 +cid:341 + +hcl:#c0946f +iyr:2010 pid:941290886 eyr:2023 ecl:brn +hgt:190cm +byr:1927 + +pid:423210256 eyr:2026 iyr:2011 byr:1926 hcl:#efcc98 +ecl:grn +hgt:185cm cid:135 + +ecl:blu eyr:2030 +byr:1996 hgt:154cm iyr:2019 pid:809421142 +hcl:#b6652a +cid:250 + +hcl:39615c iyr:1934 byr:2009 pid:7752456272 hgt:191cm +eyr:2024 ecl:#5b7a58 + +iyr:1938 hgt:160in hcl:#623a2f eyr:2031 +ecl:grn pid:169cm byr:1964 + +ecl:grt byr:2004 hcl:026249 hgt:176in iyr:1933 eyr:2023 +pid:176cm + +hgt:167cm +pid:023312072 ecl:oth iyr:2018 hcl:#866857 eyr:2024 byr:1994 + +hcl:#c0946f +ecl:blu iyr:2016 +eyr:2023 hgt:193cm +pid:190756361 byr:1943 +cid:306 + +iyr:2013 hgt:179cm ecl:oth +cid:290 eyr:2020 pid:953948851 +hcl:#6b5442 +byr:1973 + +pid:795414848 +cid:51 +ecl:oth iyr:2020 hcl:#ceb3a1 eyr:2026 byr:1995 hgt:186cm + +iyr:2020 +byr:1993 hgt:159cm pid:905121332 +ecl:brn eyr:2023 +hcl:#341e13 + +ecl:hzl iyr:2017 eyr:2020 hcl:z byr:2003 hgt:163 + +eyr:2038 +cid:342 hgt:116 iyr:2019 hcl:73db63 byr:1973 ecl:gry pid:468207739 + +pid:022772899 eyr:2040 hgt:181cm +ecl:dne +hcl:#866857 +byr:1931 iyr:2012 + +pid:36127238 eyr:2038 cid:227 iyr:1985 hgt:103 byr:2004 +hcl:z ecl:#45a680 + +hgt:183cm +iyr:2013 byr:1933 cid:112 +eyr:2024 pid:795616425 +hcl:#7d3b0c +ecl:gry + +cid:236 byr:1985 hgt:160cm +hcl:#6b5442 eyr:2028 +ecl:gmt pid:277781460 iyr:2018 + +ecl:amb +byr:1948 pid:750948701 eyr:2025 iyr:2013 hgt:62in hcl:#7d3b0c + +eyr:2029 iyr:2020 pid:385941629 byr:1998 hgt:153cm cid:321 +hcl:#623a2f + +byr:1966 hgt:69in iyr:2012 +pid:423254216 +eyr:2020 hcl:#602927 ecl:blu + +byr:2004 pid:14257358 cid:338 iyr:2010 +ecl:gry +hcl:#602927 +hgt:152cm + +ecl:gry eyr:2027 hcl:#341e13 +iyr:2018 pid:298762877 hgt:162cm byr:1968 + +hcl:#ceb3a1 +iyr:2019 ecl:brn eyr:2020 pid:575413143 byr:2030 hgt:185cm +cid:159 + +eyr:2025 pid:628251539 ecl:blu byr:1953 hgt:63in hcl:#18171d iyr:2016 + +pid:973247326 byr:1925 hcl:#341e13 ecl:grn eyr:2028 hgt:156cm +iyr:2014 + +byr:1957 hgt:154cm +hcl:#7d3b0c +pid:062760305 eyr:2023 ecl:brn +iyr:2012 + +ecl:brn eyr:2029 +cid:250 +pid:477431667 hgt:177cm +byr:1993 iyr:2020 hcl:#ceb3a1 + +pid:155471269 iyr:2010 byr:1985 hgt:169cm eyr:2026 hcl:#694b7d cid:337 ecl:gry + +ecl:grt hgt:152in byr:2012 +pid:#b9d022 iyr:2030 +eyr:2037 hcl:z cid:201 + +hcl:9270b3 eyr:2028 +hgt:71cm iyr:2017 pid:#6c7af7 ecl:grn byr:1971 + +pid:#0ab7e1 hgt:166cm byr:1929 +cid:289 +hcl:#623a2f iyr:2005 +ecl:amb + +pid:967754435 +hgt:175cm hcl:#341e13 ecl:utc iyr:2023 eyr:1949 byr:1988 + +byr:1942 ecl:brn eyr:2023 pid:898126666 hgt:182cm cid:138 +hcl:#866857 +iyr:2010 + +eyr:2027 iyr:2019 byr:1953 pid:760664328 hcl:#b6652a +ecl:grn hgt:155cm + +iyr:2018 +ecl:brn hcl:#18171d pid:953129359 hgt:167cm eyr:2030 byr:1974 + +cid:77 +pid:975070417 hcl:#b6652a ecl:amb iyr:2013 byr:1995 +eyr:2025 hgt:184cm + +hgt:168cm +eyr:2026 byr:1938 ecl:gry pid:037135813 hcl:#6b5442 +iyr:2010 + +iyr:2017 hcl:4cc74b byr:1980 hgt:176in +pid:460622356 ecl:xry eyr:2030 + +hcl:z +ecl:oth pid:872514537 hgt:175in eyr:1984 iyr:2011 cid:145 byr:2024 + +iyr:2014 ecl:blu +pid:332729196 hgt:63in +eyr:2020 +hcl:#602927 + +hcl:#7d3b0c pid:369981570 byr:1996 ecl:gry +eyr:2024 iyr:2017 + +pid:446117373 hgt:158cm +iyr:2010 ecl:gry eyr:2024 hcl:#e54715 + +cid:341 pid:842156559 +hgt:167cm hcl:#602927 byr:1939 ecl:amb iyr:2016 + +byr:2017 +cid:176 +ecl:#9e42ae iyr:2029 pid:8965345 eyr:2038 hcl:z +hgt:116 + +eyr:2027 iyr:2014 hcl:#ceb3a1 +cid:280 pid:871521406 ecl:oth byr:1957 hgt:166cm + +cid:303 iyr:2019 +eyr:2021 pid:579593282 ecl:gry hcl:011a46 byr:1981 +hgt:184cm + +iyr:2015 byr:1936 cid:61 ecl:brn pid:307248029 hgt:172cm hcl:#18171d eyr:2029 + +pid:708687506 ecl:brn hcl:#602927 +iyr:2014 byr:1987 +hgt:193cm +eyr:2021 + +ecl:gry +iyr:2015 hcl:#efcc98 byr:1950 +cid:150 eyr:2023 pid:569864726 +hgt:161cm + +byr:1920 hcl:#602927 iyr:2018 +ecl:gry eyr:2020 +hgt:192cm pid:020336420 + +hcl:#539335 byr:1949 +hgt:152cm +cid:95 pid:002018679 +eyr:2030 iyr:2015 ecl:brn + +hcl:#b6652a eyr:2023 +pid:515291463 iyr:2013 byr:1990 +ecl:blu hgt:160cm + +eyr:2030 iyr:2012 +ecl:grn pid:416049447 hgt:188cm +hcl:#a97842 byr:1976 + +iyr:2017 hgt:61in ecl:oth byr:2001 eyr:2028 +hcl:#733820 +pid:078720467 + +eyr:2021 hgt:151cm iyr:2020 +hcl:#efcc98 ecl:oth +byr:1985 +pid:876231883 + +iyr:2019 hcl:#ceb3a1 hgt:156in +eyr:2004 pid:093465895 ecl:amb byr:2026 + +pid:103964845 hgt:178cm cid:320 ecl:oth +hcl:#fffffd byr:2002 eyr:2021 iyr:2019 + +ecl:brn byr:1920 pid:499363957 +cid:217 hcl:#341e13 hgt:164cm +iyr:2017 eyr:2028 + +ecl:brn pid:5837609946 iyr:2011 +byr:1971 eyr:2030 hgt:189cm +hcl:#866857 + +byr:1974 iyr:2015 hcl:#cfa07d +hgt:190cm ecl:grn pid:330115418 eyr:2020 cid:173 + +iyr:2010 +eyr:2024 byr:1943 pid:227557868 +cid:102 hgt:72in +hcl:#6b5442 + +hgt:151cm byr:1994 +pid:050723476 +cid:104 iyr:2010 hcl:#b6652a +ecl:brn eyr:2030 + +ecl:gry byr:1942 +hcl:#c5e354 hgt:192cm iyr:2019 +eyr:2027 pid:192177566 + +ecl:hzl hcl:#c0946f byr:1997 pid:853199076 hgt:166cm +iyr:2019 +eyr:2020 +cid:329 + +eyr:2027 iyr:2029 hcl:#602927 +pid:#1b8593 byr:2028 hgt:172in ecl:grn + +eyr:2036 iyr:2030 ecl:utc +pid:22330365 hcl:z byr:2016 hgt:65cm + +pid:936740771 +ecl:grn byr:1976 +hcl:#602927 +iyr:2017 hgt:192cm +cid:257 eyr:2027 + +eyr:2021 pid:415535681 +hcl:#b6652a hgt:191cm +ecl:hzl +iyr:2013 byr:1985 + +hgt:193cm +pid:499609129 +iyr:2014 ecl:oth +eyr:2029 hcl:#cfa07d byr:1973 + +ecl:gry byr:1996 cid:85 hgt:174cm iyr:2013 pid:444611265 hcl:#6b5442 eyr:2028 + +pid:170343402 +iyr:2029 +hgt:167cm +byr:2016 eyr:2034 ecl:hzl hcl:z cid:254 + +hcl:4893d5 ecl:blu byr:1960 +eyr:2027 pid:573029479 iyr:1952 hgt:74in + +eyr:2021 hgt:192cm pid:729836929 iyr:2020 byr:1973 +cid:155 ecl:grn hcl:#602927 + +hcl:#a97842 byr:1946 +iyr:2018 cid:172 hgt:162cm eyr:2030 ecl:amb pid:028768413 + +iyr:2020 hcl:#c0946f ecl:grn pid:601040247 cid:237 hgt:177cm eyr:2024 +byr:1941 + +iyr:2014 byr:1959 +eyr:2028 +hcl:#fffffd +ecl:#7df42b cid:165 hgt:68cm + +byr:1944 hcl:#18171d +pid:009636175 hgt:155cm ecl:amb eyr:2032 iyr:2015 + +byr:1987 hgt:150cm +hcl:#b6652a eyr:2021 +ecl:blu +pid:723709387 iyr:2017 + +byr:1937 ecl:oth eyr:2022 hcl:#733820 pid:143694811 cid:175 hgt:150cm + +pid:562911401 +cid:80 hgt:61in byr:1922 eyr:2027 ecl:amb iyr:2014 +hcl:#602927 + +iyr:2013 ecl:amb pid:826291674 hcl:#ceb3a1 eyr:2021 byr:1968 hgt:75in + +hcl:#5e0e07 +hgt:164cm pid:572114080 eyr:2028 iyr:2016 +byr:1922 ecl:oth + +ecl:blu eyr:2029 hgt:155cm +byr:1950 hcl:#866857 cid:271 iyr:2015 +pid:216813084 + +iyr:2018 byr:2009 cid:212 ecl:#71a98c pid:3467231102 hcl:z hgt:173cm +eyr:2026 + +eyr:1945 cid:302 iyr:2030 +hcl:z pid:0411732179 +byr:2004 hgt:165in +ecl:grt + +iyr:2010 hgt:169cm +hcl:#ceb3a1 +eyr:2022 pid:659709686 ecl:hzl +byr:1931 + +hcl:z pid:5077677466 +eyr:2021 hgt:184cm +iyr:1973 +byr:2009 ecl:#35575e + +hgt:190cm cid:103 iyr:2018 +byr:1970 ecl:gry +eyr:2028 +pid:549406360 hcl:#18171d + +byr:1964 eyr:2023 iyr:2015 hgt:174cm pid:305268492 +hcl:#b98e00 ecl:blu + +hgt:162cm +ecl:brn iyr:2019 byr:1951 +cid:169 pid:755632568 eyr:2030 hcl:#ceb3a1 + +iyr:2010 ecl:oth hgt:192cm eyr:2025 +hcl:#efcc98 pid:003868873 byr:1925 + +hcl:z +ecl:gmt hgt:62 eyr:1991 +byr:2012 +iyr:2025 pid:1835041269 + +hgt:162 +iyr:2026 byr:2024 +pid:6463124513 hcl:#602927 ecl:oth eyr:2028 + +hcl:bfb027 iyr:1945 byr:1989 eyr:1944 pid:826897563 ecl:dne cid:117 hgt:177 + +hcl:#b6652a iyr:2013 +ecl:blu byr:1952 eyr:2020 pid:737726601 cid:308 +hgt:167cm + +eyr:2028 iyr:2012 hcl:#6b5442 +byr:1986 ecl:blu +pid:365821409 hgt:180cm + +hgt:101 eyr:2037 pid:2457985649 +ecl:gmt +hcl:4c0784 iyr:2029 + +hcl:#341e13 iyr:1954 ecl:dne byr:2007 +eyr:2028 pid:552497791 hgt:189cm cid:263 + +ecl:blu +hgt:71in pid:360012597 eyr:2029 hcl:#18171d byr:1949 +iyr:2014 + +hgt:164cm cid:237 iyr:2016 byr:1966 +hcl:#623a2f ecl:oth +pid:129809894 eyr:2027 + +hcl:a2243b eyr:2031 +ecl:#de9183 +byr:1982 hgt:109 iyr:1968 pid:848311277 + +eyr:1950 +hcl:45470a byr:1983 +pid:82580746 cid:321 +hgt:191cm ecl:dne iyr:2013 + +iyr:2018 ecl:blu eyr:2021 +byr:1983 pid:045613120 + +hgt:164cm byr:1926 +hcl:#cfa07d +eyr:2030 +iyr:2010 +pid:360787918 cid:61 ecl:amb + +pid:#d6dddd iyr:1967 ecl:gmt hcl:z byr:1947 eyr:1943 cid:93 hgt:97 + +ecl:oth hgt:172cm +hcl:#efcc98 byr:1957 +pid:729531506 iyr:2017 +eyr:2030 + +ecl:#5a51b9 byr:2023 eyr:2021 iyr:2027 +pid:174cm hgt:80 hcl:6b4f6e + +hgt:157cm +ecl:amb +eyr:2020 pid:994733990 iyr:2020 cid:174 byr:1966 +hcl:#7d3b0c + +eyr:1986 +byr:2020 hcl:#c0946f +pid:499981246 +iyr:1926 cid:214 ecl:amb hgt:161cm + +hcl:#18171d byr:1971 +pid:#ef8a06 +eyr:2019 ecl:blu +hgt:158cm iyr:2011 + +byr:1959 cid:298 pid:876132993 +ecl:blu iyr:2011 hgt:176cm +hcl:#6b5442 eyr:2030 + +eyr:2030 +byr:1926 hcl:#733820 iyr:2017 +hgt:150cm pid:165cm ecl:blu + +byr:1991 eyr:2027 +hgt:183cm +pid:178cm +ecl:grn hcl:8a6142 iyr:2017 +cid:265 + +hgt:183cm +eyr:2027 hcl:#602927 pid:530884763 byr:1959 ecl:brn iyr:2013 + +hcl:#b6652a eyr:2030 hgt:171cm cid:97 byr:2002 pid:166795809 +ecl:hzl +iyr:2016 + +pid:479944517 hgt:166cm byr:1976 eyr:2022 hcl:#a97842 +ecl:grn iyr:2018 + +byr:1949 +eyr:2013 +hcl:z ecl:hzl +pid:152cm hgt:139 iyr:1962 + +pid:278193062 hcl:#c0946f iyr:2013 byr:1950 eyr:2020 hgt:167cm +ecl:oth + +eyr:1955 +iyr:2018 pid:#ffd4de byr:1922 hgt:178cm hcl:z +ecl:lzr +cid:154 + +ecl:grn hcl:#a189d5 byr:1977 pid:120286096 +eyr:1966 +hgt:178cm +iyr:2011 + +eyr:2028 +hcl:#fffffd iyr:2013 byr:1956 pid:565425333 cid:207 ecl:gry hgt:67in + +hgt:188cm eyr:2028 cid:90 +iyr:2019 pid:574624890 hcl:#b6652a byr:1937 ecl:oth + +hcl:#efcc98 hgt:152cm ecl:hzl iyr:2010 cid:217 byr:1936 eyr:2027 pid:857984889 + +hgt:124 iyr:2015 byr:1989 ecl:oth eyr:2023 hcl:#ceb3a1 pid:917440765 + +ecl:#61e880 cid:82 +pid:165cm byr:2019 eyr:1930 hgt:152in hcl:z iyr:2030 + +byr:1974 +hgt:60in ecl:gry +hcl:#c0946f +pid:215085889 +iyr:2017 eyr:2020 + +ecl:grn hcl:#ceb3a1 +pid:602147794 hgt:180cm eyr:2028 byr:1927 iyr:2018 + +hcl:#ceb3a1 byr:1958 ecl:gry +pid:210246609 iyr:2018 hgt:169cm +eyr:2023 +cid:255 + +eyr:2025 +byr:1950 hgt:177cm +ecl:gry pid:547034188 +iyr:2018 +cid:218 hcl:#341e13 + +pid:380369950 +eyr:2022 hgt:65in iyr:2019 ecl:brn +byr:1996 + +hgt:167cm +iyr:2014 +eyr:2029 cid:199 pid:144048588 byr:1963 ecl:oth hcl:#733820 + +byr:1962 ecl:brn hgt:161cm eyr:2022 hcl:#cfa07d +pid:247699670 iyr:2016 + +hgt:192cm ecl:#8bdb3e pid:#b152a9 hcl:#18171d iyr:2012 byr:2011 cid:335 eyr:2040 + +hcl:11f8f4 ecl:#86f885 iyr:2022 +hgt:75in +pid:920078124 byr:1952 eyr:1994 + +pid:718378772 cid:282 +hcl:#fffffd hgt:166cm eyr:2023 iyr:2019 byr:1944 +ecl:grn + +eyr:1963 pid:562051556 +ecl:#793853 +hcl:z byr:2030 iyr:2026 + +byr:1980 +cid:143 hgt:161cm eyr:2022 +pid:778422225 +hcl:#7d3b0c iyr:2011 ecl:blu + +byr:1940 eyr:2021 hgt:74in cid:161 hcl:#a97842 ecl:blu +pid:864682628 iyr:2014 + +byr:1991 pid:163871357 ecl:oth +hgt:189cm cid:229 eyr:2024 +hcl:#efcc98 +iyr:2012 + +iyr:2013 hcl:#ceb3a1 ecl:hzl byr:1985 pid:801995950 hgt:73in +eyr:2029 + +byr:1931 hcl:#ceb3a1 iyr:2013 +cid:289 eyr:2027 ecl:blu +hgt:150cm pid:969679765 + +iyr:2015 hgt:176cm eyr:2025 ecl:blu +byr:1935 pid:388582890 hcl:#efcc98 + +iyr:1956 eyr:2034 pid:049440894 ecl:xry byr:1950 cid:228 +hgt:186cm + +iyr:2014 hcl:#fffffd byr:1985 +eyr:2022 +hgt:176cm pid:556889061 ecl:amb + +pid:994755123 hgt:165cm +ecl:brn +eyr:2022 byr:1937 iyr:2011 + +byr:2012 +hcl:z cid:217 iyr:1958 +ecl:brn hgt:160cm +pid:871866608 +eyr:2027 + +hcl:#a97842 +ecl:hzl byr:1929 +iyr:2016 +eyr:2029 pid:220410871 hgt:192cm + +pid:332596122 byr:1986 +hcl:#cfa07d +eyr:2022 hgt:189cm ecl:grn iyr:2016 + +hgt:167cm +hcl:#6b5442 eyr:2026 +iyr:2020 ecl:grn cid:231 pid:521486150 + +cid:299 +hgt:178cm byr:1945 ecl:brn iyr:2012 +hcl:#fffffd eyr:2022 +pid:264693268 + +ecl:lzr pid:157cm hcl:f0a766 +iyr:2029 hgt:175in byr:2004 + +hcl:#888785 +hgt:159cm eyr:2025 +iyr:2012 ecl:oth +byr:1995 pid:135442622 + +eyr:2024 hcl:#a97842 +iyr:2013 pid:186863004 ecl:brn byr:1929 hgt:162cm + +pid:518619727 ecl:grn +hcl:#866857 byr:1954 +iyr:2016 +hgt:69in + +eyr:2022 iyr:2018 +byr:1926 +ecl:oth pid:073817633 +hgt:167cm hcl:#b6652a + +hgt:190cm iyr:2019 +ecl:dne byr:2010 eyr:2023 pid:979671212 + +hgt:190 +ecl:#5ddbda byr:2025 iyr:1973 pid:#a082dc eyr:1998 cid:177 hcl:z + +iyr:1976 eyr:2026 pid:4862485 hgt:71in +byr:1975 ecl:#41855f hcl:#ceb3a1 + +ecl:brn +byr:1927 iyr:2012 hgt:67in +pid:479646443 eyr:2039 hcl:z + +pid:779458123 +cid:263 hcl:#efcc98 +byr:1951 +hgt:153cm iyr:2011 +ecl:amb eyr:2030 + +hgt:187cm +eyr:2028 +byr:1957 +hcl:#b6652a iyr:2015 pid:616963706 ecl:brn + +hgt:154cm byr:1947 +pid:51196404 +eyr:2020 iyr:2001 +ecl:hzl + +hgt:157cm iyr:2013 eyr:2021 +ecl:blu hcl:d9e6e0 +byr:2023 + +iyr:2010 +hcl:#866857 +ecl:brn eyr:2022 +cid:163 byr:1962 pid:458396337 hgt:160cm + +ecl:amb eyr:2027 +byr:1987 +hgt:184cm +pid:125222897 cid:214 +iyr:2020 + +ecl:grt eyr:1942 +iyr:2023 +hcl:901862 hgt:159in +byr:2009 + +eyr:2028 +byr:1973 hgt:151cm iyr:2013 ecl:hzl pid:229165831 + +eyr:2024 hgt:190cm ecl:grn byr:1962 iyr:1921 pid:531272718 hcl:#ceb3a1 + +hgt:169in pid:1747598652 ecl:dne +iyr:1974 eyr:2031 hcl:#602927 byr:2030 + +hgt:177cm iyr:1963 eyr:2006 +cid:276 hcl:#7d3b0c +pid:192cm +ecl:grn byr:2022 + +pid:893346945 hcl:#733820 ecl:oth iyr:2013 byr:1973 hgt:186cm eyr:2025 + +hgt:177cm +eyr:2025 +byr:1997 hcl:#733820 +cid:295 iyr:2016 pid:019887743 ecl:grn + +iyr:2019 +byr:1982 eyr:2030 ecl:brn pid:041140029 hcl:#a97842 hgt:189cm + +pid:165cm iyr:1962 hcl:e5c590 ecl:#e394a4 +eyr:2040 +hgt:70cm byr:2006 + +byr:1940 eyr:2025 iyr:2020 hcl:#a97842 ecl:brn pid:502841851 cid:121 +hgt:160cm + +eyr:2015 ecl:zzz hgt:174 pid:154cm iyr:2021 +hcl:z +cid:113 +byr:2003 + +iyr:2020 +eyr:2023 pid:402183362 hcl:#120eb2 +ecl:amb +hgt:150in +byr:1921 + +pid:059311672 cid:290 hcl:#7d3b0c byr:1996 +iyr:2021 hgt:155cm ecl:hzl eyr:2030 + +pid:790768270 hgt:167cm ecl:gry +byr:1973 +hcl:#b6652a eyr:2028 iyr:2017 + +hcl:#18171d eyr:2024 pid:062349624 +byr:2002 iyr:2019 cid:230 ecl:oth + +iyr:2015 +hgt:170cm +cid:193 +eyr:2025 ecl:hzl byr:1947 +pid:484823445 +hcl:#623a2f + +pid:5792950369 cid:343 +hcl:1d16b7 eyr:2024 +hgt:185in iyr:1965 +ecl:gmt byr:1948 + +pid:#a1a101 +ecl:grn +byr:1945 +iyr:2013 hcl:#ceb3a1 hgt:156cm cid:279 eyr:2026 + +pid:936593230 eyr:2026 hgt:179cm +hcl:#7d3b0c +iyr:2015 byr:1976 +ecl:gry + +eyr:2021 pid:210678956 hgt:153cm cid:72 iyr:2018 ecl:grn + +pid:995512119 +byr:1937 eyr:2021 hcl:#4d8fe2 ecl:brn +iyr:2019 +hgt:187cm + +hcl:#341e13 pid:282336259 eyr:2022 +cid:95 byr:1977 hgt:101 ecl:#955529 +iyr:2029 + +pid:934992980 hcl:#fffffd iyr:2028 eyr:1945 ecl:gry byr:1926 + +iyr:2018 ecl:gry +hgt:179cm hcl:#866857 pid:573616710 +byr:1987 + +byr:2010 eyr:2021 hcl:z pid:018180068 hgt:74 +cid:183 iyr:2027 ecl:dne + +iyr:2020 hgt:160cm +pid:760124779 hcl:#b6652a ecl:grn eyr:2030 byr:1951 + +pid:354858055 ecl:hzl hgt:192cm +hcl:#ceb3a1 byr:1983 cid:314 +iyr:2016 eyr:2027 + +eyr:2028 iyr:2013 hgt:171cm hcl:54be83 ecl:xry byr:2021 +pid:89895052 + +byr:1963 iyr:2019 +pid:298992037 eyr:2024 +hgt:63in hcl:#341e13 + +hgt:64cm +pid:7645482607 ecl:#c94773 cid:231 hcl:621e9d eyr:2000 byr:2013 + +hcl:#ceb3a1 ecl:gry iyr:2015 hgt:178cm byr:1945 +pid:416960939 + +hgt:178cm +cid:121 +byr:1961 iyr:2019 hcl:#6b5442 +eyr:2028 pid:098226989 + +iyr:2015 eyr:2028 +ecl:amb +hgt:154cm +pid:364426658 byr:1960 +hcl:#623a2f + +byr:1998 +pid:#e5ab03 hcl:z ecl:grn +iyr:2006 hgt:61cm eyr:2038 + +hcl:#866857 eyr:2020 +hgt:187in +pid:#8239dc iyr:2010 ecl:#6259e7 byr:1939 + +pid:#6082fa eyr:2028 ecl:gry hcl:937410 iyr:2010 +hgt:173cm + +eyr:1922 ecl:grt pid:228396726 hgt:65cm +hcl:#6b5442 byr:2024 iyr:2010 + +hcl:#c0946f iyr:2016 byr:1978 +pid:774430678 eyr:2026 +ecl:oth hgt:61in + +cid:208 pid:714195768 iyr:2019 eyr:2022 byr:1937 ecl:gry hcl:#ceb3a1 hgt:159cm + +eyr:2028 ecl:gry iyr:2010 byr:2001 hgt:163cm pid:409136005 hcl:#623a2f cid:200 + +pid:471094613 eyr:2028 hgt:165cm iyr:2010 ecl:amb byr:1995 hcl:#a97842 + +ecl:oth iyr:2011 pid:907249487 eyr:2020 +byr:1924 cid:68 hcl:#a97842 +hgt:155cm + +byr:1983 +hgt:69cm +eyr:2027 iyr:2010 hcl:#866857 +pid:671371092 +ecl:amb + +hgt:97 pid:168cm cid:67 +eyr:1957 hcl:#623a2f byr:2027 ecl:gry iyr:2019 + +ecl:blu iyr:2012 pid:287999130 hgt:178cm eyr:2020 +byr:1940 +hcl:#888785 + +hcl:z hgt:63cm ecl:grt +iyr:2024 eyr:2031 pid:167cm +byr:2013 + +hgt:65in hcl:z cid:300 ecl:amb pid:58257193 +byr:1969 iyr:2011 eyr:1985 + +hcl:#341e13 eyr:2036 hgt:189in +pid:58541401 +ecl:#d793f2 iyr:2010 byr:2006 + +cid:259 ecl:grn +hcl:#a97842 +hgt:167cm +pid:641690548 eyr:2021 +byr:1930 +iyr:2010 + +eyr:2027 +hgt:75in +cid:335 hcl:#602927 iyr:2012 ecl:blu pid:724014178 +byr:1928 + +eyr:2027 +hcl:#8345d8 ecl:grn byr:1965 pid:728151722 +hgt:182cm iyr:2016 + +iyr:2020 pid:794922933 +hcl:#341e13 +ecl:oth +byr:1985 +hgt:71in +eyr:2022 + +ecl:#025c94 +hcl:#fffffd +iyr:2027 +byr:1987 hgt:186cm cid:135 pid:005852205 +eyr:2021 + +byr:2020 +ecl:grn +pid:91200233 +iyr:2014 eyr:2020 hgt:179cm hcl:be0c95 + +ecl:gmt iyr:2010 pid:171cm byr:2010 eyr:2036 hgt:159in hcl:424df0 + +ecl:gry iyr:2013 hcl:#7d3b0c hgt:175cm pid:337611432 byr:1953 eyr:2021 + +byr:1926 pid:678688040 +hcl:#cfa07d +cid:311 eyr:2027 hgt:183cm iyr:2018 +ecl:blu + +byr:2021 +pid:156cm +ecl:dne +hgt:156cm +hcl:#6b5442 +iyr:2027 + +pid:380639402 eyr:2025 +cid:196 +hgt:163cm +hcl:#602927 ecl:hzl +iyr:2015 + +eyr:2039 hcl:5aa018 byr:2007 ecl:dne +hgt:77 pid:#d30c1c iyr:2025 + +ecl:blu +iyr:1986 pid:3544865154 eyr:2027 byr:2007 hgt:74cm hcl:ca33b3 + +pid:#b05294 byr:1951 hcl:#ceb3a1 cid:221 +iyr:2000 hgt:110 eyr:2021 + +byr:1954 hcl:#efcc98 iyr:2018 ecl:#f4ea81 +pid:414210788 hgt:174cm eyr:2037 + +pid:#abbdd9 +hgt:164in +iyr:2003 cid:319 eyr:2035 +byr:2015 +ecl:#9b38c7 + +ecl:amb +iyr:2018 byr:1922 +hgt:157cm pid:801421993 eyr:2029 +hcl:#efcc98 + +eyr:2022 +hcl:#b6652a +ecl:amb byr:1942 +hgt:153cm iyr:2018 +pid:805225382 + +byr:1925 +hcl:#efcc98 ecl:amb pid:539625393 cid:269 +hgt:161cm iyr:2013 eyr:2025 + +cid:305 hgt:154cm +hcl:#18171d byr:1998 +eyr:2029 iyr:2011 pid:634235387 ecl:gry + +hcl:#6b5442 pid:504467634 iyr:2018 cid:96 byr:1970 +ecl:gry eyr:2023 hgt:167cm + +iyr:2020 hgt:163cm hcl:#fffffd pid:762271916 byr:2029 eyr:2022 +ecl:#12027c + +byr:1978 +cid:134 hcl:#6b5442 +iyr:2010 pid:627335191 ecl:blu eyr:2023 hgt:171cm + +pid:260340768 hcl:#a97842 byr:1947 ecl:#2150e3 iyr:2019 +cid:153 +hgt:65in eyr:2025 + +byr:1973 eyr:2022 +cid:229 pid:515108192 ecl:amb hcl:z +iyr:2013 hgt:178cm + +ecl:hzl +hgt:158cm hcl:#a97842 +pid:657117959 byr:1977 eyr:2023 iyr:2018 + +ecl:gry eyr:2024 +hgt:163cm byr:1976 iyr:2017 +pid:653769092 hcl:#18171d + +ecl:amb pid:161694953 +hcl:#602927 hgt:188cm eyr:2021 byr:1946 +iyr:2016 + +eyr:2021 +hgt:178cm ecl:grn +byr:1961 pid:472866063 iyr:2011 hcl:#cfa07d cid:160 + +eyr:2037 iyr:2011 +hgt:187cm byr:1973 pid:163cm hcl:#b6652a +ecl:brn cid:283 + +iyr:2017 hcl:#18171d eyr:2020 pid:059926864 hgt:160cm ecl:brn + +byr:2010 +hcl:8217d4 hgt:153in iyr:1989 eyr:2037 pid:#74e0a4 ecl:#ba5782 + +ecl:#28f922 +byr:1951 hgt:65cm +iyr:2025 pid:151cm hcl:z eyr:2028 + +pid:302959013 +hgt:167cm eyr:2022 ecl:hzl iyr:2014 +cid:168 +hcl:#888785 byr:1969 + +pid:013861920 hcl:#623a2f +ecl:gry +byr:1928 +iyr:2017 hgt:174cm eyr:2028 cid:250 + +byr:1997 hgt:74cm hcl:#efcc98 eyr:2039 ecl:#d3dc6a +cid:243 +iyr:2030 pid:189cm + +hgt:67cm byr:2011 eyr:2040 pid:192cm ecl:#b7a5a8 hcl:281b25 + +iyr:2014 ecl:brn byr:1954 hcl:#fffffd pid:285922660 hgt:76in eyr:2028 + +iyr:2021 byr:2028 +eyr:2023 +hgt:69in hcl:e832ef pid:714568559 ecl:#f10004 cid:208 + +ecl:brn hgt:166cm hcl:#cfa07d +cid:59 pid:4884483993 +iyr:2012 +eyr:1932 + +iyr:2029 byr:2025 +cid:238 ecl:utc +eyr:2022 +pid:887425834 hgt:177in + +pid:014383055 cid:342 hgt:183cm eyr:2025 +iyr:2014 ecl:blu byr:1969 hcl:#7d3b0c + +eyr:2033 +hcl:#341e13 +iyr:2014 +hgt:71cm ecl:#750eec +byr:1980 pid:#e2d3ac + +hgt:154cm iyr:2019 hcl:#341e13 ecl:hzl byr:1942 pid:393181243 eyr:2025 +cid:316 + +ecl:amb +hgt:158cm +eyr:2025 byr:1986 hcl:#fffffd pid:379180765 iyr:2014 + +pid:8191674491 eyr:2028 hcl:#efcc98 byr:2015 iyr:2012 +ecl:amb cid:140 + +byr:2015 hcl:8e3e81 eyr:2024 hgt:180cm iyr:1984 pid:#56cd0e +ecl:zzz + +pid:247138863 eyr:2022 hgt:176cm iyr:2014 byr:1929 +ecl:gry cid:87 hcl:#b6652a + +hcl:z pid:#c4cdee ecl:#ca97a6 byr:1971 eyr:2032 +iyr:1997 hgt:156in + +ecl:gry +hgt:167cm eyr:2030 byr:1984 hcl:#cfa07d iyr:2016 + +hcl:#a97842 hgt:163cm +pid:373461578 iyr:2017 +byr:1926 ecl:amb +eyr:2021 + +cid:161 hcl:#b6652a byr:1930 ecl:brn eyr:2028 hgt:166cm iyr:2016 + +ecl:amb cid:126 +eyr:2024 +hcl:#18171d iyr:2019 +byr:1991 hgt:183cm + +ecl:lzr iyr:2026 byr:1996 +hgt:69in pid:#ccef7e eyr:2028 +hcl:#fffffd + +hgt:68cm iyr:1945 +ecl:brn byr:2009 pid:#56e987 hcl:fdd212 eyr:2023 + +pid:72039060 eyr:2036 hgt:172cm +hcl:#fffffd iyr:2011 +byr:1944 ecl:xry cid:202 + +ecl:hzl +eyr:2025 +byr:1922 hcl:#efcc98 +pid:795790549 +iyr:2020 hgt:150cm + +hgt:155cm +hcl:#373de2 pid:#707dc6 iyr:2017 byr:2002 eyr:2038 +ecl:oth + +hcl:#888785 iyr:2011 +hgt:159cm +byr:1962 eyr:2026 ecl:amb pid:672792762 + +cid:217 eyr:2025 hgt:164cm byr:1999 pid:975218035 ecl:grn hcl:#18171d iyr:2011 + +pid:655501194 eyr:2029 byr:1999 iyr:2013 +hgt:183cm hcl:#a97842 ecl:hzl + +byr:1986 hcl:#efcc98 pid:160cm ecl:oth eyr:2022 iyr:2022 hgt:150cm +cid:63 + +hgt:69in byr:2002 pid:0528229881 ecl:blu hcl:z iyr:2022 +eyr:2033 + +iyr:2020 pid:007754028 hcl:z cid:232 ecl:dne hgt:73in + +ecl:hzl +iyr:2016 hcl:#7d3b0c byr:1948 +eyr:2021 +cid:269 hgt:173cm pid:176430746 + +cid:310 +ecl:xry +eyr:2032 hgt:64cm +pid:190cm hcl:z byr:2019 + +hgt:150cm pid:660176034 hcl:#c0946f +ecl:hzl byr:1986 eyr:2021 iyr:2019 + +pid:7876582 +eyr:2021 iyr:2020 +hgt:185cm hcl:#18171d cid:319 ecl:amb byr:1943 + +ecl:hzl hcl:#623a2f iyr:1950 byr:2012 cid:334 eyr:2028 + +eyr:2028 +byr:1992 hcl:#b6652a ecl:hzl cid:222 +hgt:189cm iyr:2016 +pid:092856842 + +hcl:a3c52a +iyr:2025 byr:2023 +hgt:182cm ecl:#be1503 pid:9311657615 eyr:2005 + +eyr:2035 +byr:1988 hgt:193cm +iyr:2028 cid:128 hcl:#18171d ecl:utc pid:9743739773 + +ecl:zzz hcl:z +hgt:64cm pid:160cm byr:2026 eyr:1943 iyr:2028 cid:74 + +ecl:oth +pid:874577361 +iyr:2010 eyr:2021 +hgt:160cm hcl:#c0946f +byr:1959 diff --git a/src/2020/4/mod.rs b/src/2020/4/mod.rs new file mode 100644 index 0000000..4b51b29 --- /dev/null +++ b/src/2020/4/mod.rs @@ -0,0 +1,132 @@ +use anyhow::Context as _; + +const REQUIRED_KEYS: &[&str] = + &["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]; + +pub fn part1() -> anyhow::Result<()> { + let batch = crate::util::read_file_str("data/4.txt")?; + let mut valid = 0; + for passport in parse(&batch)? { + let mut cur_valid = true; + for key in REQUIRED_KEYS { + if !passport.contains_key(&key.to_string()) { + cur_valid = false; + break; + } + } + if cur_valid { + valid += 1; + } + } + println!("{}", valid); + Ok(()) +} + +pub fn part2() -> anyhow::Result<()> { + let batch = crate::util::read_file_str("data/4.txt")?; + let mut valid = 0; + for passport in parse(&batch)? { + let mut cur_valid = true; + for key in REQUIRED_KEYS { + match passport.get(&key.to_string()) { + Some(val) => { + if !validate(key, val)? { + cur_valid = false; + break; + } + } + None => { + cur_valid = false; + break; + } + } + } + if cur_valid { + valid += 1; + } + } + println!("{}", valid); + Ok(()) +} + +fn parse( + batch: &str, +) -> anyhow::Result>> { + let mut res = vec![]; + let mut cur = std::collections::HashMap::new(); + for line in batch.lines() { + if line.is_empty() { + res.push(cur); + cur = std::collections::HashMap::new(); + continue; + } + + for field in line.split(' ') { + let mut parts = field.split(':'); + let key = parts.next().with_context(|| { + format!("failed to parse field '{}'", field) + })?; + let value = parts.next().with_context(|| { + format!("failed to parse field '{}'", field) + })?; + cur.insert(key.to_string(), value.to_string()); + } + } + if !cur.is_empty() { + res.push(cur); + } + Ok(res) +} + +fn validate(key: &str, val: &str) -> anyhow::Result { + match key { + "byr" => match val.parse::() { + Ok(year) => Ok(year >= 1920 && year <= 2002), + Err(_) => Ok(false), + }, + "iyr" => match val.parse::() { + Ok(year) => Ok(year >= 2010 && year <= 2020), + Err(_) => Ok(false), + }, + "eyr" => match val.parse::() { + Ok(year) => Ok(year >= 2020 && year <= 2030), + Err(_) => Ok(false), + }, + "hgt" => { + if val.len() < 3 { + Ok(false) + } else if val.ends_with("in") { + match val[0..val.len() - 2].parse::() { + Ok(inches) => Ok(inches >= 59 && inches <= 76), + Err(_) => Ok(false), + } + } else if val.ends_with("cm") { + match val[0..val.len() - 2].parse::() { + Ok(inches) => Ok(inches >= 150 && inches <= 193), + Err(_) => Ok(false), + } + } else { + Ok(false) + } + } + "hcl" => Ok(val.len() == 7 + && val.starts_with('#') + && val[1..] + == val[1..] + .matches(|c: char| c.is_ascii_hexdigit()) + .collect::()), + "ecl" => Ok(val == "amb" + || val == "blu" + || val == "brn" + || val == "gry" + || val == "grn" + || val == "hzl" + || val == "oth"), + "pid" => Ok(val.len() == 9 + && val + == val + .matches(|c: char| c.is_ascii_digit()) + .collect::()), + _ => Err(anyhow::anyhow!("invalid key found: {}", key)), + } +} diff --git a/src/2020/mod.rs b/src/2020/mod.rs index ff08a7e..812a379 100644 --- a/src/2020/mod.rs +++ b/src/2020/mod.rs @@ -4,6 +4,8 @@ mod day1; mod day2; #[path = "3/mod.rs"] mod day3; +#[path = "4/mod.rs"] +mod day4; pub fn run(day: u8, puzzle: u8) -> anyhow::Result<()> { match (day, puzzle) { @@ -13,6 +15,8 @@ pub fn run(day: u8, puzzle: u8) -> anyhow::Result<()> { (2, 2) => day2::part2(), (3, 1) => day3::part1(), (3, 2) => day3::part2(), + (4, 1) => day4::part1(), + (4, 2) => day4::part2(), _ => Err(anyhow::anyhow!("unknown puzzle {}-{}", day, puzzle)), } } diff --git a/src/util.rs b/src/util.rs index fdc3bed..94f9796 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,5 +1,5 @@ use anyhow::Context as _; -use std::io::BufRead as _; +use std::io::{BufRead as _, Read as _}; pub fn read_ints(filename: &str) -> anyhow::Result> { let f = std::fs::File::open(filename) @@ -15,3 +15,12 @@ pub fn read_ints(filename: &str) -> anyhow::Result> { .collect(); ints } + +pub fn read_file_str(filename: &str) -> anyhow::Result { + let mut f = std::fs::File::open(filename) + .with_context(|| format!("couldn't find data file {}", filename))?; + let mut s = String::new(); + f.read_to_string(&mut s) + .context("failed to read map contents")?; + Ok(s) +} -- cgit v1.2.3