diff --git a/input/2020/day4.txt b/input/2020/day4.txt new file mode 100644 index 0000000..03b412d --- /dev/null +++ b/input/2020/day4.txt @@ -0,0 +1,1138 @@ +byr:1971 +eyr:2039 +hgt:172in pid:170cm hcl:17106b iyr:2012 ecl:gry +cid:339 + +hgt:161cm eyr:2027 +ecl:grn iyr:2011 hcl:#a97842 byr:1977 pid:910468396 + +cid:257 +ecl:gry hgt:186cm iyr:2012 +byr:1941 +eyr:2029 +pid:108935675 +hcl:#cfa07d + +hgt:165in +hcl:#cfa07d eyr:2035 pid:82570731 +byr:1973 +cid:74 ecl:xry + +eyr:2020 cid:105 iyr:2012 pid:947726115 +hcl:#ceb3a1 ecl:grn byr:1966 hgt:151cm + +hcl:#888785 eyr:2027 ecl:hzl byr:1966 +pid:853607760 +iyr:2012 +hgt:155cm + +hgt:61cm +iyr:2019 +byr:1952 pid:#1468e6 eyr:2033 ecl:#7d39d5 hcl:z + +pid:2306523501 +eyr:2032 hcl:z ecl:brn +cid:266 hgt:151in iyr:2024 +byr:2008 + +hcl:#a97842 hgt:191cm eyr:2025 ecl:gry byr:1923 pid:574171850 iyr:2019 + +hgt:140 +iyr:1987 byr:2003 +eyr:2013 cid:242 hcl:z +ecl:#19177c pid:150cm + +byr:1959 +hgt:169cm hcl:#7d3b0c ecl:gry eyr:2028 cid:107 pid:584790749 + +byr:1955 +cid:309 +hcl:#a97842 +pid:740105085 iyr:2020 +hgt:188cm ecl:oth eyr:2029 + +iyr:2016 hcl:#cfa07d eyr:2026 +hgt:151cm +pid:394185014 ecl:grn byr:1974 + +pid:226566060 ecl:blu cid:272 hgt:188cm hcl:#efcc98 +eyr:2029 iyr:2014 +byr:1956 + +pid:#7c7a9d ecl:#8fa327 +eyr:2006 iyr:2022 +hcl:#7d3b0c hgt:169 +byr:2025 + +hgt:188in byr:2015 ecl:xry +iyr:1975 +eyr:1928 +pid:8939875193 hcl:7bbcce + +hgt:193cm +eyr:2029 +pid:141707808 byr:1997 +cid:83 iyr:2019 +ecl:hzl hcl:#cfa07d + +iyr:2019 +pid:681586971 +hcl:#6b5442 hgt:165cm +eyr:2022 ecl:brn byr:1985 + +byr:1970 +iyr:2016 hgt:156in pid:#e32394 eyr:2024 +hcl:#efcc98 ecl:grt + +iyr:2013 +ecl:grn pid:341584587 eyr:2027 hgt:185cm hcl:#18171d +byr:1935 +cid:113 + +hcl:#fffffd ecl:grn iyr:2010 +pid:738986504 hgt:98 eyr:2024 +byr:1968 + +pid:175337478 ecl:oth hgt:173cm hcl:#733820 +eyr:2025 byr:1960 +cid:283 iyr:2018 + +byr:1959 +hcl:#341e13 eyr:2023 +pid:566612260 hgt:176cm +iyr:2017 ecl:grn + +cid:321 pid:355095309 byr:1945 +hgt:161cm +eyr:2029 iyr:2017 +ecl:brn hcl:#733820 + +hcl:#c0946f pid:75316487 iyr:2013 cid:201 hgt:152cm ecl:lzr byr:1996 eyr:1928 + +hgt:160cm iyr:2010 hcl:#a018b9 +eyr:2024 ecl:amb +cid:347 + +eyr:2021 +pid:893047101 iyr:2016 ecl:hzl hcl:#866857 byr:1988 +hgt:166cm + +hcl:#7d3b0c +ecl:blu pid:085336099 eyr:2024 +iyr:2019 hgt:178cm byr:1999 + +ecl:grt iyr:2022 +hcl:z +hgt:192cm byr:2010 + +pid:677187953 eyr:2025 iyr:2020 hgt:163cm byr:1957 ecl:grn hcl:#cfa07d + +cid:213 +byr:1987 +pid:113078018 ecl:blu iyr:2013 eyr:2022 +hcl:#7d3b0c hgt:157cm + +ecl:blu hcl:#c0946f hgt:186cm +byr:1992 eyr:2028 iyr:2010 + +pid:#b01156 hgt:67 +byr:2014 ecl:#35dca0 eyr:1922 hcl:790130 + +hcl:#602927 +ecl:blu hgt:173cm byr:1974 pid:116377061 cid:294 eyr:2030 iyr:2010 + +hgt:151cm eyr:2022 iyr:2011 ecl:blu byr:1987 hcl:#733820 +pid:#b90d2e + +cid:188 +byr:1990 +hcl:#602927 iyr:2026 +pid:530373696 +hgt:154cm ecl:gry +eyr:2029 + +hgt:178cm eyr:2027 +hcl:#733820 +ecl:grn iyr:2014 pid:575371227 byr:1965 + +hcl:#fffffd iyr:2020 +hgt:185cm ecl:amb pid:692760311 +byr:1961 + +byr:1967 pid:397518948 ecl:lzr iyr:2015 hcl:#cfa07d cid:328 +hgt:177cm eyr:2035 + +hcl:#8e1608 +pid:554618249 iyr:2010 hgt:176cm cid:220 +ecl:brn byr:1928 eyr:2029 + +eyr:2030 +ecl:oth cid:177 hcl:#602927 +iyr:2010 hgt:66in +pid:915661465 byr:1992 + +ecl:brn pid:558826437 hgt:151cm byr:1936 hcl:#fffffd +eyr:2021 iyr:2012 + +eyr:2033 +iyr:2019 hgt:190cm byr:1953 +hcl:#6b5442 +pid:584941735 ecl:hzl + +hgt:71cm +byr:2015 iyr:2025 +ecl:#663b65 eyr:2039 hcl:z pid:62548949 + +ecl:hzl byr:1943 +iyr:2020 hgt:175cm pid:830628564 hcl:#7d3b0c eyr:2021 + +hgt:182cm byr:1951 cid:175 eyr:2021 pid:635966127 ecl:blu iyr:2014 hcl:#18171d + +hcl:#733820 iyr:2011 pid:581100835 eyr:2022 ecl:grn byr:1985 hgt:192cm + +iyr:2013 +ecl:grn +hgt:185cm hcl:#a97842 byr:1981 eyr:2029 pid:711625030 + +byr:1995 +pid:326992839 +iyr:2015 +eyr:2028 hcl:#733820 ecl:hzl + +hgt:160 +eyr:2037 ecl:#6b6b83 +cid:123 iyr:2028 +pid:7692333345 +hcl:z byr:2029 + +hcl:#6b5442 iyr:2030 +hgt:165cm byr:2028 ecl:#21516d +eyr:2039 +pid:182cm + +hgt:159cm iyr:2018 pid:610521467 eyr:2028 ecl:amb byr:1934 hcl:#602927 + +ecl:blu +hcl:#09d9a5 hgt:162cm iyr:2020 +eyr:2025 byr:1971 pid:406714780 + +hgt:179cm eyr:2022 hcl:#18171d +ecl:blu pid:314891131 iyr:2015 +byr:2002 + +hcl:#623a2f hgt:181cm pid:442693333 byr:1990 ecl:grn eyr:2027 +iyr:2011 + +iyr:2022 eyr:1939 +pid:557187110 hcl:#18171d hgt:60cm ecl:#d6ac04 byr:1984 + +ecl:grn byr:1948 hgt:174cm pid:438876745 cid:321 +iyr:2018 +hcl:#866857 eyr:2023 + +hgt:189cm iyr:2012 hcl:#602927 pid:978388052 ecl:brn +eyr:2030 + +ecl:amb cid:235 +byr:1938 +pid:315825546 hcl:#ceb3a1 eyr:2029 +iyr:2013 hgt:171cm + +ecl:dne hcl:z +hgt:76cm byr:2010 +cid:185 eyr:2001 + +hcl:#733820 byr:1988 pid:558453117 +hgt:66in +ecl:oth iyr:2010 eyr:2021 + +byr:1926 pid:796557821 cid:155 hcl:#efcc98 +hgt:159cm eyr:2023 ecl:oth iyr:2016 + +byr:2023 eyr:2031 hcl:0ba99a pid:14902250 +hgt:132 ecl:#9b89b1 iyr:2017 + +hcl:#a97842 byr:1926 +cid:205 +ecl:blu +iyr:2016 hgt:159cm eyr:2029 + +byr:1939 hcl:#866857 +pid:025607627 hgt:174cm cid:309 eyr:2026 ecl:brn + +ecl:hzl pid:805133506 +iyr:2014 +byr:1991 +hcl:#cfa07d +cid:350 +hgt:190cm + +hgt:155cm byr:1941 eyr:2024 +cid:164 hcl:#602927 iyr:2013 pid:531781358 ecl:amb + +hcl:#72a068 hgt:164cm +pid:621006770 +ecl:brn +eyr:2029 byr:1969 + +byr:1991 +ecl:grn iyr:2020 +pid:9921729009 eyr:2029 hcl:#623a2f +hgt:62in + +iyr:2017 ecl:hzl +pid:768217275 eyr:2020 byr:1937 +hcl:#866857 hgt:157cm + +cid:270 byr:1993 hcl:#733820 ecl:hzl pid:722650020 +hgt:174cm iyr:2010 +eyr:2021 + +hcl:#c0946f ecl:blu +hgt:154cm +eyr:2022 byr:1929 pid:357023679 iyr:2010 + +ecl:hzl +iyr:2013 hgt:165cm byr:1979 eyr:2023 hcl:#733820 pid:008734536 + +hcl:#341e13 +eyr:2030 byr:1993 +iyr:2014 hgt:193cm +cid:346 +ecl:blu pid:536339538 + +eyr:2030 +ecl:hzl +cid:296 pid:660062554 hcl:#efcc98 +byr:1977 hgt:179cm +iyr:2010 + +cid:119 pid:498520651 hgt:159cm +eyr:2029 iyr:2015 hcl:#18171d +ecl:gmt +byr:1950 + +eyr:2025 iyr:2010 hcl:#efcc98 pid:196372989 hgt:181cm byr:1952 ecl:oth + +cid:317 +eyr:2026 ecl:blu hcl:#733820 +hgt:184cm +pid:549730813 byr:1927 iyr:2018 + +pid:591769824 +hgt:180cm +byr:1920 +ecl:blu +eyr:2021 hcl:#cfa07d iyr:2017 + +pid:988946348 hgt:183cm cid:117 byr:1955 ecl:blu +iyr:2015 hcl:#623a2f eyr:2029 + +iyr:2014 +eyr:2026 hgt:184cm +ecl:oth +hcl:#7d3b0c pid:252101860 + +byr:1995 +hgt:182cm ecl:brn hcl:#6b5442 +iyr:2012 eyr:2028 pid:482757872 + +iyr:2017 cid:333 ecl:gry hcl:#623a2f hgt:157cm eyr:2021 +pid:487895819 +byr:1951 + +hcl:#fffffd +hgt:193cm eyr:2025 byr:1927 iyr:2014 ecl:oth pid:989206297 + +eyr:2030 ecl:brn hcl:#18171d hgt:193cm +iyr:2013 byr:1953 pid:862636088 + +hcl:#fffffd +pid:204286737 ecl:gry byr:1923 +hgt:181cm +iyr:2015 +eyr:2023 + +cid:288 pid:413935643 ecl:gry +iyr:2012 +hgt:171cm +hcl:#623a2f +eyr:2020 byr:1943 + +byr:2023 hcl:#c0946f +ecl:oth +pid:182634296 eyr:2009 +cid:306 hgt:183cm +iyr:2029 + +eyr:2026 ecl:hzl byr:2003 +iyr:2027 pid:734296691 hgt:188cm hcl:#fffffd + +hcl:#18171d ecl:gry pid:401957684 eyr:2020 +iyr:2017 cid:141 byr:1944 hgt:74in + +ecl:grn hcl:z +pid:335097003 byr:1925 +hgt:170in iyr:2020 eyr:2022 + +pid:727198487 +hgt:173cm +cid:323 hcl:#18171d iyr:2012 eyr:2024 +byr:1995 ecl:blu + +ecl:amb hcl:#602927 +pid:460274414 +hgt:76in byr:1995 +iyr:2020 +eyr:2028 + +byr:2002 ecl:oth pid:101164770 +hgt:172cm hcl:#fffffd eyr:2023 iyr:2016 + +ecl:blu hcl:#888785 iyr:2016 pid:031162631 eyr:2025 hgt:186cm +byr:1959 + +ecl:blu pid:093242619 hgt:188cm byr:1970 +eyr:2025 +hcl:#6b5442 +iyr:2020 + +byr:1990 eyr:2025 ecl:grn +pid:907309460 +iyr:2011 hcl:#602927 hgt:62in + +pid:346468647 eyr:2021 +ecl:oth hgt:169cm +iyr:2010 cid:233 +hcl:#b6652a byr:1977 + +pid:904834317 iyr:2011 +hcl:#b6652a eyr:2028 cid:281 +byr:1944 hgt:187cm ecl:gry + +eyr:1988 pid:663941602 +hgt:156in +hcl:#fa2e93 iyr:2015 ecl:gry byr:1953 + +hgt:184cm cid:107 pid:094829817 +ecl:gry byr:1998 eyr:2023 iyr:2017 + +eyr:2020 ecl:gry byr:1955 hcl:#a97842 pid:553841536 + +hgt:185cm eyr:2022 hcl:#341e13 ecl:oth byr:1934 pid:863541754 cid:178 +iyr:2016 + +eyr:2029 iyr:2014 byr:1937 cid:232 hgt:177cm hcl:#fffffd ecl:blu +pid:076753558 + +hcl:#cfa07d +hgt:168cm +ecl:grn +pid:664159349 eyr:2028 iyr:2017 byr:1972 + +hcl:#a97842 +byr:1987 +eyr:2020 hgt:182cm +iyr:2018 +ecl:brn pid:560272731 + +hgt:172cm cid:125 ecl:blu pid:291640184 +byr:1926 +iyr:2014 hcl:#ceb3a1 + +iyr:2027 hgt:84 hcl:z +ecl:#b68fec +pid:809408661 +byr:2018 eyr:1927 cid:87 + +pid:951007276 cid:260 eyr:2025 +ecl:brn iyr:2015 byr:1957 +hcl:#4b8216 hgt:161cm + +pid:359973697 hcl:#6b5442 +eyr:2022 hgt:169cm +byr:1965 ecl:brn iyr:2013 + +iyr:2012 hgt:65in eyr:2024 pid:842371195 +ecl:amb +hcl:#341e13 byr:2000 + +ecl:hzl hgt:170cm byr:1950 +cid:289 eyr:2037 iyr:2021 hcl:#18171d pid:389051819 + +hgt:159cm +ecl:amb hcl:#c0946f eyr:2020 pid:010539976 iyr:2011 byr:1921 + +hgt:176cm cid:270 pid:838338992 +eyr:2024 hcl:#866857 +ecl:amb iyr:2015 byr:1982 + +ecl:blu +cid:246 hgt:185cm +byr:1987 +hcl:#fffffd pid:042361456 eyr:2022 +iyr:2010 + +hgt:164cm +pid:881486702 ecl:brn byr:1969 hcl:#c0946f +iyr:2010 eyr:2030 + +iyr:2019 hcl:#6b5442 hgt:167cm +ecl:amb +cid:207 byr:1922 +eyr:2025 pid:343956182 + +ecl:oth iyr:2012 +hgt:158cm +eyr:2024 hcl:#602927 byr:1964 + +byr:1988 pid:030965463 hgt:154cm +ecl:gry eyr:2020 cid:227 +iyr:2012 +hcl:#3edc53 + +hgt:178cm hcl:#c0946f byr:1945 ecl:amb eyr:2030 + +hgt:158cm pid:270264980 eyr:2027 iyr:2016 byr:1928 cid:259 +ecl:gry hcl:#733820 + +byr:2026 hgt:164in cid:235 ecl:xry +hcl:z pid:2517730699 +eyr:2033 iyr:2024 + +ecl:grn hgt:69cm pid:1321222581 byr:1987 +eyr:2035 +iyr:2018 hcl:#fffffd + +hcl:#733820 cid:244 +ecl:gry iyr:2013 eyr:2028 +pid:794178180 hgt:74in byr:1923 + +hcl:#a97842 byr:1934 ecl:hzl eyr:2027 +pid:401882857 +iyr:2018 hgt:185cm + +iyr:2018 +pid:665564950 byr:1990 ecl:hzl +hgt:154cm +eyr:2026 hcl:#623a2f + +hcl:#602927 cid:189 byr:1967 pid:332861702 eyr:2021 +hgt:163cm +ecl:amb + +ecl:grn pid:734161280 hgt:184cm +iyr:2018 eyr:2020 byr:1929 hcl:#a97842 + +iyr:2018 byr:1925 +eyr:2022 hgt:193cm ecl:hzl +hcl:#341e13 +pid:008582320 + +byr:2025 ecl:dne hgt:167cm pid:48963526 +iyr:2025 hcl:z +eyr:2034 + +hcl:#cfa07d ecl:hzl eyr:2029 cid:194 byr:1936 +iyr:2020 +hgt:186cm +pid:328573727 + +iyr:2011 hgt:188cm pid:338435675 cid:326 ecl:gry +eyr:2027 +hcl:#6b5442 +byr:1958 + +pid:165cm +hgt:70 iyr:1996 +eyr:2034 cid:210 hcl:z ecl:#75606f byr:2027 + +hgt:180in hcl:#a0515a pid:#97a753 +byr:2026 iyr:2016 +eyr:1995 + +eyr:2020 +hcl:#18171d byr:1978 iyr:2012 hgt:68in +ecl:amb cid:346 pid:332495922 + +ecl:blu hgt:61in pid:747650669 +byr:1961 eyr:2028 +iyr:2020 +hcl:#4992f2 + +byr:1958 iyr:2017 ecl:oth +hgt:153cm +hcl:#602927 eyr:2023 pid:108391213 + +byr:1976 eyr:2023 iyr:2015 hgt:177cm pid:391628371 hcl:#8069c4 +ecl:grn + +pid:910402636 ecl:gry hgt:188cm byr:1924 hcl:#82dfdc eyr:2029 + +byr:1978 pid:302223240 iyr:2017 +hgt:174cm +hcl:#6b6569 ecl:blu eyr:2027 + +cid:135 +byr:1995 iyr:2015 ecl:oth pid:054611703 +eyr:2023 +hcl:#7d3b0c hgt:75in + +ecl:grn +eyr:2020 hgt:184cm pid:444944678 iyr:2019 hcl:#efcc98 + +byr:1946 +hgt:70in eyr:2022 hcl:#6b5442 ecl:amb iyr:2018 pid:859762925 + +byr:1995 eyr:2022 +ecl:grn pid:575081777 +hcl:#341e13 +hgt:183in iyr:2018 + +eyr:2028 hgt:162cm byr:1989 hcl:#0bd11f +iyr:2020 ecl:gry +pid:073498924 + +iyr:2014 +pid:122787281 byr:1982 cid:138 eyr:2021 hcl:#866857 ecl:hzl hgt:184cm + +cid:198 byr:2014 +pid:5529128129 +hgt:185in +iyr:2025 +hcl:z +eyr:2023 +ecl:gmt + +eyr:2021 hgt:170cm +cid:74 +iyr:2019 pid:943445928 byr:1980 +ecl:oth hcl:#ceb3a1 + +iyr:2020 eyr:2030 pid:201122734 cid:246 hgt:169cm ecl:grn hcl:#fffffd byr:1962 + +pid:025560194 +byr:1989 +hcl:#cfa07d hgt:182cm ecl:blu eyr:2025 iyr:2012 + +hgt:151cm +hcl:#efcc98 ecl:blu +byr:1983 eyr:2023 pid:814513328 iyr:2013 cid:73 + +byr:1961 pid:536384108 hgt:188cm ecl:amb iyr:2013 eyr:2027 hcl:#888785 cid:121 + +pid:364607819 +eyr:2024 ecl:amb hcl:#b6652a iyr:2016 +byr:2000 hgt:187cm + +hcl:z eyr:1956 iyr:2028 +hgt:168cm cid:105 +byr:2026 +ecl:#5b17d3 + +cid:207 pid:913509058 ecl:brn byr:2001 eyr:2026 +hcl:#866857 iyr:2019 +hgt:180cm + +pid:363979129 +eyr:2027 iyr:2013 +ecl:gry hcl:#866857 byr:1957 hgt:62in + +byr:1932 +eyr:2027 +hgt:66in ecl:hzl hcl:#efcc98 pid:417620217 iyr:2013 + +iyr:2013 cid:331 hgt:192cm +hcl:#d896d9 pid:795744816 byr:1935 + +byr:1960 hcl:#888785 hgt:176cm ecl:hzl pid:025206542 +iyr:2015 eyr:2030 + +ecl:oth hgt:182cm +hcl:#341e13 +pid:526568190 iyr:2018 cid:280 byr:1997 +eyr:2028 + +hgt:186cm pid:273625601 byr:1993 iyr:2018 eyr:2021 hcl:#733820 +ecl:blu + +hgt:74cm +byr:1981 eyr:2024 +ecl:amb iyr:2012 pid:154027492 hcl:#733820 + +hcl:#a97842 pid:347084450 ecl:oth +eyr:2030 hgt:176cm byr:1955 cid:229 +iyr:2013 + +hcl:#fffffd byr:1979 iyr:2017 +pid:183840860 hgt:177cm ecl:blu eyr:2023 + +pid:045246162 eyr:2021 byr:1928 hgt:190cm ecl:gry hcl:#602927 + +pid:273620987 +eyr:2022 hgt:162cm +cid:269 +byr:1991 hcl:#602927 ecl:amb iyr:2019 + +pid:621069556 ecl:amb +cid:202 byr:2020 hgt:189cm +iyr:2014 hcl:#fffffd +eyr:2027 + +eyr:2022 byr:1988 +hgt:190cm +pid:349839553 hcl:#602927 iyr:2018 ecl:gry + +iyr:2014 ecl:gry +hcl:#733820 eyr:2025 hgt:179cm pid:231854667 byr:1984 +cid:102 + +eyr:2020 +pid:509400891 hcl:#cfa07d hgt:172cm +ecl:grn byr:1997 iyr:2020 + +iyr:2017 byr:1994 hgt:174cm ecl:amb +pid:685743124 +hcl:#fffffd eyr:2029 + +iyr:2012 hgt:177cm byr:1999 pid:549190825 hcl:#b6652a eyr:2028 ecl:oth cid:316 + +hgt:192cm ecl:grn byr:1924 +iyr:2011 eyr:2029 hcl:#efcc98 +pid:215962187 + +iyr:2011 hcl:#866857 +cid:164 +hgt:184cm +ecl:gry eyr:2023 byr:1959 pid:204093118 + +hgt:172cm ecl:hzl hcl:#3f2f3a pid:623470811 byr:1938 iyr:2013 eyr:2022 + +hcl:#b6652a +iyr:2019 hgt:152in +ecl:oth +pid:189008850 byr:2006 + +ecl:oth hcl:#602927 +pid:049746898 byr:1924 hgt:150cm eyr:2026 +iyr:2014 + +ecl:oth +eyr:2028 byr:2018 hcl:#733820 +pid:8676207205 iyr:2018 +hgt:190cm + +eyr:2023 cid:308 hgt:170cm ecl:oth iyr:2014 hcl:#18171d pid:874405208 byr:1936 + +eyr:2021 ecl:hzl +pid:423603306 +hcl:#c0946f cid:147 +byr:1988 iyr:2016 hgt:164cm + +hgt:176cm iyr:2010 +hcl:#6b5442 cid:280 byr:1988 ecl:hzl pid:967151288 eyr:2028 + +cid:299 hgt:163cm ecl:gry +pid:561439154 eyr:2023 +hcl:#cfa07d iyr:2019 byr:1959 + +pid:635547007 +ecl:blu +byr:1996 hcl:#7d3b0c cid:280 eyr:2023 +hgt:170cm iyr:2017 + +hcl:#888785 iyr:2014 +ecl:brn +hgt:190cm byr:1941 eyr:2021 + +hcl:#c0946f cid:199 hgt:162cm ecl:amb pid:130696599 eyr:2022 iyr:2018 byr:1948 + +cid:314 hcl:#a4fc09 ecl:hzl iyr:2019 +pid:886849824 eyr:2026 byr:1933 hgt:178cm + +byr:1996 iyr:2016 eyr:2030 hgt:169cm +pid:119207760 +hcl:#ef542c +ecl:brn + +iyr:2030 eyr:2039 hcl:#c0946f pid:#7336a0 hgt:182cm cid:347 +ecl:#c81361 byr:2003 + +pid:727812879 iyr:2013 eyr:2027 hgt:172cm +hcl:#7d3b0c ecl:gry byr:1966 + +hcl:#341e13 +iyr:2016 pid:744997238 +cid:322 +byr:1973 +ecl:hzl eyr:2028 hgt:190cm + +hgt:171cm eyr:2026 +iyr:2014 ecl:oth +pid:074049558 hcl:#04083f byr:1923 + +pid:973713235 +eyr:2021 +ecl:brn +byr:1922 hcl:#fffffd iyr:2012 +hgt:178cm + +ecl:#10165d +cid:201 eyr:2026 pid:#ceefa8 byr:2020 +hgt:164cm iyr:2011 +hcl:9fccf7 + +ecl:blu +hgt:165cm iyr:2012 eyr:2025 pid:775787557 +byr:1952 hcl:#623a2f + +pid:6186829005 ecl:lzr hcl:z hgt:69in iyr:2021 byr:2018 eyr:1974 + +pid:824641755 eyr:2028 byr:1950 hgt:184cm +hcl:#c0946f +iyr:2014 + +hcl:#7d3b0c cid:84 hgt:187cm iyr:2015 +pid:895876610 +byr:1988 eyr:2023 + +hcl:#fffffd +hgt:157cm iyr:2020 eyr:2030 ecl:grn pid:486236241 + +iyr:2010 +eyr:2029 +hgt:74in ecl:hzl byr:1926 pid:348573885 hcl:#9d1214 + +hgt:171cm ecl:oth +eyr:2022 pid:148728436 byr:1993 hcl:#a97842 iyr:2013 + +iyr:2019 +hgt:151cm +eyr:2020 pid:319882814 ecl:grn byr:1966 cid:256 hcl:#3107b3 + +hgt:184cm ecl:grn +byr:1947 +eyr:2025 iyr:2015 pid:827962962 cid:62 hcl:#f3a364 + +iyr:2013 +hcl:#fffffd pid:215012801 ecl:amb eyr:2024 +hgt:154cm +byr:1973 + +ecl:hzl hgt:152cm +hcl:#623a2f +byr:1944 eyr:2022 pid:295632731 +cid:243 iyr:2019 + +ecl:brn +iyr:2011 pid:089250747 byr:1984 hcl:73e739 cid:253 hgt:161cm eyr:2021 + +hcl:#18171d byr:1944 pid:732054667 eyr:2021 +ecl:oth hgt:173cm + +ecl:gry pid:445116331 +hcl:#a97842 +hgt:187cm eyr:2026 iyr:2020 byr:1992 + +hcl:80c091 pid:745555899 +iyr:2021 +hgt:170cm +byr:1990 + +pid:058987865 byr:1927 cid:209 +hcl:#65ccf6 eyr:2025 +ecl:brn iyr:2012 hgt:164cm + +hgt:67cm +byr:2026 hcl:f8e749 iyr:2023 eyr:1921 ecl:lzr + +eyr:2028 iyr:2013 pid:103268377 hgt:179cm byr:1922 +ecl:hzl +hcl:#7d3b0c + +byr:1923 ecl:gry hgt:167cm hcl:#7fc8ee iyr:2015 pid:427963077 eyr:2024 + +byr:1927 ecl:grn pid:741328150 +eyr:2029 hcl:#733820 +iyr:2015 hgt:157cm + +hgt:70cm hcl:e76970 iyr:1945 cid:186 +byr:1921 eyr:2029 +pid:823622634 +ecl:zzz + +hgt:61cm cid:87 hcl:d5e5ff +eyr:2024 ecl:dne pid:182634269 +iyr:2029 + +hcl:#623a2f eyr:2020 byr:1936 ecl:gry pid:236984204 +iyr:2011 hgt:156cm + +pid:872645776 +byr:2023 +cid:220 ecl:blu hgt:172cm eyr:2033 +iyr:2010 hcl:ff82f9 + +pid:774489073 iyr:2013 byr:1922 ecl:brn eyr:2025 hcl:#18171d hgt:163cm + +eyr:2024 hgt:65in byr:1962 iyr:2019 +pid:112233558 hcl:#888785 ecl:grn + +hgt:172cm eyr:2022 +hcl:#18171d ecl:blu +pid:609008608 iyr:2013 +cid:244 byr:1980 + +cid:124 hgt:175in eyr:2025 +hcl:674e80 pid:099875931 iyr:1956 + +byr:1926 hgt:188cm +ecl:hzl eyr:2021 +iyr:2018 +hcl:#866857 pid:557800355 + +byr:1939 pid:200409089 +eyr:2026 hgt:164cm +ecl:grn iyr:2013 +hcl:#733820 + +cid:73 hgt:169cm iyr:2016 byr:1976 ecl:gry eyr:2024 +pid:043453462 + +pid:609818712 hcl:#733820 byr:1958 +eyr:2025 hgt:187cm iyr:2017 ecl:gry + +hgt:66in pid:618590610 iyr:2013 byr:1938 hcl:#d1bda9 +eyr:2022 +ecl:grn cid:69 + +hgt:156cm pid:755742405 +byr:1929 hcl:#6b5442 eyr:2024 +iyr:2018 +ecl:gry +cid:105 + +eyr:2030 pid:77022842 +hgt:160cm byr:1989 +iyr:2011 hcl:#7d3b0c ecl:blu + +iyr:2015 +hcl:#341e13 byr:1968 pid:434159843 +ecl:amb hgt:150cm +eyr:2030 + +hcl:z eyr:1993 pid:#b3a5a6 iyr:1947 hgt:176in +ecl:#78876d + +cid:249 hcl:#cfa07d +hgt:180cm ecl:gry eyr:2026 byr:1965 +pid:048327438 iyr:2010 + +pid:136468890 ecl:gry +byr:1940 +hcl:#fffffd hgt:185cm iyr:2016 eyr:2021 + +hcl:#b6652a hgt:180in byr:1976 eyr:2022 pid:156cm ecl:#737836 +iyr:2013 + +ecl:amb iyr:2016 hgt:162cm byr:1955 pid:193cm eyr:2028 cid:346 +hcl:#733820 + +iyr:2010 byr:1932 eyr:2025 ecl:grn +pid:595837820 +hcl:#341e13 +hgt:166cm cid:224 + +pid:481646831 +eyr:2029 +hcl:#623a2f cid:319 iyr:2016 +ecl:brn hgt:160cm byr:1944 + +ecl:zzz pid:428329840 cid:238 iyr:2022 hgt:76cm +hcl:#a97842 +byr:2024 eyr:2028 + +iyr:2014 hgt:170cm +byr:1963 hcl:#623a2f +eyr:2026 pid:225910806 ecl:gry + +ecl:grn iyr:2010 hgt:193cm byr:1928 eyr:2028 pid:343022641 hcl:#733820 + +eyr:2023 ecl:grn +byr:1950 iyr:2012 hcl:#866857 pid:400725165 +hgt:193cm + +cid:195 iyr:2014 ecl:oth eyr:2027 byr:1966 +hgt:177cm hcl:#18171d pid:913894485 + +iyr:2015 hgt:154cm +cid:206 +pid:134599284 hcl:#602927 +eyr:2023 ecl:brn +byr:1983 + +ecl:#2d0e7a pid:#f34625 eyr:1942 iyr:2027 byr:2013 hcl:z hgt:162cm + +hgt:189cm byr:1965 iyr:2011 +cid:178 ecl:hzl +hcl:#b6652a eyr:2026 pid:683560227 + +eyr:2030 pid:047446524 ecl:grn hgt:167cm iyr:2017 hcl:#602927 +byr:1920 + +cid:86 +iyr:1920 hgt:193cm +eyr:2027 pid:401913877 ecl:hzl +hcl:#888785 byr:1953 + +byr:1991 +ecl:grn +iyr:2016 +hcl:#5e1ef2 hgt:186cm +pid:076499738 +eyr:2025 + +eyr:2030 hcl:#18171d pid:750694893 +hgt:157cm iyr:2020 cid:338 +byr:1956 ecl:gry + +iyr:2027 pid:#37f002 hgt:164cm ecl:#80df11 +hcl:#aeacee cid:320 +eyr:2039 byr:1956 + +iyr:2014 hcl:#733820 ecl:grn +byr:1960 +eyr:2025 pid:667089568 + +hgt:163cm +byr:1962 cid:108 ecl:gry hcl:#733820 iyr:2012 +eyr:2029 pid:763684725 + +byr:1984 hcl:#888785 hgt:159cm iyr:2012 ecl:gry +eyr:2024 cid:236 pid:174711749 + +ecl:gry pid:044931271 +hcl:#b6652a eyr:2029 iyr:2013 byr:1985 + +byr:1973 iyr:2018 hcl:#a97842 pid:937214113 ecl:blu +cid:247 hgt:186cm eyr:2023 + +cid:108 pid:231782961 iyr:2017 +eyr:2034 hgt:170cm byr:2025 hcl:#18171d ecl:utc + +pid:298274796 byr:1928 hcl:#a97842 hgt:188cm iyr:2011 ecl:gry eyr:2028 + +hgt:65cm iyr:1943 eyr:2025 +hcl:z +pid:65702335 ecl:#bb54e6 byr:2010 + +pid:499116613 eyr:2024 +ecl:gry hcl:#cfa07d hgt:193cm byr:1999 +cid:278 iyr:2015 + +hcl:#6b5442 eyr:2027 hgt:175cm byr:1988 +ecl:brn pid:410075320 iyr:2010 + +pid:269678991 ecl:oth iyr:2013 +hcl:#602927 byr:1991 eyr:2023 + +ecl:oth +pid:144593265 hcl:#fffffd +eyr:2020 iyr:2018 +byr:1975 hgt:160cm +cid:304 + +iyr:2014 hcl:#ceb3a1 eyr:2029 +byr:1951 pid:520804395 hgt:185cm ecl:oth + +hgt:159cm +pid:312887994 +cid:205 +iyr:2016 ecl:hzl hcl:#866857 eyr:2029 byr:1944 + +iyr:2023 ecl:#54c85c byr:2030 +eyr:1946 cid:190 pid:512417622 + +byr:1946 eyr:2023 hgt:163cm +hcl:#2d4e9c ecl:brn pid:839043333 iyr:2014 + +iyr:2027 cid:122 hgt:187cm eyr:1975 ecl:grn byr:1920 +hcl:#c0946f + +eyr:2029 hgt:189cm ecl:blu byr:1922 iyr:2016 +pid:924104599 +hcl:#b6652a + +hgt:162cm +iyr:2016 byr:1921 hcl:#18171d eyr:1938 ecl:hzl +pid:682222023 + +cid:118 pid:959515596 +byr:1921 iyr:2010 eyr:2029 hcl:#7d3b0c ecl:oth hgt:158cm + +ecl:#8ac844 pid:162cm +hcl:8f4d80 hgt:150in byr:2005 +eyr:2008 +iyr:2017 cid:174 + +hcl:z byr:1936 +pid:255481052 eyr:2021 +iyr:2012 hgt:170cm cid:276 ecl:hzl + +iyr:2013 byr:1935 hgt:179cm +eyr:2023 ecl:amb pid:073621563 hcl:#623a2f + +hcl:#18171d cid:230 byr:1989 ecl:oth eyr:2021 hgt:181cm pid:661224730 +iyr:2019 + +pid:748039140 iyr:2020 eyr:2020 ecl:#6ebbc2 hcl:#fffffd hgt:171cm +byr:1995 + +ecl:hzl pid:758144605 hcl:#ceb3a1 hgt:186cm +eyr:2028 iyr:2014 +byr:1928 + +ecl:hzl +hgt:66in +byr:2000 iyr:2017 eyr:2020 +pid:162973694 hcl:#a97842 + +iyr:2012 pid:749770535 +byr:1969 cid:148 +hcl:#733820 +hgt:180cm eyr:2021 ecl:hzl + +iyr:2010 +byr:1958 +hgt:164cm +ecl:blu hcl:#733820 pid:890634327 eyr:2024 + +hgt:70in pid:218397894 +iyr:2020 eyr:2025 ecl:gry hcl:#341e13 +byr:1970 + +eyr:2020 pid:854208004 hgt:157cm hcl:#7d3b0c ecl:amb byr:1981 iyr:2020 + +byr:1924 +cid:321 eyr:2028 hcl:#cfa07d iyr:2010 ecl:amb pid:036669613 hgt:170cm + +ecl:#6649d4 pid:0026989865 cid:188 +hgt:152in +byr:1950 hcl:z eyr:1928 iyr:1963 + +hcl:#ceb3a1 ecl:grn eyr:2028 pid:074363489 iyr:2010 hgt:173cm byr:1966 + +eyr:2030 +pid:9731612333 ecl:#f8824c +iyr:2022 hgt:161in +byr:2023 +cid:316 +hcl:z + +hgt:175cm iyr:2016 eyr:2024 cid:244 +byr:1952 +pid:085432899 +hcl:#fffffd ecl:brn + +ecl:brn eyr:2026 iyr:2017 hgt:75in +pid:745302991 byr:1969 hcl:#7394c7 diff --git a/src/day1.rs b/src/day1.rs new file mode 100644 index 0000000..f1315c5 --- /dev/null +++ b/src/day1.rs @@ -0,0 +1,39 @@ +use aoc_runner_derive::{aoc, aoc_generator}; + +#[aoc_generator(day1)] +pub fn d1_input(input: &str) -> Vec { + let mut entries: Vec = input.split('\n').map(|x| x.parse().unwrap()).collect(); + entries.sort(); + entries +} + +#[aoc(day1, part1)] +pub fn solve_d1_p1(input: &[u64]) -> u64 { + for entry in input { + let needed = 2020 - entry; + if let Ok(idx) = input.binary_search(&needed) { + return entry * input[idx]; + } + } + panic!("not found"); +} + +#[aoc(day1, part2)] +pub fn solve_d1_p2(input: &[u64]) -> Option { + for i in 0..input.len() - 2 { + let entry1 = input[i]; + for j in i + 1..input.len() - 1 { + let entry2 = input[j]; + if entry1 + entry2 > 2020 { + break; + } + for k in j + 1..input.len() { + let entry3 = input[k]; + if entry1 + entry2 + entry3 == 2020 { + return Some(entry1 * entry2 * entry3); + } + } + } + } + return None; +} diff --git a/src/day2.rs b/src/day2.rs new file mode 100644 index 0000000..f9f87e1 --- /dev/null +++ b/src/day2.rs @@ -0,0 +1,53 @@ +use aoc_runner_derive::aoc; + +struct PasswdEntry<'a> { + lower_bound: usize, + upper_bound: usize, + policy_char: u8, + passwd: &'a [u8], +} + +impl<'a> PasswdEntry<'a> { + fn parse(mut input: &'a str) -> Option { + let lb_idx = input.find('-')?; + let lower_bound: usize = (&input[..lb_idx]).parse().ok()?; + input = &input[lb_idx + 1..]; + + let ub_idx = input.find(' ')?; + let upper_bound: usize = (&input[..ub_idx]).parse().ok()?; + input = &input[ub_idx + 1..]; + + let policy_char = input.as_bytes()[0]; + let passwd = &input[3..].as_bytes(); + Some(PasswdEntry { + lower_bound, + upper_bound, + policy_char, + passwd, + }) + } +} + +#[aoc(day2, part1)] +pub fn solve_d2_p1(input: &str) -> usize { + fn line_is_valid(line: &str) -> bool { + let entry = PasswdEntry::parse(line).unwrap(); + let count = entry + .passwd + .iter() + .filter(|&&b| b == entry.policy_char) + .count(); + (count >= entry.lower_bound) && (count <= entry.upper_bound) + } + input.split('\n').filter(|x| line_is_valid(x)).count() +} + +#[aoc(day2, part2)] +pub fn solve_d2_p2(input: &str) -> usize { + fn line_is_valid(line: &str) -> bool { + let entry = PasswdEntry::parse(line).unwrap(); + (entry.passwd[entry.lower_bound - 1] == entry.policy_char) + ^ (entry.passwd[entry.upper_bound - 1] == entry.policy_char) + } + input.split('\n').filter(|x| line_is_valid(x)).count() +} diff --git a/src/day3.rs b/src/day3.rs new file mode 100644 index 0000000..58ba078 --- /dev/null +++ b/src/day3.rs @@ -0,0 +1,101 @@ +use std::convert::TryFrom; + +use aoc_runner_derive::{aoc, aoc_generator}; + +#[derive(Debug)] +pub enum MapSquare { + Open, + Tree, +} + +impl TryFrom for MapSquare { + type Error = u8; + fn try_from(b: u8) -> Result { + Ok(match b { + b'.' => MapSquare::Open, + b'#' => MapSquare::Tree, + unknown => return Err(unknown), + }) + } +} + +#[aoc_generator(day3)] +pub fn d3_input(input: &[u8]) -> Vec> { + input + .split(|&b| b == b'\n') + .map(|line| { + line.iter() + .copied() + .map(|b| MapSquare::try_from(b).unwrap()) + .collect() + }) + .collect() +} + +#[aoc(day3, part1)] +pub fn solve_d3_p1(input: &[Vec]) -> usize { + input + .iter() + .skip(1) + .enumerate() + .map(|(steps_taken, grid_line)| { + let x_coord = (steps_taken + 1) * 3; + match grid_line.iter().cycle().nth(x_coord).unwrap() { + MapSquare::Open => 0, + MapSquare::Tree => 1, + } + }) + .sum() +} + +#[aoc(day3, part2)] +pub fn solve_d3_p2(input: &[Vec]) -> usize { + #[derive(Debug, Clone, Copy)] + struct Step { + x_step: usize, + y_step: usize, + } + + let steps = [ + Step { + x_step: 1, + y_step: 1, + }, + Step { + x_step: 3, + y_step: 1, + }, + Step { + x_step: 5, + y_step: 1, + }, + Step { + x_step: 7, + y_step: 1, + }, + Step { + x_step: 1, + y_step: 2, + }, + ]; + + steps + .iter() + .copied() + .map(|Step { x_step, y_step }| -> usize { + input + .iter() + .skip(y_step) + .step_by(y_step) + .enumerate() + .map(|(num_steps_taken, grid_line)| { + let x_coord = (num_steps_taken + 1) * x_step; + match grid_line.iter().cycle().nth(x_coord).unwrap() { + MapSquare::Open => 0, + MapSquare::Tree => 1, + } + }) + .sum() + }) + .product() +} diff --git a/src/day4.rs b/src/day4.rs new file mode 100644 index 0000000..959a60f --- /dev/null +++ b/src/day4.rs @@ -0,0 +1,190 @@ +use std::str::FromStr; + +use aoc_runner_derive::aoc; + +#[derive(Debug)] +struct BirthYear(u16); +impl FromStr for BirthYear { + type Err = (); + + fn from_str(s: &str) -> Result { + let year = s.parse().map_err(|_| ())?; + if year < 1920 || year > 2002 { + return Err(()); + } + Ok(BirthYear(year)) + } +} + +#[derive(Debug)] +struct IssueYear(u16); +impl FromStr for IssueYear { + type Err = (); + + fn from_str(s: &str) -> Result { + let year = s.parse().map_err(|_| ())?; + if year < 2010 || year > 2020 { + return Err(()); + } + Ok(IssueYear(year)) + } +} + +#[derive(Debug)] +struct ExpYear(u16); +impl FromStr for ExpYear { + type Err = (); + + fn from_str(s: &str) -> Result { + let year = s.parse().map_err(|_| ())?; + if year < 2020 || year > 2030 { + return Err(()); + } + Ok(ExpYear(year)) + } +} + +#[derive(Debug)] +struct HairColor(u32); +impl FromStr for HairColor { + type Err = (); + + fn from_str(s: &str) -> Result { + let hex = s.strip_prefix("#").ok_or(())?; + let hcl = u32::from_str_radix(hex, 16).map_err(|_| ())?; + if hcl > 0xffffff { + return Err(()); + } + Ok(HairColor(hcl)) + } +} + +#[derive(Debug)] +enum Height { + Inches(u8), + Cm(u8), +} +impl FromStr for Height { + type Err = (); + + fn from_str(s: &str) -> Result { + if let Some(cm) = s.strip_suffix("cm") { + let cm: u8 = cm.parse().map_err(|_| ())?; + if cm < 150 || cm > 193 { + return Err(()); + } + Ok(Height::Cm(cm)) + } else if let Some(inches) = s.strip_suffix("in") { + let inches: u8 = inches.parse().map_err(|_| ())?; + if inches < 59 || inches > 76 { + return Err(()); + } + Ok(Height::Inches(inches)) + } else { + Err(()) + } + } +} + +#[derive(Debug)] +enum EyeColor { + Amber, + Blue, + Brown, + Gray, + Green, + Hazel, + Other, +} +impl FromStr for EyeColor { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "amb" => EyeColor::Amber, + "blu" => EyeColor::Blue, + "brn" => EyeColor::Brown, + "gry" => EyeColor::Gray, + "grn" => EyeColor::Green, + "hzl" => EyeColor::Hazel, + "oth" => EyeColor::Other, + _ => return Err(()), + }) + } +} + +#[derive(Debug)] +struct PassportId(u32); +impl FromStr for PassportId { + type Err = (); + + fn from_str(s: &str) -> Result { + if s.len() != 9 { + return Err(()); + } + Ok(PassportId(s.parse().map_err(|_| ())?)) + } +} + +#[derive(Debug)] +pub struct Passport<'a> { + byr: BirthYear, + iyr: IssueYear, + eyr: ExpYear, + hgt: Height, + hcl: HairColor, + ecl: EyeColor, + pid: PassportId, + cid: Option<&'a str>, +} + +impl<'a> Passport<'a> { + fn parse(input: &'a str) -> Option { + fn parse_kv(input: &str) -> Option<(&str, &str)> { + let mut iter = input.split(':'); + let k = iter.next()?; + let v = iter.next()?; + if iter.next().is_some() { + return None; + } + Some((k, v)) + } + + let mut byr = None; + let mut iyr = None; + let mut eyr = None; + let mut hgt = None; + let mut hcl = None; + let mut ecl = None; + let mut pid = None; + let mut cid = None; + for field in input.split_ascii_whitespace() { + match parse_kv(field) { + Some(("byr", value)) => byr = Some(value.parse().ok()?), + Some(("iyr", value)) => iyr = Some(value.parse().ok()?), + Some(("eyr", value)) => eyr = Some(value.parse().ok()?), + Some(("hgt", value)) => hgt = Some(value.parse().ok()?), + Some(("hcl", value)) => hcl = Some(value.parse().ok()?), + Some(("ecl", value)) => ecl = Some(value.parse().ok()?), + Some(("pid", value)) => pid = Some(value.parse().ok()?), + Some(("cid", value)) => cid = Some(value), + _ => return None, + } + } + Some(Passport { + byr: byr?, + iyr: iyr?, + eyr: eyr?, + hgt: hgt?, + hcl: hcl?, + ecl: ecl?, + pid: pid?, + cid, + }) + } +} + +#[aoc(day4, part2)] +pub fn solve_d4_p2(input: &str) -> usize { + input.split("\n\n").filter_map(Passport::parse).count() +} diff --git a/src/lib.rs b/src/lib.rs index 0940312..a2e29cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,164 +1,6 @@ -use std::convert::TryFrom; +pub mod day1; +pub mod day2; +pub mod day3; +pub mod day4; -use aoc_runner_derive::{aoc, aoc_generator, aoc_lib}; - -#[aoc_generator(day1)] -pub fn d1_input(input: &str) -> Vec { - let mut entries: Vec = input.split('\n').map(|x| x.parse().unwrap()).collect(); - entries.sort(); - entries -} - -#[aoc(day1, part1)] -pub fn solve_d1_p1(input: &[u64]) -> u64 { - for entry in input { - let needed = 2020 - entry; - if let Ok(idx) = input.binary_search(&needed) { - return entry * input[idx]; - } - } - panic!("not found"); -} - -#[aoc(day1, part2)] -pub fn solve_d1_p2(input: &[u64]) -> Option { - for i in 0..input.len() - 2 { - let entry1 = input[i]; - for j in i + 1..input.len() - 1 { - let entry2 = input[j]; - if entry1 + entry2 > 2020 { - break; - } - for k in j + 1..input.len() { - let entry3 = input[k]; - if entry1 + entry2 + entry3 == 2020 { - return Some(entry1 * entry2 * entry3); - } - } - } - } - return None; -} - -struct PasswdEntry<'a> { - lower_bound: usize, - upper_bound: usize, - policy_char: u8, - passwd: &'a [u8], -} - -impl<'a> PasswdEntry<'a> { - fn parse(mut input: &'a str) -> Option { - let lb_idx = input.find('-')?; - let lower_bound: usize = (&input[..lb_idx]).parse().ok()?; - input = &input[lb_idx + 1..]; - - let ub_idx = input.find(' ')?; - let upper_bound: usize = (&input[..ub_idx]).parse().ok()?; - input = &input[ub_idx + 1..]; - - let policy_char = input.as_bytes()[0]; - let passwd = &input[3..].as_bytes(); - Some(PasswdEntry { lower_bound, upper_bound, policy_char, passwd }) - } -} - -#[aoc(day2, part1)] -pub fn solve_d2_p1(input: &str) -> usize { - fn line_is_valid(line: &str) -> bool { - let entry = PasswdEntry::parse(line).unwrap(); - let count = entry.passwd.iter().filter(|&&b| b == entry.policy_char).count(); - (count >= entry.lower_bound) && (count <= entry.upper_bound) - } - input.split('\n').filter(|x| line_is_valid(x)).count() -} - -#[aoc(day2, part2)] -pub fn solve_d2_p2(input: &str) -> usize { - fn line_is_valid(line: &str) -> bool { - let entry = PasswdEntry::parse(line).unwrap(); - (entry.passwd[entry.lower_bound - 1] == entry.policy_char) - ^ (entry.passwd[entry.upper_bound - 1] == entry.policy_char) - } - input.split('\n').filter(|x| line_is_valid(x)).count() -} - -#[derive(Debug)] -pub enum MapSquare { - Open, - Tree, -} - -impl TryFrom for MapSquare { - type Error = u8; - fn try_from(b: u8) -> Result { - Ok(match b { - b'.' => MapSquare::Open, - b'#' => MapSquare::Tree, - unknown => return Err(unknown), - }) - } -} - -#[aoc_generator(day3)] -pub fn d3_input(input: &[u8]) -> Vec> { - input - .split(|&b| b == b'\n') - .map(|line| line.iter().copied().map(|b| MapSquare::try_from(b).unwrap()).collect()) - .collect() -} - -#[aoc(day3, part1)] -pub fn solve_d3_p1(input: &[Vec]) -> usize { - input - .iter() - .skip(1) - .enumerate() - .map(|(steps_taken, grid_line)| { - let x_coord = (steps_taken + 1) * 3; - match grid_line.iter().cycle().nth(x_coord).unwrap() { - MapSquare::Open => 0, - MapSquare::Tree => 1, - } - }) - .sum() -} - -#[aoc(day3, part2)] -pub fn solve_d3_p2(input: &[Vec]) -> usize { - #[derive(Debug, Clone, Copy)] - struct Step { - x_step: usize, - y_step: usize, - } - - let steps = [ - Step { x_step: 1, y_step: 1 }, - Step { x_step: 3, y_step: 1 }, - Step { x_step: 5, y_step: 1 }, - Step { x_step: 7, y_step: 1 }, - Step { x_step: 1, y_step: 2 }, - ]; - - steps - .iter() - .copied() - .map(|Step { x_step, y_step }| -> usize { - input - .iter() - .skip(y_step) - .step_by(y_step) - .enumerate() - .map(|(num_steps_taken, grid_line)| { - let x_coord = (num_steps_taken + 1) * x_step; - match grid_line.iter().cycle().nth(x_coord).unwrap() { - MapSquare::Open => 0, - MapSquare::Tree => 1, - } - }) - .sum() - }) - .product() -} - -aoc_lib! { year = 2020 } +aoc_runner_derive::aoc_lib! { year = 2020 }