aoc-2020-zig

git clone https://git.sinitax.com/sinitax/aoc-2020-zig
Log | Files | Refs | README | sfeed.txt

commit d7bec1fe5e6d30890a9de21a4bc012c78bb8a226
parent fc7bffb0279093722e5c619fc19629f41410580e
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat,  5 Dec 2020 09:39:11 +0100

Day 4

Diffstat:
Mscripts/prepare | 4++--
Mscripts/scrape | 5++++-
Asrc/day4/input | 1100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/day4/main.zig | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/day4/part1 | 47+++++++++++++++++++++++++++++++++++++++++++++++
Asrc/day4/part2 | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 1310 insertions(+), 3 deletions(-)

diff --git a/scripts/prepare b/scripts/prepare @@ -38,5 +38,5 @@ echo "Copying template" cp "$REPOROOT/data/template.zig" "$folder/main.zig" load "Loading problem input" $daynum input -load "Loading first problem text" $daynum text 1 -load "Loading second problem text" $daynum text 1 +load "Loading first problem text" $daynum part 1 +load "Loading second problem text" $daynum part 2 diff --git a/scripts/scrape b/scripts/scrape @@ -61,7 +61,10 @@ def scrape_text(day, part): r = requests.get(baseurl, headers = headers) soup = BeautifulSoup(r.text, "html.parser") - textobj = soup.select("article.day-desc")[part - 1] + try: + textobj = soup.select("article.day-desc")[part - 1] + except: + sys.exit(1) with open(path, "w+") as of: text = extract_hltext(textobj) diff --git a/src/day4/input b/src/day4/input @@ -0,0 +1,1100 @@ +ecl:grn +cid:315 iyr:2012 hgt:192cm eyr:2023 pid:873355140 byr:1925 hcl:#cb2c03 + +byr:2027 hcl:ec0cfd ecl:blu cid:120 +eyr:1937 pid:106018766 iyr:2010 hgt:154cm + +byr:1965 eyr:2028 hgt:157cm +cid:236 iyr:2018 ecl:brn +hcl:#cfa07d pid:584111467 + +eyr:2029 ecl:hzl +iyr:1972 byr:1966 +pid:2898897192 +hgt:59cm hcl:z + +pid:231652013 hcl:#602927 hgt:166 +ecl:grn eyr:2025 +byr:2008 iyr:1986 + +byr:1928 hgt:167cm +hcl:#18171d iyr:2012 +ecl:oth pid:237657808 eyr:1944 + +hgt:73in ecl:grn byr:1931 pid:358388825 iyr:2020 +hcl:#602927 eyr:2020 + +hcl:#efcc98 eyr:2024 ecl:hzl +byr:2030 hgt:192cm +iyr:2013 pid:7479289410 + +pid:053467220 iyr:2012 hgt:169cm +cid:149 hcl:#866857 +eyr:2030 +byr:1995 ecl:oth + +hgt:162cm hcl:#efcc98 ecl:grn byr:1985 pid:419840766 +eyr:2022 +iyr:2020 + +pid:22086957 hcl:c69235 ecl:#c458c5 eyr:1986 byr:2014 hgt:72cm iyr:1934 + +hcl:#866857 +ecl:brn eyr:2024 +iyr:2017 +pid:505225484 cid:144 +byr:1980 +hgt:170cm + +hcl:#866857 ecl:gry +byr:1972 iyr:2019 eyr:2023 +cid:234 pid:721290041 hgt:191cm + +pid:346301363 +eyr:2020 +hcl:#733820 iyr:2019 hgt:177cm +byr:1998 + +hgt:157cm byr:1963 +pid:898055805 +hcl:#fffffd ecl:blu iyr:2017 cid:87 +eyr:2030 + +pid:605900764 iyr:2011 +hgt:73in ecl:hzl eyr:2024 +hcl:#888785 +cid:281 + +iyr:2010 eyr:2026 hcl:#4f7e76 pid:883386029 byr:1946 ecl:brn + +hcl:z +iyr:2020 pid:9121928466 byr:2014 ecl:zzz eyr:2025 +hgt:172in + +hgt:151cm cid:163 pid:670884417 iyr:2012 +ecl:oth hcl:#ceb3a1 +eyr:2028 + +hcl:z cid:92 hgt:69cm +byr:2008 pid:492284612 +eyr:2020 iyr:2023 +ecl:hzl + +byr:1933 +hcl:#7d3b0c eyr:2020 hgt:170cm +pid:949064511 iyr:2010 +ecl:oth + +eyr:2025 byr:1989 ecl:oth cid:100 hgt:182cm +pid:629190040 iyr:2017 hcl:#b6652a + +ecl:hzl cid:76 hcl:#e71392 eyr:2021 iyr:2013 byr:1995 +pid:762177473 +hgt:179cm + +pid:198500564 eyr:2029 hcl:#733820 cid:51 iyr:2012 +hgt:70in byr:1938 ecl:oth + +hgt:190cm ecl:brn byr:1952 iyr:2015 hcl:#623a2f +eyr:2023 + +hgt:169cm hcl:#602927 byr:2001 pid:823979592 iyr:2016 eyr:2029 + +iyr:2010 ecl:gry +eyr:2022 hgt:156cm byr:1953 pid:434063393 +hcl:#733820 + +pid:091724580 hcl:a7069e eyr:1984 ecl:#95d01e byr:2012 iyr:2005 + +eyr:2022 byr:1972 hcl:#866857 ecl:hzl pid:227453248 +hgt:153cm cid:324 iyr:2018 + +cid:195 pid:049871343 +eyr:2024 hgt:169cm +byr:1952 iyr:2010 ecl:grn + +eyr:2035 pid:189cm +hgt:77 iyr:1973 ecl:#dc83d5 +hcl:z byr:2004 + +byr:2027 +pid:89338932 hcl:1de39e ecl:grn hgt:159in eyr:2034 iyr:1937 + +pid:076534920 +hgt:152cm +byr:1969 +ecl:blu +hcl:#866857 iyr:2011 eyr:2024 + +iyr:2019 eyr:2028 +ecl:blu hgt:169cm +hcl:#888785 pid:332202163 byr:1923 + +hgt:65in byr:1964 iyr:2019 +pid:287612987 ecl:hzl cid:213 eyr:2023 hcl:#ceb3a1 + +hcl:#623a2f pid:182484027 +iyr:2016 ecl:brn byr:1943 +hgt:71in eyr:2021 cid:344 + +hcl:#cdee64 iyr:2011 ecl:brn eyr:2026 hgt:176cm +byr:1985 pid:978641227 + +eyr:2029 ecl:brn hgt:173cm byr:1920 cid:211 +hcl:#866857 +iyr:2016 pid:289769625 + +hcl:#7d3b0c pid:770938833 iyr:2010 byr:1941 ecl:oth eyr:2029 hgt:161cm + +hgt:172cm iyr:2015 ecl:gry byr:1948 +eyr:2029 +pid:466359109 hcl:#341e13 + +cid:74 pid:405199325 ecl:blu +hcl:#6b5442 +eyr:1980 byr:2024 hgt:174cm iyr:2011 + +hgt:183cm pid:075760048 cid:78 byr:1960 ecl:hzl eyr:2030 hcl:#6b5442 iyr:2014 + +cid:264 hcl:#7d3b0c +ecl:blu iyr:2011 eyr:2020 hgt:182cm +byr:1929 + +pid:435338286 byr:1931 +hcl:z ecl:amb iyr:2013 hgt:73in +cid:165 eyr:2027 + +pid:511898552 eyr:2025 hgt:184cm hcl:#602927 +iyr:2018 byr:1989 ecl:hzl + +iyr:2016 +hgt:168in +hcl:#623a2f +eyr:2025 pid:310738569 ecl:#0c3039 +byr:2027 + +pid:158cm byr:1946 ecl:grt +iyr:1920 cid:189 +hcl:389bce hgt:165cm + +pid:973732906 hcl:#cfa07d iyr:2010 eyr:2020 hgt:180cm +byr:1930 +ecl:brn + +pid:930994364 byr:1967 hgt:151cm +iyr:2011 eyr:2022 + +eyr:1968 hgt:75cm cid:241 +iyr:2011 pid:5493866745 +ecl:grt +byr:1976 hcl:#a97842 + +eyr:2026 ecl:oth +iyr:2016 hcl:#c0946f +byr:1929 +hgt:175cm +pid:9421898537 + +eyr:2028 iyr:2016 byr:1962 +ecl:grn hgt:186cm hcl:#cfa07d pid:432962396 + +iyr:2010 byr:1934 eyr:2023 hgt:180cm hcl:#cfa07d ecl:gry + +cid:168 +byr:1978 +eyr:2027 hgt:189cm pid:802710287 +hcl:#2f980b iyr:2014 +ecl:grn + +eyr:1970 +pid:576329104 +ecl:xry iyr:1954 hcl:#341e13 byr:2026 +hgt:74in + +eyr:2027 hgt:153cm +ecl:oth +hcl:#866857 +pid:290407832 byr:1956 iyr:2017 + +iyr:2011 +cid:128 +ecl:amb hcl:#7d3b0c hgt:68in pid:743606119 eyr:2020 + +ecl:oth hcl:#cfa07d +byr:2016 pid:#de98ae iyr:1984 cid:194 +hgt:170cm +eyr:2034 + +pid:526098672 hgt:168cm +hcl:#7d3b0c cid:167 byr:1923 ecl:blu iyr:2016 +eyr:2030 + +pid:495569197 hcl:#866857 hgt:193cm +iyr:2013 eyr:2021 byr:1921 ecl:amb + +ecl:amb +hcl:#a97842 pid:862249915 iyr:2012 byr:1964 +cid:325 +eyr:2021 + +iyr:1958 +byr:2003 +hgt:160 hcl:#18171d +ecl:hzl eyr:2020 + +iyr:2019 byr:1997 ecl:brn +pid:342735713 hcl:#efcc98 +hgt:181cm cid:307 +eyr:2027 + +pid:817121616 eyr:2020 +iyr:2012 +hgt:185cm +hcl:#18171d byr:1969 ecl:hzl + +pid:381399203 +ecl:oth byr:1930 +iyr:2014 hcl:#6b5442 hgt:71in cid:156 eyr:2025 + +byr:2002 hcl:#18171d iyr:2017 +pid:398245854 hgt:64in ecl:gry eyr:2025 cid:127 + +eyr:2028 hcl:#341e13 +ecl:amb iyr:2012 +pid:079796480 hgt:69cm +byr:1995 + +cid:315 iyr:2028 +pid:775929239 +hgt:162cm ecl:dne byr:1940 eyr:1952 hcl:#c0946f + +iyr:2015 +hgt:154cm byr:1997 +ecl:grn +cid:125 eyr:2024 pid:834780229 +hcl:#18171d + +ecl:hzl hcl:#a97842 pid:553710574 eyr:2028 +hgt:183cm cid:196 +iyr:2014 + +pid:377912488 hgt:159cm ecl:amb eyr:2024 byr:1974 +iyr:2014 +hcl:#ceb3a1 + +eyr:2024 +byr:1947 hgt:63in ecl:brn +cid:69 +pid:185228911 hcl:#b6652a iyr:2016 + +eyr:2024 +hgt:168cm hcl:#602927 +iyr:2013 +byr:1993 +pid:681091728 ecl:gry cid:203 + +pid:037922164 iyr:2020 +byr:1990 hgt:156cm eyr:2023 hcl:#866857 +cid:97 ecl:grn + +hgt:170cm pid:980455250 +iyr:2011 ecl:hzl byr:1957 +eyr:2030 hcl:#cfa07d + +hgt:158cm +hcl:#602927 +byr:2002 ecl:hzl iyr:2013 +cid:99 +eyr:2020 pid:48646993 + +byr:1955 pid:814033843 eyr:2030 hcl:#a97842 +hgt:191cm iyr:2019 + +pid:111196491 hgt:191cm iyr:2012 ecl:blu hcl:#a97842 +eyr:2026 cid:131 byr:1979 + +hcl:#fffffd hgt:68in +cid:121 ecl:oth eyr:2024 pid:343836937 +byr:1955 +iyr:2020 + +eyr:2025 byr:1954 +pid:737517118 +cid:343 hcl:#b6652a +iyr:2017 ecl:hzl +hgt:175cm + +ecl:brn +iyr:2011 hgt:171cm cid:102 pid:066348279 byr:1981 + +ecl:oth iyr:2018 byr:1975 +eyr:2029 +hgt:185cm cid:226 +pid:978243407 hcl:#341e13 + +iyr:2015 pid:918017915 hcl:#3e52b7 +byr:1999 ecl:brn cid:314 +eyr:2025 hgt:192cm + +hcl:#19d1fa byr:1984 ecl:dne hgt:76in +iyr:2015 cid:118 pid:417075672 +eyr:2020 + +iyr:2019 +cid:120 hgt:186cm +hcl:#733820 eyr:2024 pid:423238982 ecl:brn byr:1968 + +hgt:70cm cid:173 pid:767014975 +hcl:#866857 eyr:2039 ecl:brn byr:1985 + +pid:340424924 +eyr:2027 hcl:#7d3b0c +hgt:168cm ecl:hzl iyr:2016 +byr:1994 + +ecl:hzl byr:1933 pid:580425691 +iyr:2010 hcl:#c0946f eyr:2024 +hgt:64in + +hcl:#9fe6b0 pid:913184461 ecl:grn eyr:2030 +cid:262 iyr:2014 + +ecl:amb pid:640007768 eyr:2030 byr:2017 iyr:1988 hcl:z + +byr:1977 cid:54 +eyr:1939 pid:882762394 iyr:2030 hcl:#ceb3a1 ecl:blu + +iyr:2011 hcl:#7d3b0c byr:1928 +pid:340969354 cid:199 hgt:168cm eyr:2029 ecl:hzl + +pid:729464282 +iyr:2012 hcl:baae60 +eyr:2026 ecl:hzl hgt:166cm byr:2019 + +pid:930997801 iyr:2019 eyr:2030 +hcl:#866857 ecl:oth byr:1960 cid:235 hgt:73in + +ecl:brn +byr:1988 hgt:179cm iyr:2017 +pid:864768439 cid:305 hcl:#c0946f +eyr:2029 + +hcl:#7d3b0c ecl:grn +hgt:182cm eyr:2021 pid:719891314 +byr:1920 iyr:2017 + +hgt:62cm +cid:71 ecl:brn hcl:#fffffd iyr:2025 eyr:1997 +pid:175cm byr:2022 + +hcl:#cfa07d cid:239 eyr:2025 ecl:hzl hgt:189in byr:1980 iyr:2020 +pid:703047050 + +byr:1951 +eyr:2030 +ecl:hzl +pid:130992467 hgt:157cm hcl:#341e13 + +hgt:175cm +hcl:#623a2f +cid:68 eyr:2025 +byr:2001 ecl:oth pid:253618704 iyr:2016 + +hcl:#fffffd pid:379344553 ecl:grn +eyr:2026 +hgt:72in byr:1974 iyr:2013 + +ecl:#b4e952 byr:1970 hcl:z +eyr:2039 pid:6056894636 iyr:2021 hgt:165cm +cid:328 + +hcl:#602927 iyr:2014 pid:890429537 byr:1957 hgt:68in eyr:2020 ecl:hzl + +cid:265 byr:1961 hcl:#ceb3a1 eyr:2022 iyr:2016 hgt:184cm pid:921615309 + +byr:1951 eyr:2024 +hcl:#341e13 +ecl:amb pid:414644982 +iyr:2010 hgt:159cm + +iyr:2015 cid:319 +eyr:2029 ecl:brn pid:380237898 +hcl:#efcc98 hgt:157cm byr:1972 + +pid:237156579 ecl:#312a91 +hgt:167cm iyr:2011 hcl:#c0946f eyr:2021 byr:1953 + +ecl:hzl iyr:2015 pid:10160221 eyr:2025 hgt:175cm hcl:z byr:1939 + +hgt:59in hcl:#18171d byr:1962 ecl:hzl +iyr:2019 eyr:2025 +cid:337 pid:491938615 + +ecl:utc hgt:82 pid:51674655 byr:2020 +eyr:1954 iyr:2029 hcl:z + +pid:119530189 +cid:103 +iyr:2010 byr:1979 +hgt:168cm hcl:#a97842 ecl:brn eyr:2029 + +hgt:177cm ecl:brn +byr:1990 +pid:015089628 eyr:2028 hcl:#733820 iyr:2020 + +ecl:blu iyr:2020 hgt:189cm +hcl:#efcc98 byr:1982 pid:346500376 eyr:2021 cid:160 + +ecl:brn hgt:173cm iyr:2011 cid:259 hcl:#6b5442 eyr:2026 +byr:1995 +pid:654875035 + +ecl:grn eyr:2025 pid:147155222 byr:1942 +cid:341 hcl:#602927 +hgt:165cm +iyr:2016 + +pid:543171646 +hgt:153cm +iyr:2019 hcl:#fffffd byr:1985 cid:266 +eyr:2027 +ecl:hzl + +ecl:blu +eyr:2022 +pid:667939101 byr:1974 +cid:259 hcl:#888785 + +eyr:2030 byr:2016 iyr:2022 +pid:86902982 +ecl:zzz hgt:72 hcl:ceb867 + +hcl:#fffffd +ecl:grn pid:046978329 +byr:1924 +eyr:2025 hgt:158cm iyr:2011 + +hgt:150cm eyr:2028 byr:1985 ecl:gry hcl:#866857 pid:340615189 +iyr:2017 +cid:50 + +cid:171 hcl:#18171d pid:009562218 byr:1981 hgt:175cm eyr:2024 ecl:oth iyr:2017 + +iyr:2019 +eyr:2022 +ecl:brn hcl:#cfa07d pid:050270380 cid:159 +hgt:151cm +byr:1951 + +hcl:#7d3b0c hgt:176cm iyr:2015 byr:1923 pid:348188421 ecl:blu eyr:2029 + +byr:1997 hgt:162cm eyr:2023 pid:445685977 +iyr:2012 ecl:amb hcl:#efcc98 + +iyr:2017 ecl:oth eyr:2028 pid:791977055 hgt:170cm byr:1991 +hcl:#623a2f + +byr:1998 hcl:#fffffd +eyr:2020 +ecl:gry pid:039483695 hgt:163cm iyr:2020 +cid:165 + +ecl:hzl hgt:74in iyr:2016 pid:026214321 +cid:152 hcl:#a1f179 +eyr:2036 byr:2001 + +pid:257900949 cid:80 byr:1956 iyr:2012 hgt:165cm eyr:2030 + +pid:918371363 +ecl:xry +iyr:2012 +byr:2012 hgt:65cm +eyr:2029 + +pid:041789006 iyr:2018 byr:1945 eyr:2024 ecl:blu +hcl:#5ab31e hgt:171cm + +ecl:gry +byr:1956 cid:318 iyr:2020 hcl:#623a2f +eyr:2030 pid:020576506 hgt:184cm + +hgt:173cm iyr:2025 +eyr:2023 +ecl:amb pid:958983168 hcl:#866857 byr:1935 + +byr:1974 +eyr:2040 pid:57104308 iyr:1980 hcl:z +hgt:192in cid:295 ecl:amb + +pid:180cm hcl:1109f7 eyr:2039 byr:2020 +ecl:dne hgt:189in iyr:1921 + +iyr:2013 byr:1961 +hcl:#866857 +eyr:2025 hgt:158cm ecl:gry + +ecl:brn iyr:2013 eyr:2021 pid:978650418 byr:1980 +hcl:#ceb3a1 cid:110 +hgt:166cm + +pid:864880558 ecl:hzl hcl:#c0946f byr:1955 eyr:2027 hgt:169cm iyr:2011 + +eyr:2023 hgt:191cm hcl:#866857 +pid:454509887 +ecl:grn byr:1938 iyr:2015 + +pid:793008846 eyr:2025 ecl:grn hcl:#341e13 +hgt:187cm +byr:1973 cid:224 +iyr:2013 + +hcl:#866857 eyr:2022 pid:802335395 hgt:171cm ecl:amb +iyr:2015 byr:1991 + +hcl:#888785 pid:768625886 +hgt:180cm +eyr:2026 ecl:oth cid:178 byr:1958 + +pid:921387245 cid:82 hgt:190cm hcl:#c0946f ecl:grn +iyr:2015 eyr:2023 + +pid:0704550258 hcl:1ba8f6 iyr:2010 byr:1978 cid:130 +eyr:2030 ecl:dne hgt:66cm + +pid:626293279 hcl:#7d3b0c hgt:185cm ecl:oth +eyr:2020 byr:1937 iyr:2012 + +hgt:175 +eyr:1933 ecl:gry +hcl:#7d3b0c byr:2003 pid:#5d8fcc +iyr:2012 + +eyr:2027 +byr:1927 cid:154 +ecl:gry pid:683668809 hgt:164cm +hcl:#a97842 iyr:2011 + +byr:1940 iyr:2014 hgt:172cm eyr:2024 pid:033678324 hcl:#10fded +cid:292 ecl:oth + +iyr:1970 ecl:#201515 pid:#4cd485 eyr:2034 hgt:162 +byr:2005 cid:67 +hcl:#c0946f + +cid:306 +byr:1948 +hcl:#efcc98 +eyr:2024 hgt:171cm pid:440657854 iyr:2015 ecl:brn + +hgt:172cm ecl:brn byr:1958 pid:054926969 hcl:#4b8065 iyr:2019 + +pid:45977569 ecl:amb byr:2002 hgt:71cm hcl:z iyr:1983 + +pid:811407848 hcl:#866857 cid:112 hgt:180cm byr:1986 +ecl:brn eyr:2026 + +ecl:amb +byr:1992 +cid:288 pid:417117245 hcl:#623a2f +iyr:2011 hgt:181cm +eyr:2021 + +byr:1974 hgt:192cm cid:172 +eyr:2022 +ecl:blu +hcl:#cfa07d iyr:2014 + +eyr:2024 ecl:gry +pid:874569675 byr:1960 iyr:2017 hgt:186cm +hcl:#6b5442 + +byr:1988 eyr:2024 iyr:2020 ecl:oth hcl:#866857 pid:227304269 hgt:170cm + +ecl:grn iyr:2019 byr:2002 cid:150 hcl:#efcc98 +pid:600740993 +hgt:167cm eyr:2027 + +pid:553824537 iyr:2019 ecl:blu eyr:2025 hcl:#e21269 hgt:193cm +byr:1923 + +byr:2030 iyr:2019 ecl:#cb0911 +hcl:#cfa07d hgt:74in eyr:2012 +pid:7647207386 + +cid:289 hgt:128 pid:178cm iyr:2025 ecl:#4ad977 byr:2020 eyr:2036 hcl:#efcc98 + +cid:119 hgt:150in +hcl:z +iyr:2012 +ecl:brn eyr:1975 +byr:2007 pid:#0dcd32 + +hcl:8a1ce7 pid:0434291854 +eyr:2034 iyr:2005 +hgt:62cm byr:2029 ecl:utc + +ecl:gry hcl:#ceb3a1 byr:1976 eyr:2024 iyr:2010 hgt:188cm +pid:636312902 + +hcl:#888785 byr:2027 hgt:178in iyr:2017 pid:973095872 eyr:1952 + +hgt:179cm iyr:2015 hcl:#ceb3a1 +byr:1944 pid:182079308 cid:317 +eyr:2025 ecl:hzl + +hcl:#6b5442 ecl:grn eyr:2023 hgt:71in pid:829794667 byr:2000 +iyr:2014 cid:192 + +iyr:2014 pid:096659610 hcl:#c0946f ecl:oth byr:1991 cid:180 +hgt:177cm +eyr:2023 + +byr:2017 +eyr:2036 iyr:1933 +cid:225 ecl:gmt hgt:179in +hcl:b5c44d pid:99932231 + +hcl:#18171d +hgt:187cm eyr:2023 byr:1934 cid:286 pid:878541119 iyr:2020 ecl:amb + +hgt:185cm +pid:754207134 ecl:oth eyr:2023 +hcl:#a97842 cid:313 byr:1966 +iyr:2015 + +hcl:#ceb3a1 byr:1921 eyr:2022 pid:799265846 cid:285 +hgt:67in iyr:2015 + +iyr:2011 byr:1941 +hcl:#341e13 cid:65 pid:413556937 +hgt:169cm +ecl:amb eyr:2020 + +iyr:2016 +hgt:158cm ecl:grn byr:1931 hcl:#7d3b0c + +pid:574299170 iyr:2013 byr:1961 ecl:hzl hcl:#866857 hgt:168cm eyr:2022 + +eyr:2022 pid:245416405 +iyr:2019 hgt:173cm hcl:#c0946f +ecl:brn +byr:1965 + +byr:1980 hgt:162cm ecl:brn pid:239318191 +hcl:#fffffd +cid:58 eyr:2025 iyr:2020 + +pid:892646915 +iyr:2012 hcl:#733820 byr:1991 eyr:2021 +hgt:157cm ecl:oth + +pid:310597466 eyr:2025 +hcl:#cfa07d byr:1944 iyr:2018 ecl:oth +hgt:183cm + +iyr:2010 hgt:187cm ecl:oth +pid:975763328 +hcl:#866857 eyr:2023 cid:283 byr:1997 + +iyr:2020 cid:225 hcl:#efcc98 pid:424680047 ecl:blu +hgt:154cm +byr:1968 eyr:2027 + +ecl:oth eyr:2020 hgt:183cm hcl:#623a2f +pid:771851807 +byr:1990 +iyr:2017 + +hcl:#efcc98 ecl:blu byr:1991 hgt:191cm pid:266021118 +cid:124 +eyr:2025 + +byr:1993 +ecl:hzl eyr:2020 +hgt:163cm +iyr:2015 pid:831538073 hcl:#18171d + +hgt:74in hcl:#420afb eyr:2028 +ecl:grn pid:264469103 +byr:1993 + +eyr:2020 +cid:79 +byr:1972 +pid:084953331 hcl:#a97842 ecl:brn iyr:2010 +hgt:170cm + +iyr:2014 ecl:gry pid:094812116 eyr:2026 hgt:190cm byr:1965 hcl:#944667 + +hcl:#fffffd byr:1953 iyr:2014 ecl:hzl hgt:164cm +cid:123 eyr:2023 pid:546394433 + +iyr:2012 hgt:155cm byr:1998 pid:#2c9be6 eyr:2023 hcl:#ceb3a1 ecl:gry + +eyr:2029 ecl:gry pid:752489331 iyr:2015 hgt:167cm hcl:#18171d cid:70 byr:2002 + +byr:1938 +ecl:gry +pid:764937909 iyr:2014 +hcl:#7d3b0c +eyr:2022 cid:145 hgt:184cm + +cid:340 +byr:1924 hgt:169cm eyr:2026 +iyr:2013 ecl:amb +pid:499844992 hcl:#18171d + +pid:838417672 hgt:175cm +ecl:grt iyr:2017 eyr:2025 hcl:17aa1a + +eyr:2020 +byr:1925 hcl:#341e13 +ecl:brn cid:342 pid:047426814 hgt:156cm iyr:2012 + +iyr:2011 hcl:#341e13 byr:1959 +ecl:amb pid:969679865 + +byr:1978 cid:320 hgt:180cm hcl:#435ceb pid:363518544 eyr:2023 iyr:2016 ecl:blu + +iyr:2010 eyr:2028 +pid:183cm byr:1948 +ecl:oth cid:133 +hcl:#8d3298 hgt:190cm + +hcl:#6b5442 byr:1929 iyr:2019 pid:207713865 eyr:2029 +hgt:166cm ecl:gry + +ecl:blu iyr:2019 +byr:1985 eyr:2030 hcl:#866857 hgt:155cm pid:659180287 + +ecl:hzl +eyr:2020 iyr:2016 pid:440624039 +cid:147 +hgt:61in byr:1976 hcl:#733820 + +hcl:#341e13 pid:178082907 eyr:2023 +iyr:2015 byr:1956 +ecl:amb hgt:163cm + +eyr:2023 +iyr:2011 hcl:#cfa07d hgt:164cm +pid:291621559 byr:1960 ecl:gry + +hcl:#efcc98 byr:1976 +iyr:2017 pid:394566091 cid:248 +hgt:176cm ecl:hzl eyr:2026 + +iyr:2013 eyr:2029 hgt:152cm ecl:gry byr:1984 hcl:#623a2f pid:511780941 + +pid:953716819 iyr:2010 hgt:156cm ecl:amb +byr:1947 +hcl:#18171d eyr:2025 + +eyr:2025 ecl:amb +iyr:2016 +hcl:#cfa07d byr:1925 pid:322787273 hgt:168cm + +hgt:59in iyr:2012 +pid:916978929 byr:1959 +hcl:#c0946f eyr:2021 +ecl:brn + +byr:2018 eyr:1929 hgt:187in +hcl:z +iyr:2003 pid:0377361331 ecl:utc + +byr:1949 hcl:#fffffd pid:071791776 eyr:2030 iyr:2015 hgt:71in ecl:hzl + +hcl:#341e13 +hgt:154cm byr:1927 eyr:2023 ecl:blu iyr:2017 +pid:639867283 + +hcl:z pid:315276249 byr:2026 +hgt:151cm +iyr:2028 eyr:2020 +ecl:hzl + +hcl:#341e13 eyr:2027 byr:1981 cid:342 pid:999898177 hgt:187cm +ecl:blu iyr:2011 + +byr:2009 +hgt:73cm iyr:1921 hcl:z +pid:181cm +ecl:xry + +ecl:hzl +byr:1925 +pid:034183103 hcl:#341e13 hgt:158cm eyr:2029 iyr:2010 + +byr:1976 +iyr:2011 hgt:177cm pid:833479839 hcl:#dcab9d ecl:blu eyr:2020 + +cid:230 hcl:#7d3b0c byr:1954 +iyr:2014 eyr:2026 pid:122150889 +ecl:brn hgt:182cm + +hcl:#a97842 +ecl:brn hgt:187cm +eyr:2028 +pid:427631634 iyr:2002 byr:2004 + +pid:912516995 ecl:hzl iyr:2017 hcl:#ceb3a1 byr:1929 eyr:2028 +hgt:155cm + +pid:019809181 +cid:128 iyr:2013 hcl:#f5b9f7 byr:1931 +hgt:161cm +ecl:amb + +hgt:64in byr:1924 +iyr:2016 eyr:2029 ecl:hzl pid:474940085 hcl:#c0946f + +pid:172419213 +ecl:grn +hgt:193cm iyr:2010 byr:1973 hcl:#6b5442 +eyr:2027 + +ecl:#7b5cfd iyr:2019 +byr:2016 +eyr:2040 hgt:191in +cid:187 hcl:z pid:#c61084 + +eyr:2032 iyr:2014 pid:430247344 byr:1967 +hcl:#ceb3a1 +cid:241 +ecl:brn hgt:178in + +hcl:#623a2f iyr:2017 cid:235 +eyr:2020 byr:1978 ecl:blu hgt:175cm + +iyr:2013 ecl:amb hgt:174cm hcl:#866857 pid:285533942 byr:1954 + +hgt:152cm ecl:blu pid:952587262 eyr:2024 +iyr:2019 cid:268 hcl:#602927 byr:1947 + +hgt:176in cid:245 byr:2011 iyr:2018 +eyr:1987 +hcl:z +pid:346518170 +ecl:utc + +hgt:180cm +iyr:2015 ecl:brn eyr:2027 pid:807494368 cid:324 byr:1980 + +byr:1936 hcl:#866857 ecl:blu +eyr:2021 hgt:187cm +iyr:2016 pid:244556968 + +byr:1950 cid:125 +iyr:2020 hgt:168cm hcl:#c0946f eyr:2030 pid:758313758 ecl:blu + +eyr:2021 +pid:618915663 hcl:#cfa07d iyr:2018 byr:2002 +hgt:157cm ecl:blu + +byr:1967 +ecl:brn hcl:#c0946f pid:200495802 eyr:2021 iyr:2020 +cid:335 +hgt:181cm + +byr:1996 +ecl:brn iyr:2015 +eyr:2030 +hcl:#fffffd cid:207 +pid:022460311 hgt:158cm + +eyr:2022 hgt:59cm iyr:2023 +byr:1974 pid:354098699 hcl:b244f7 +ecl:#219505 + +hcl:#866857 eyr:2025 +pid:370874666 +byr:1947 +cid:162 ecl:oth hgt:186cm iyr:2011 + +ecl:hzl eyr:2029 +byr:1981 +iyr:2012 pid:433430792 cid:252 +hgt:171cm + +pid:512473844 hgt:186cm iyr:2012 eyr:2028 byr:1949 ecl:hzl hcl:#18171d + +hgt:60cm iyr:1934 +ecl:#4a4017 pid:3067366202 hcl:1161df +eyr:1938 byr:2008 + +pid:119509757 hcl:#cfa07d eyr:2022 hgt:174cm byr:1983 +iyr:2015 +ecl:blu + +byr:1955 eyr:2023 +cid:114 +hcl:f1aa8a pid:609049659 ecl:grn hgt:177cm +iyr:2015 + +eyr:2027 cid:284 +pid:654627982 byr:1964 iyr:2018 hgt:168cm +hcl:#fffffd ecl:oth + +iyr:1988 +hgt:191cm hcl:b87a62 byr:1990 ecl:xry +pid:996624367 eyr:1960 + +pid:641466821 eyr:2028 hcl:#7d3b0c +iyr:2010 hgt:175cm ecl:gry + +hcl:#b6652a +ecl:oth +byr:1926 eyr:2030 iyr:2019 hgt:183cm +pid:057196056 + +iyr:2017 +eyr:2022 pid:936841429 +ecl:blu hcl:#6b5442 cid:179 byr:1927 hgt:161cm + +eyr:2021 +cid:289 hgt:174cm iyr:2013 +ecl:grn pid:329574701 byr:1970 + +eyr:2021 byr:1939 ecl:gry pid:933505139 iyr:2014 hgt:173cm hcl:#7d3b0c + +cid:116 hcl:045bff eyr:2030 iyr:1920 +ecl:brn +byr:2030 +pid:#38f7f3 +hgt:155in + +eyr:2028 +pid:225829241 byr:1928 hcl:#cfa07d iyr:2019 +ecl:oth +hgt:166cm + +cid:80 byr:1936 +iyr:2017 +hgt:94 hcl:#2e7503 ecl:oth eyr:2030 +pid:597284996 + +ecl:oth +iyr:2019 hgt:76in +byr:1956 pid:821874039 + +eyr:2026 hgt:168cm +pid:019015588 +iyr:2010 +ecl:amb byr:2009 hcl:#623a2f cid:159 + +iyr:1980 hgt:167in +pid:380644909 eyr:1966 ecl:blu byr:2004 hcl:z + +eyr:2020 iyr:2013 +hcl:#08ad66 pid:540886868 +ecl:oth byr:1980 hgt:158cm + +eyr:2026 hgt:186cm byr:1995 +cid:275 +hcl:z iyr:1958 ecl:blu + +eyr:2026 iyr:2012 +hgt:61in byr:1936 pid:390833536 cid:298 ecl:grn hcl:#623a2f + +pid:393878498 eyr:2023 ecl:gry byr:1943 iyr:2010 hcl:#888785 hgt:158cm + +hgt:191cm cid:197 iyr:2014 byr:1945 +hcl:#fffffd +eyr:2020 +pid:183948344 ecl:amb + +ecl:gmt hgt:88 +cid:260 iyr:2024 byr:2022 eyr:2031 hcl:z pid:#532c6e + +hcl:#a97842 +hgt:160cm eyr:2024 ecl:blu iyr:2015 byr:1970 + +byr:1964 hgt:178cm +eyr:2025 +pid:813643223 ecl:brn iyr:2014 +hcl:#ceb3a1 + +byr:1965 eyr:2024 iyr:2018 +hgt:165cm hcl:#18171d ecl:grn pid:475669993 + +hgt:116 +iyr:2024 eyr:1974 hcl:504345 byr:2010 cid:206 pid:166cm ecl:zzz + +iyr:2014 eyr:2020 pid:096460673 byr:1948 +hgt:153cm +ecl:blu hcl:#341e13 + +hcl:#ceb3a1 +iyr:2017 hgt:67cm +pid:178cm byr:2028 ecl:brn +cid:293 + +hgt:157cm +hcl:#602927 byr:1941 +iyr:2012 pid:611003211 eyr:2029 + +iyr:2019 byr:2000 pid:083917767 eyr:2024 hgt:172cm +cid:248 hcl:#7e4d15 + +byr:1946 +hgt:160cm iyr:2020 hcl:#559278 pid:989139577 +ecl:amb eyr:2020 + +pid:165cm byr:1927 cid:178 hcl:#733820 iyr:2017 hgt:156in +eyr:2029 ecl:brn + +hcl:#18171d hgt:163cm eyr:2022 byr:1962 pid:639124940 cid:258 ecl:hzl +iyr:2015 + +cid:123 pid:4542006033 +eyr:1987 byr:2010 iyr:2029 ecl:amb +hgt:191cm hcl:#18171d + +hcl:z +byr:1928 iyr:1965 +eyr:2022 hgt:75 ecl:oth pid:400765046 + +hcl:#c0946f hgt:62in +ecl:blu byr:1978 iyr:1923 +cid:260 eyr:2021 pid:404628742 + +pid:#bf1611 ecl:grn +iyr:2018 cid:146 byr:1948 +eyr:2025 hcl:#fffffd hgt:87 + +pid:767547618 +iyr:2018 hcl:#b6652a eyr:2029 hgt:165cm ecl:hzl byr:1937 + +ecl:blu iyr:2019 pid:960083875 eyr:2027 hgt:71in hcl:#c0946f +byr:1921 + +iyr:2011 +pid:9562042482 +hcl:z hgt:59cm +eyr:1994 cid:258 ecl:#6c1bcc byr:2025 + +eyr:2028 pid:494999718 byr:1928 hgt:176cm +iyr:2015 ecl:oth hcl:#733820 + +cid:78 eyr:2020 hgt:160cm byr:1947 ecl:blu +hcl:#b6652a iyr:2016 pid:069457741 + +hcl:#6b5442 iyr:2010 +byr:1971 +eyr:2028 hgt:169cm ecl:brn pid:528961949 + +eyr:2028 +hcl:#7d3b0c +byr:1952 +ecl:hzl +cid:317 iyr:2016 +pid:832169844 + +hcl:#c0946f +ecl:brn +iyr:2017 eyr:2028 +pid:161390075 byr:1993 cid:50 +hgt:171cm + +ecl:#ae12d3 hgt:74cm cid:239 hcl:z pid:345439730 iyr:1924 byr:2029 eyr:2031 diff --git a/src/day4/main.zig b/src/day4/main.zig @@ -0,0 +1,100 @@ +const std = @import("std"); +const aoc = @import("aoc"); + +fn intChecker( + comptime min: u32, + comptime max: u32, + comptime len: ?u32, + comptime suffix: ?[]const u8, +) fn ([]const u8) bool { + const impl = struct { + fn check(input: []const u8) bool { + var parsed = input; + if (suffix) |suf| { + if (!std.mem.eql(u8, suf, input[(input.len - suf.len)..])) + return false; + parsed = input[0..(input.len - suf.len)]; + } + if (len != null and parsed.len != len.?) + return false; + const val = std.fmt.parseInt(u32, parsed, 10) catch |x| { + return false; + }; + return (val >= min and val <= max); + } + }; + return impl.check; +} + +fn combineOr( + comptime f1: fn ([]const u8) bool, + comptime f2: fn ([]const u8) bool, +) fn ([]const u8) bool { + const impl = struct { + fn check(input: []const u8) bool { + return f1(input) or f2(input); + } + }; + return impl.check; +} + +fn isColorStr(input: []const u8) bool { + if (input.len != 7) return false; + _ = std.fmt.parseInt(u32, input[1..], 16) catch |x| { + return false; + }; + return input[0] == '#'; +} + +fn isEyeColor(input: []const u8) bool { + const valids = "amb blu brn gry grn hzl oth"; + return std.mem.indexOf(u8, valids[0..], input) != null; +} + +fn countValids(allocator: *std.mem.Allocator, input: []u8, validate: bool) !u16 { + var entryit = std.mem.split(input, "\n\n"); + const required_keys = [_][]const u8{ "byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid", "cid" }; + const validation_funcs = [required_keys.len]?fn ([]const u8) bool{ + intChecker(1920, 2002, 4, null), + intChecker(2010, 2020, 4, null), + intChecker(2020, 2030, 4, null), + combineOr(comptime intChecker(150, 193, 3, "cm"), comptime intChecker(59, 76, 2, "in")), + isColorStr, + isEyeColor, + intChecker(0, 999999999, 9, null), + null, + }; + var count: u16 = 0; + entryloop: while (entryit.next()) |entry| { + const key_mask = [required_keys.len]u8{ 1, 1, 1, 1, 1, 1, 1, 'X' }; + var present = [required_keys.len]u1{ 0, 0, 0, 0, 0, 0, 0, 0 }; + var partit = std.mem.tokenize(entry, ": \n"); + while (partit.next()) |key| { + const value = partit.next().?; + for (required_keys) |ckey, i| { + if (std.mem.eql(u8, key, ckey)) { + if (validate and validation_funcs[i] != null) { + if (!validation_funcs[i].?(value)) continue :entryloop; + } + present[i] = 1; + } + } + } + for (key_mask) |k, i| { + if (key_mask[i] != 'X' and present[i] != key_mask[i]) + continue :entryloop; + } + count += 1; + } + return count; +} + +fn part1(allocator: *std.mem.Allocator, input: []u8, args: [][]u8) !void { + std.debug.print("{}\n", .{try countValids(allocator, input, false)}); +} + +fn part2(allocator: *std.mem.Allocator, input: []u8, args: [][]u8) !void { + std.debug.print("{}\n", .{try countValids(allocator, input, true)}); +} + +pub const main = aoc.gen_main(part1, part2); diff --git a/src/day4/part1 b/src/day4/part1 @@ -0,0 +1,47 @@ +--- Day 4: Passport Processing --- + +You arrive at the airport only to realize that you grabbed your North Pole Credentials instead of +your passport. While these documents are extremely similar, North Pole Credentials aren't issued by +a country and therefore aren't actually valid documentation for travel in most of the world. + +It seems like you're not the only one having problems, though; a very long line has formed for the +automatic passport scanners, and the delay could upset your travel itinerary. + +Due to some questionable network security, you realize you might be able to solve both of these +problems at the same time. + +The automatic passport scanners are slow because they're having trouble detecting which +passports have all required fields. The expected fields are as follows: + +- byr (Birth Year) - iyr (Issue Year) - eyr (Expiration Year) - hgt (Height) - hcl (Hair Color) - +ecl (Eye Color) - pid (Passport ID) - cid (Country ID) + +Passport data is validated in batch files (your puzzle input). Each passport is represented as a +sequence of key:value pairs separated by spaces or newlines. Passports are separated by blank lines. + +Here is an example batch file containing four passports: + +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 + +The first passport is valid - all eight fields are present. The second passport is +invalid - it is missing hgt (the Height field). + +The third passport is interesting; the only missing field is cid, so it looks like data +from North Pole Credentials, not a passport at all! Surely, nobody would mind if you made the system +temporarily ignore missing cid fields. Treat this "passport" as valid. + +The fourth passport is missing two fields, cid and byr. Missing cid is fine, but missing any other +field is not, so this passport is invalid. + +According to the above rules, your improved system would report 2 valid passports. + +Count the number of valid passports - those that have all required fields. Treat cid as +optional. In your batch file, how many passports are valid? + + diff --git a/src/day4/part2 b/src/day4/part2 @@ -0,0 +1,57 @@ +--- Part Two --- + +The line is moving more quickly now, but you overhear airport security talking about how passports +with invalid data are getting through. Better add some data validation, quick! + +You can continue to ignore the cid field, but each other field has strict rules about what values +are valid for automatic validation: + +- byr (Birth Year) - four digits; at least 1920 and at most 2002. - iyr (Issue Year) - four digits; +at least 2010 and at most 2020. - eyr (Expiration Year) - four digits; at least 2020 and at most +2030. - hgt (Height) - a number followed by either cm or in: - If cm, the number must be at least +150 and at most 193. - If in, the number must be at least 59 and at most 76. + + + +- hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. - ecl (Eye Color) - exactly +one of: amb blu brn gry grn hzl oth. - pid (Passport ID) - a nine-digit number, including leading +zeroes. - cid (Country ID) - ignored, missing or not. + +Your job is to count the passports where all required fields are both present and +valid according to the above rules. Here are some example values: + +byr valid: 2002 byr invalid: 2003 + +hgt valid: 60in hgt valid: 190cm hgt invalid: 190in hgt invalid: 190 + +hcl valid: #123abc hcl invalid: #123abz hcl invalid: 123abc + +ecl valid: brn ecl invalid: wat + +pid valid: 000000001 pid invalid: 0123456789 + +Here are some invalid passports: + +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 + +Here are some valid passports: + +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 + +Count the number of valid passports - those that have all required fields and +valid values. Continue to treat cid as optional. In your batch file, how many passports +are valid? + +