commit d7bec1fe5e6d30890a9de21a4bc012c78bb8a226
parent fc7bffb0279093722e5c619fc19629f41410580e
Author: Louis Burda <quent.burda@gmail.com>
Date: Sat, 5 Dec 2020 09:39:11 +0100
Day 4
Diffstat:
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 [1m[37mdetecting which
+passports have all required fields[0m. 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 [1m[37mvalid[0m - all eight fields are present. The second passport is
+[1m[37minvalid[0m - it is missing hgt (the Height field).
+
+The third passport is interesting; the [1m[37monly missing field[0m 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 [1m[37mvalid[0m.
+
+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 [1m[37minvalid[0m.
+
+According to the above rules, your improved system would report [1m[37m2[0m valid passports.
+
+Count the number of [1m[37mvalid[0m passports - those that have all required fields. Treat cid as
+optional. [1m[37mIn your batch file, how many passports are valid?[0m
+
+
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 [1m[37mpresent[0m and
+[1m[37mvalid[0m 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 [1m[37mvalid[0m passports - those that have all required fields [1m[37mand
+valid values[0m. Continue to treat cid as optional. [1m[37mIn your batch file, how many passports
+are valid?[0m
+
+