diff --git a/04input.txt b/04input.txt
new file mode 100644
index 0000000..5fbd50e
--- /dev/null
+++ b/04input.txt
@@ -0,0 +1,1104 @@
+eyr:2033
+hgt:177cm pid:173cm
+ecl:utc byr:2029 hcl:#efcc98 iyr:2023
+
+pid:337605855 cid:249 byr:1952 hgt:155cm
+ecl:grn iyr:2017 eyr:2026 hcl:#866857
+
+cid:242 iyr:2011 pid:953198122 eyr:2029 ecl:blu hcl:#888785
+
+hgt:173cm hcl:#341e13
+cid:341
+pid:112086592
+iyr:2012 byr:2011 ecl:amb
+eyr:2030
+
+pid:790332032
+iyr:2019
+eyr:2023 byr:1969 ecl:brn
+hgt:163cm
+hcl:#623a2f
+
+byr:1920 eyr:2023 cid:146 pid:890112986 hgt:171cm hcl:#b6652a iyr:2017 ecl:hzl
+
+hcl:#c0946f byr:1967 cid:199 ecl:gry
+iyr:2012 pid:987409259 hgt:157cm eyr:2021
+
+pid:316587303 iyr:2016 eyr:2023 ecl:blu byr:1959 hgt:186cm hcl:#733820
+
+hcl:#fffffd hgt:152cm byr:1996 ecl:gry eyr:2024
+
+ecl:brn hgt:185cm
+pid:648491325 byr:1967
+hcl:#172f67 iyr:2014
+eyr:2028
+
+pid:328737320 iyr:2017 hcl:#fffffd hgt:178
+ecl:#35fad5
+byr:1959
+
+iyr:2010 byr:1943 eyr:2028
+hgt:178cm hcl:#888785 pid:572750267
+
+cid:175 ecl:brn eyr:2026 iyr:2017
+hcl:#5d69b9 byr:1998 pid:289515215
+hgt:151cm
+
+hgt:182cm
+ecl:blu eyr:2028 iyr:2011 hcl:#a97842 pid:758494126
+
+iyr:2023
+hgt:174cm hcl:cafc2f
+ecl:utc
+cid:299 eyr:2026 pid:57963956
+
+pid:853993893 ecl:blu hgt:188cm cid:294 hcl:#341e13 byr:1975
+eyr:2027 iyr:2015
+
+ecl:amb hgt:70 iyr:2018 pid:241872490
+byr:1962
+eyr:2024 hcl:c5f0c3
+
+pid:994754974 eyr:2029 iyr:2017
+cid:137 byr:1966 hcl:#733820 ecl:blu
+
+ecl:utc
+pid:937481632 hgt:190
+eyr:2025 iyr:2027 byr:1949 cid:84 hcl:d3f4f5
+
+cid:129 ecl:brn hgt:91 eyr:1932
+iyr:2020 pid:298540404 hcl:#888785 byr:1986
+
+pid:416051368 eyr:2020 iyr:2011
+hgt:93 byr:2023 hcl:#efcc98
+ecl:amb
+
+byr:2010 hgt:181cm
+iyr:2020
+eyr:2040 pid:785862801 ecl:#f84ccd
+
+hgt:152cm iyr:2013 pid:932020343 eyr:2023 ecl:hzl byr:1920
+hcl:#fffffd
+
+hgt:152cm
+iyr:2020 byr:1993 hcl:#18171d pid:120354938
+eyr:2021 ecl:gry
+
+eyr:2025 byr:1996
+hcl:#623a2f
+iyr:2018 ecl:oth cid:177 pid:904738945 hgt:164cm
+
+pid:45042993
+hgt:193 iyr:2018 byr:2026 eyr:2026
+hcl:#623a2f cid:175 ecl:brn
+
+byr:1956 ecl:hzl iyr:2020 pid:892810672 hgt:164cm eyr:2021 cid:186 hcl:#efcc98
+
+cid:314 hgt:180cm
+ecl:amb hcl:#602927 byr:2027
+iyr:1958
+eyr:2020 pid:#b2b732
+
+cid:50
+hcl:#a97842
+hgt:155cm pid:667716485 ecl:gry iyr:2014 byr:1995 eyr:2029
+
+eyr:2030
+pid:783631610
+hgt:74
+byr:2014 hcl:z iyr:2003 ecl:grt
+
+ecl:#d4d852 iyr:2029 hcl:z hgt:185in
+eyr:2034 pid:#526166
+
+iyr:1946 eyr:1957 byr:1941 pid:632690435 ecl:oth hcl:18a37c hgt:59cm
+
+iyr:2013
+eyr:2026 pid:002380966 cid:95
+hcl:#623a2f byr:1965 ecl:oth
+
+ecl:gry pid:479214778 hcl:#18171d
+byr:1928 cid:98 eyr:2020 iyr:2019 hgt:163cm
+
+hcl:#bd0f54 cid:225 eyr:2024 hgt:153cm iyr:2020
+byr:1956 pid:048565668 ecl:hzl
+
+ecl:#5d8b3b hgt:156cm eyr:2029 pid:#3df0cc byr:1967 cid:118 hcl:e23f0f
+
+pid:437721309
+hcl:#cfa07d hgt:181cm iyr:2019 cid:224 eyr:2028 byr:1946
+ecl:gry
+
+byr:1962
+eyr:2023
+hgt:182cm
+pid:733248003 ecl:blu
+iyr:2014 hcl:#efcc98
+
+byr:1966 hgt:158cm
+eyr:2029 hcl:#602927 iyr:2013
+pid:963663665
+
+pid:529595074 byr:1940 eyr:2020 hcl:#c0946f cid:113 iyr:2015 ecl:oth
+hgt:191cm
+
+ecl:hzl
+hcl:#a97842
+hgt:157cm eyr:2025 iyr:2015 byr:1978 pid:579525362
+
+ecl:oth hcl:#18171d cid:76 iyr:2011 eyr:2021
+byr:1953 hgt:173cm pid:976483712
+
+ecl:brn hcl:#fffffd cid:242 pid:588299934
+hgt:69in byr:1947
+iyr:2010 eyr:2030
+
+hcl:#fffffd ecl:gry cid:93
+pid:731904973 byr:1939 eyr:2029 iyr:2016
+
+pid:96716037 iyr:1938 eyr:2032
+hgt:192 ecl:gmt byr:2029 hcl:02edc5
+
+byr:1958
+iyr:2011 eyr:2029 ecl:gry
+pid:526931024
+hcl:z
+hgt:59cm
+
+byr:1966 ecl:hzl
+pid:378066668 hcl:#c0946f
+iyr:2017 eyr:2026 cid:142 hgt:184cm
+
+pid:1134356373
+iyr:2019
+ecl:grn
+hcl:#ceb3a1 byr:1950
+hgt:154in
+
+hgt:157cm ecl:zzz byr:1976
+pid:5047305958
+iyr:2013 hcl:#341e13
+
+eyr:2024
+hcl:#a97842 hgt:179cm pid:543943316 cid:214 ecl:brn
+byr:1999
+iyr:2017
+
+byr:1983 eyr:2024 hgt:177cm
+ecl:hzl
+iyr:2013 pid:328883228 hcl:#ceb3a1
+
+cid:226 pid:262286178 iyr:2010 ecl:grn byr:1962 eyr:2025 hcl:#efcc98
+hgt:60in
+
+iyr:2029 ecl:#559ffe hcl:z
+cid:156
+byr:2003
+hgt:178
+pid:93994500
+
+iyr:2026 hcl:#eda7f3 ecl:amb
+byr:1921 eyr:2021 pid:153cm
+
+byr:1988
+ecl:amb hgt:178cm hcl:#2aea45
+pid:70722502 eyr:2027 iyr:2015
+
+pid:555636800 eyr:2020 hgt:182cm iyr:2019 byr:1948 cid:325
+hcl:#733820
+
+eyr:1973
+iyr:2024 hcl:z byr:2028 ecl:dne cid:169
+pid:43596015 hgt:170in
+
+hcl:#b6652a ecl:gry
+cid:264
+hgt:178cm iyr:2027 pid:23042405 byr:1947 eyr:2024
+
+byr:1989
+pid:266274644 ecl:blu eyr:2023 hcl:#733820
+hgt:192cm iyr:2018 cid:272
+
+iyr:2013 hcl:z hgt:73cm byr:2014 pid:192cm ecl:#1627a7
+
+pid:816749378 hgt:178cm
+hcl:#733820 eyr:2029
+byr:1993
+
+hcl:0cacc5 byr:1944 iyr:2028 eyr:2024 hgt:163in pid:74169361
+ecl:dne
+
+hcl:#ceb3a1
+ecl:grn
+eyr:2027 pid:481186415 hgt:176cm cid:325
+byr:1986
+
+eyr:2028 hgt:174cm ecl:brn
+hcl:#888785 iyr:2015 pid:064161451 byr:1969
+
+ecl:brn cid:323 hgt:167
+byr:1993 iyr:1953
+hcl:z eyr:2023 pid:161542750
+
+ecl:#895336 eyr:2033 hgt:67cm cid:254 iyr:1967 hcl:z byr:1954
+
+ecl:#9dbea3 iyr:2018 eyr:2035
+hgt:183
+pid:747501524 hcl:#fd8515 cid:110
+byr:1997
+
+ecl:utc
+iyr:2014 hgt:183in byr:2007 eyr:2026 hcl:#cfa07d
+cid:334
+
+ecl:gry hcl:#b6652a pid:250420128
+eyr:2024 byr:1939 hgt:170cm
+
+hcl:#18171d eyr:2030 byr:1925 pid:204206116
+iyr:2014 hgt:174cm ecl:hzl
+
+iyr:2020 hcl:#efcc98
+pid:393444692
+ecl:oth hgt:152cm byr:1957 eyr:2021
+
+byr:1973 eyr:2024 iyr:2014 hcl:#602927
+pid:832320186 hgt:166cm ecl:grn
+
+pid:192524664 hgt:182cm
+hcl:#18171d
+ecl:oth eyr:2030 byr:1942 iyr:2013
+
+hgt:129 byr:2016 hcl:6734a1 ecl:#915282 iyr:1949 cid:130 pid:677408864 eyr:2030
+
+eyr:2028 ecl:gry hgt:171cm byr:1960 iyr:2020 pid:688526729 cid:262 hcl:#733820
+
+ecl:grn iyr:2019 pid:775867641 hcl:#bf1e29
+byr:1920 hgt:163cm
+
+eyr:2029 hcl:#866857
+iyr:2024
+pid:170cm byr:1931
+hgt:177cm ecl:hzl cid:312
+
+iyr:2019 ecl:#19fef5 pid:2080468234
+eyr:2008 hgt:72
+hcl:e14dfe
+byr:1980 cid:272
+
+byr:2025
+cid:163
+iyr:2020 pid:758946748 hgt:161cm
+ecl:amb eyr:2023 hcl:026d4d
+
+iyr:2021 cid:109
+eyr:2032 byr:2010
+hcl:#fffffd pid:874586711 ecl:hzl hgt:142
+
+eyr:2023
+hcl:z iyr:2019 byr:2013 ecl:#b42611 pid:164cm hgt:60cm
+
+byr:1935 cid:226 hcl:#602927 ecl:blu pid:700452129 eyr:2029
+iyr:2016 hgt:180cm
+
+hgt:179cm
+pid:181cm
+ecl:gry cid:309
+eyr:2029
+hcl:#6b5442
+byr:1987
+iyr:2010
+
+ecl:gry byr:1986 hcl:#cce4b8
+pid:101583943 iyr:2010 hgt:65cm eyr:2021
+
+cid:168
+pid:#8556c9 hcl:413944 eyr:2036 byr:2013 iyr:2012
+ecl:#66dc1c hgt:59cm
+
+eyr:1984 byr:2017 pid:#cbc84e hcl:z
+cid:189 iyr:2021 ecl:blu
+hgt:152cm
+
+byr:1993 hcl:#004c11 eyr:2026
+iyr:2010
+ecl:brn hgt:188cm
+pid:889959941
+
+hgt:172 byr:2008 eyr:2030 iyr:1959
+ecl:oth hcl:#a8ebbb
+
+iyr:2013 hcl:#8f97b1 hgt:182cm ecl:grn cid:89
+eyr:2029
+byr:1974
+
+eyr:2025 hcl:#6b5442 pid:222418968 byr:1951 cid:105 ecl:hzl iyr:2011 hgt:181cm
+
+iyr:2017
+ecl:brn pid:481721303 hgt:190cm
+eyr:2037 byr:1990 hcl:#ceb3a1
+
+hcl:z
+pid:85905429
+byr:1923 cid:260
+eyr:2031 ecl:gry
+iyr:2022 hgt:180cm
+
+hcl:#fffffd hgt:76cm
+ecl:grn
+pid:39254112 byr:2010 iyr:1961 eyr:2028
+
+ecl:brn iyr:2016
+eyr:2027 hcl:#efcc98 pid:753268957 hgt:60in byr:1943
+
+ecl:oth
+pid:087762106 hgt:190cm
+byr:1974 cid:171 hcl:#c63f21
+eyr:2020
+
+ecl:#8c1b6c
+byr:1962 iyr:2007 pid:106672731
+hgt:172in cid:239 eyr:2026 hcl:#b6652a
+
+hgt:170cm eyr:2021
+cid:219 hcl:#a97842 pid:040224991 byr:1950 iyr:2018
+
+byr:2029
+eyr:2036 cid:309
+iyr:2016 hgt:167cm hcl:#fffffd
+ecl:#1ab23b
+
+iyr:2013 ecl:gry eyr:2020 pid:947828194
+hcl:#18171d hgt:163cm byr:1971
+
+hcl:#fffffd iyr:2011
+pid:150105713 eyr:2029
+hgt:168cm byr:1925 ecl:hzl
+
+cid:253
+hcl:#341e13
+eyr:2025 hgt:184cm
+pid:651786830 byr:1936 iyr:2013
+ecl:hzl
+
+pid:7328393469
+hgt:175cm ecl:gry iyr:2012 byr:1963 hcl:#623a2f eyr:2026
+
+eyr:2029 pid:669044398 hgt:161cm hcl:#cfa07d ecl:gry iyr:2018
+
+pid:920006222 byr:1941 ecl:grn eyr:2027 cid:87 hcl:#733820
+iyr:2018 hgt:171cm
+
+byr:1964 hgt:157cm hcl:#a97842
+pid:756972774 eyr:2024 iyr:2013 ecl:gry
+
+iyr:2010 cid:279
+hgt:189cm byr:1959
+ecl:brn eyr:2022 pid:937686753 hcl:#602927
+
+iyr:2013
+eyr:2027 cid:223 pid:145547438
+hcl:#6e6f47 hgt:165cm ecl:amb
+
+byr:2009
+ecl:oth hcl:#623a2f
+hgt:166cm eyr:2034 pid:120339592
+iyr:2012
+
+eyr:2026 hcl:z byr:2018 pid:7809314464 iyr:2012 hgt:158cm ecl:hzl
+
+cid:291 hgt:168
+ecl:#7734de iyr:2021 hcl:5b4ef1 pid:3381158334 eyr:1956 byr:2003
+
+iyr:2015 hcl:#cfa07d
+byr:1971 eyr:2023
+ecl:oth pid:560419063 cid:155 hgt:170cm
+
+eyr:2021 hgt:189cm iyr:2014 hcl:#6b5442 ecl:brn cid:287
+byr:1951 pid:936881112
+
+iyr:2013
+eyr:2020 ecl:hzl hgt:150cm cid:210
+pid:032458640 byr:1920 hcl:#6b5442
+
+hgt:180cm hcl:#cfa07d ecl:grn eyr:2027
+pid:140859202 iyr:2014 cid:232
+byr:1932
+
+pid:68300657 byr:1988 hgt:181cm
+ecl:hzl iyr:1951 hcl:e18469
+eyr:2013
+
+pid:157572693 hgt:185cm
+hcl:#065fe8 ecl:gry eyr:2027
+iyr:2014
+
+eyr:2029 hgt:164cm hcl:z ecl:grn cid:270 iyr:2019 byr:1993 pid:338068138
+
+iyr:2016 cid:131 byr:1990 hcl:#7d3b0c ecl:grn pid:066023454 hgt:154cm
+eyr:2025
+
+iyr:2019 eyr:2024 hgt:174cm
+pid:855792798 byr:1920 hcl:#cfa07d
+
+eyr:2020
+hgt:74in iyr:2013 ecl:amb
+byr:1920 hcl:3f6214
+pid:957164804
+
+pid:756767000 hcl:#220540 byr:1922 hgt:172cm
+eyr:2023 cid:305 ecl:hzl iyr:2019
+
+hgt:193in eyr:2025 pid:117240526 iyr:2017 hcl:#888785 byr:1928 ecl:blu
+
+byr:1942
+ecl:blu
+cid:347
+hcl:#fffffd eyr:2023 iyr:2017
+hgt:154cm pid:836554235
+
+eyr:2023 hcl:#efcc98
+pid:364475403 byr:1962 iyr:2015
+ecl:brn hgt:59in cid:289
+
+byr:2021 hcl:ca4bcf hgt:88 iyr:2017 ecl:gmt pid:181cm eyr:2032
+
+byr:1937 iyr:2014 hgt:154cm ecl:brn
+hcl:#866857
+eyr:2022 pid:234591437
+
+iyr:2002 cid:139 byr:1982
+hcl:#c0946f
+pid:#62721b hgt:159in eyr:1966 ecl:brn
+
+eyr:2036 ecl:oth byr:2026 hgt:96
+pid:137651094
+hcl:z
+
+pid:373485985
+iyr:2030 ecl:gry byr:2011 hgt:65cm
+hcl:#733820
+
+pid:390979357
+ecl:gry hgt:164cm
+hcl:#ceb3a1 eyr:2029 byr:1932 iyr:2015
+
+ecl:hzl hgt:68in eyr:2023 pid:829734763 iyr:2016 hcl:#733820 byr:1997
+
+hgt:150cm byr:1926 iyr:2019 pid:521908229 eyr:2029 ecl:brn hcl:#623a2f
+
+eyr:2023 byr:1974
+iyr:2018 cid:58
+ecl:grn
+pid:310883188 hcl:#866857
+hgt:164cm
+
+byr:1963 iyr:2019
+hgt:162cm
+eyr:2021
+hcl:#fffffd ecl:oth pid:104734523
+
+hcl:#888785 cid:150
+eyr:2020 byr:1988
+iyr:2018
+ecl:oth
+hgt:179cm pid:635972018
+
+iyr:2014 hcl:#7d3b0c ecl:hzl pid:717760687
+byr:1929 eyr:2027 hgt:183cm
+
+iyr:2019 byr:2000
+eyr:2025 pid:506581828 hcl:#602927 ecl:oth
+hgt:162cm
+
+pid:#fd3377 ecl:#618bce hcl:#ceb3a1
+iyr:1944 hgt:182cm cid:57
+byr:2022 eyr:1995
+
+pid:4790730010
+hgt:192cm
+cid:222 byr:2022
+hcl:4798e7 ecl:#5126d5 iyr:1954 eyr:2040
+
+hcl:#b6652a
+ecl:brn cid:181 pid:983890186 hgt:189cm byr:1998
+eyr:2022 iyr:2011
+
+iyr:2018 eyr:2022
+cid:58 byr:1994 hgt:169cm ecl:hzl pid:036522894
+hcl:#2c9ee8
+
+iyr:1979
+hcl:e09b9c byr:2016
+hgt:121 eyr:1962 pid:#fb14be cid:265 ecl:lzr
+
+eyr:2024 hgt:63in hcl:#efcc98 iyr:2018
+byr:1953 pid:881102827 ecl:amb
+
+ecl:oth hgt:177cm eyr:2028 iyr:2011
+hcl:#efcc98 pid:113579849 byr:1957
+
+ecl:#fe1b74 iyr:1926 hgt:70cm
+pid:70807766 hcl:556dca byr:2030
+eyr:2032
+
+byr:1997 ecl:blu hgt:105
+pid:178655906 iyr:2025
+hcl:#6b5442
+eyr:2021
+
+eyr:2030 ecl:grt hgt:161cm hcl:#ceb3a1 iyr:2016
+pid:318930966 cid:59 byr:1924
+
+cid:200 hgt:67in
+pid:229395752 byr:1936 ecl:oth iyr:2013 eyr:2020 hcl:#c0946f
+
+byr:1990 iyr:2018
+cid:99 hcl:#6b5442 hgt:155 pid:350832537 ecl:blu eyr:2021
+
+eyr:2039 byr:2025 pid:247367429 hcl:z iyr:2013 ecl:amb
+cid:118
+
+eyr:2027 hcl:z ecl:utc
+cid:274 hgt:175in iyr:2016 byr:1977 pid:478855994
+
+eyr:2020 pid:636743032
+hcl:#64a8b8 iyr:2018 ecl:grn hgt:68in byr:1969
+
+pid:515635081 iyr:2013 byr:1980 eyr:2024 hgt:173cm ecl:gry
+hcl:#b6652a
+
+ecl:utc byr:2026 iyr:1999 eyr:1937
+hgt:66cm
+hcl:z
+pid:2247643960
+
+iyr:2013 byr:1942 hgt:154cm eyr:2020 hcl:#18171d cid:323 pid:302753381 ecl:oth
+
+ecl:xry pid:346719476
+iyr:1999
+eyr:2020 hgt:154cm hcl:z
+byr:2027
+
+hgt:160cm eyr:2025 hcl:#fffffd byr:1998
+pid:678119271 ecl:blu iyr:2014
+
+hgt:161cm iyr:2011
+ecl:blu
+byr:1921 pid:236833613 eyr:2021
+hcl:#623a2f
+
+ecl:hzl hcl:#18171d hgt:151cm pid:541887993
+byr:1995 iyr:2019 eyr:2021
+
+pid:496474711 byr:1966 ecl:gry eyr:2025 hgt:176cm
+hcl:#b6652a iyr:2018
+
+iyr:2010 hcl:#efcc98 pid:351846405
+eyr:2024 hgt:150cm
+byr:1941
+
+hgt:151cm ecl:gry hcl:#a97842 pid:586789406
+eyr:2022 iyr:2013 byr:1982
+
+byr:1994 eyr:2028 ecl:gry
+hcl:#888785 iyr:2010
+hgt:165cm cid:183
+
+iyr:2015
+byr:1933 hcl:#733820 hgt:167cm
+ecl:blu pid:914665208 eyr:2027
+
+eyr:2031 hcl:6804ef
+ecl:amb
+byr:2024
+hgt:157cm iyr:1938
+pid:#0418fb
+
+byr:1936
+ecl:oth hgt:190cm cid:91
+pid:711544430 iyr:2020
+eyr:2025 hcl:#888785
+
+pid:381452527
+eyr:2027 hcl:#efcc98 ecl:brn
+byr:1956 hgt:63in
+
+ecl:oth
+iyr:2014 hcl:#ceb3a1
+cid:254
+pid:544612871 byr:1985 eyr:2023 hgt:172cm
+
+hcl:#efcc98
+hgt:191cm byr:1948
+ecl:blu eyr:2028
+pid:953894279 iyr:2017
+
+byr:1968 pid:875469219
+hcl:#efcc98 hgt:176cm cid:141 iyr:2017
+
+eyr:2022 hcl:#733820 ecl:hzl
+pid:870733357 iyr:2013
+byr:1949 hgt:150cm cid:252
+
+ecl:gry
+hcl:#602927 pid:632246684 byr:1986
+eyr:2030 hgt:152cm iyr:2013
+
+eyr:2029
+iyr:2016
+byr:1969 pid:595125675 ecl:gry hcl:#cfa07d hgt:184cm
+
+byr:1947 hcl:z
+cid:188 eyr:2038 pid:177cm iyr:2011 hgt:166cm ecl:#c1376b
+
+ecl:hzl hgt:170cm cid:307 eyr:2022
+byr:1971
+hcl:#b6652a pid:047040501
+
+hgt:126 ecl:zzz
+byr:2019
+pid:170207910 eyr:2035 hcl:23df48
+iyr:1932
+
+hgt:152cm cid:270 eyr:2036 ecl:#408f6e iyr:1952 pid:5808880830 byr:2022
+hcl:0b1ba6
+
+eyr:2021 hgt:179cm
+byr:1938 pid:140937061 iyr:2030 hcl:#a97842 ecl:oth
+
+hgt:67cm eyr:2028 pid:816355657
+iyr:2019 byr:2008 hcl:z ecl:#5b4f31
+
+cid:192
+iyr:2018 eyr:2020 byr:1983 pid:873720366
+ecl:grn hgt:187cm hcl:#6b5442
+
+byr:1955 hgt:71in iyr:2018 pid:320019385 hcl:#6b5442
+cid:324 eyr:2027
+
+pid:957860464
+hcl:#602927
+iyr:2011
+byr:2026 cid:261 eyr:2006
+
+byr:1989 ecl:gry cid:143 pid:258434299 eyr:2027 hgt:192cm iyr:2017 hcl:#7d3b0c
+
+pid:#1742ae
+ecl:#a61090
+iyr:2028 hcl:717dd0 hgt:139 cid:183
+eyr:2035
+
+eyr:2028 pid:039325804 hgt:167cm hcl:#888785 ecl:oth cid:155 iyr:2013 byr:1923
+
+byr:1956 iyr:2010
+hcl:#d683bf
+eyr:2023
+hgt:70in
+cid:197 pid:143320690
+ecl:hzl
+
+ecl:#4004e3 cid:278
+iyr:1950 pid:745107377
+byr:2007 eyr:2036
+hcl:8447eb hgt:74cm
+
+hcl:#ceb3a1 hgt:177cm iyr:2010 pid:640032134
+ecl:gry
+eyr:2027 byr:1958
+
+hgt:187cm
+iyr:1921 ecl:#1c7d96
+eyr:1987
+byr:2028 pid:#28e5a1 cid:144 hcl:9fc25d
+
+iyr:2012 byr:1996 cid:289 hgt:177cm hcl:#fffffd pid:687240168 eyr:2030 ecl:gry
+
+pid:860410143 ecl:dne eyr:2031 cid:206 hgt:187in byr:1927
+hcl:8c2149 iyr:2012
+
+iyr:2010
+byr:1963 cid:139 pid:160019759
+eyr:2030 hgt:172cm hcl:#602927
+
+pid:309851270
+iyr:2014
+ecl:hzl byr:1939
+cid:71
+eyr:2030
+hcl:#b216fb
+hgt:161cm
+
+ecl:gry
+cid:138
+iyr:2014
+hgt:177cm byr:1942
+pid:900269082 eyr:2024 hcl:#fffffd
+
+iyr:2019 hgt:158cm
+hcl:#18171d pid:941939350 eyr:2024 ecl:brn byr:1944
+
+byr:2023 ecl:brn
+cid:101 eyr:2016 pid:190078757 hgt:188in
+
+cid:188
+ecl:blu pid:075499609
+byr:1970
+hcl:#fffffd hgt:164cm eyr:2028 iyr:2015
+
+byr:2011 hcl:z
+ecl:gry
+pid:408316491 hgt:64cm iyr:2017 eyr:1968
+
+ecl:oth hcl:#6b5442
+pid:623099801
+hgt:163cm
+byr:1928
+
+pid:165230004
+ecl:grn byr:1935 hcl:#c0946f iyr:2012
+hgt:185cm
+
+hgt:162cm pid:069876432 byr:1960 cid:326 iyr:2013
+hcl:#cfa07d eyr:2021
+ecl:grn
+
+ecl:#f3d8ba hgt:182cm eyr:2020 byr:2007
+hcl:z iyr:2014 pid:6141297559
+
+pid:867747198
+hcl:#efcc98
+eyr:2030 byr:1989
+hgt:181cm
+
+byr:2000 eyr:2021 hgt:166cm
+hcl:#fffffd iyr:2019 pid:546346187 cid:111 ecl:grn
+
+eyr:2034 hcl:#623a2f
+byr:1958
+pid:60553207 ecl:#76b538 hgt:59 cid:75
+
+hcl:#623a2f
+eyr:2023 pid:251940892 byr:1998
+iyr:2012
+hgt:181cm ecl:gry
+
+iyr:2020 cid:83
+byr:1938 eyr:2024 ecl:amb pid:046668488 hgt:181cm hcl:#341e13
+
+ecl:grn
+eyr:2036 iyr:1951 byr:2029 hcl:z hgt:177in
+pid:135470038
+
+iyr:2015 eyr:2023
+byr:1961
+cid:81 hcl:#a97842 pid:710065884
+hgt:152cm
+ecl:#1f9801
+
+byr:2014
+pid:25253929 hcl:z
+ecl:#f3fb41 eyr:2025 cid:255 iyr:1998
+hgt:155cm
+
+ecl:gry pid:919070381 hcl:#efcc98 iyr:2019 eyr:2021 byr:1995
+
+byr:1942
+eyr:2029
+hgt:191cm hcl:#18171d
+pid:649719423 iyr:2018 ecl:brn
+
+ecl:gry
+byr:1963 iyr:2016 hgt:188cm pid:024539026 eyr:2022
+
+hgt:176cm
+ecl:hzl eyr:1923 pid:176188310 hcl:#b6652a
+byr:1939
+iyr:2011
+
+iyr:2011 hcl:#888785 eyr:2030 ecl:gry byr:1920
+
+pid:#0468a7 hcl:851fe0 eyr:2036 hgt:60cm
+byr:2030
+iyr:1995
+ecl:utc
+
+hcl:#866857 iyr:2016 ecl:oth
+pid:414233531 eyr:2022 byr:1957
+hgt:169cm cid:229
+
+cid:185 ecl:#5f6f53
+pid:#20f317 byr:2024 eyr:1988 hcl:z iyr:2023 hgt:158in
+
+pid:015894427 eyr:2027 hgt:177cm ecl:blu
+cid:222
+hcl:#c0946f iyr:2010 byr:1993
+
+cid:101 hgt:162cm hcl:#c0946f pid:666662343 ecl:grn
+byr:1974
+iyr:2019
+eyr:2029
+
+pid:782547454 hcl:z ecl:#b0805f
+iyr:2013 eyr:2023
+hgt:159cm
+byr:1935
+cid:230
+
+pid:298008321 hcl:231e1b hgt:166cm ecl:oth
+iyr:2026 eyr:2020
+
+pid:230201309 iyr:2010 eyr:2025 hcl:#6b5442
+cid:238
+ecl:grn
+hgt:174cm
+
+cid:287 eyr:2026 hcl:#733820
+pid:201750712 iyr:2010
+ecl:oth byr:1985
+hgt:185cm
+
+hcl:#a97842 hgt:70in eyr:2029
+pid:419407059 ecl:grn byr:1987
+iyr:2016
+
+hgt:191cm byr:1951
+eyr:2027 hcl:#8a9477 iyr:2015 ecl:amb pid:769071985
+
+hcl:#6b5442
+iyr:2012 ecl:blu
+cid:336 pid:391608810 byr:1995
+eyr:2022
+hgt:161cm
+
+iyr:2020
+byr:1938
+pid:927067439 eyr:2027 hgt:173cm
+hcl:306963 ecl:xry
+
+byr:1991
+iyr:2021 hgt:175cm hcl:68b4f3 ecl:utc
+pid:037777327 eyr:2026
+
+hgt:64in
+eyr:2025 hcl:#da6977 cid:137 byr:1990 iyr:2013 pid:918997697 ecl:amb
+
+iyr:2011 ecl:gry hgt:173cm eyr:2023 pid:802831612
+hcl:#733820 byr:1976
+
+byr:1938 eyr:2021 pid:575395401 cid:234
+hcl:#866857 ecl:hzl hgt:176cm
+
+hcl:#ceb3a1 ecl:hzl
+eyr:2035
+iyr:2014
+byr:2019
+
+ecl:hzl pid:961361236
+hgt:193cm hcl:#efcc98
+iyr:2011 eyr:2030 byr:1967
+
+eyr:1936 ecl:blu
+hgt:153cm hcl:98d3f0 pid:7296832671
+byr:1931 iyr:1962
+
+iyr:2016 eyr:2024 hcl:#6b5442 ecl:grn
+pid:265815316 byr:1966
+hgt:165cm
+
+pid:203025149
+eyr:2029
+iyr:2010 cid:124 byr:1999 ecl:blu
+
+iyr:2011 eyr:2028 pid:#7e0612 byr:1924 hcl:#7d3b0c ecl:oth
+hgt:82
+
+ecl:hzl
+byr:1941
+hcl:#b6652a eyr:2020 pid:409573276
+iyr:1976 hgt:166cm
+
+ecl:grn eyr:2030
+hgt:163cm iyr:2011 pid:121609314 byr:1961 hcl:#426e1a
+
+pid:#49ea2c
+eyr:2029 hcl:#6b5442 iyr:1931
+hgt:62cm ecl:brn
+byr:2012
+
+eyr:2038 hcl:8d1f49 ecl:#6d4ea1 pid:0853660207 byr:2020 hgt:71cm
+
+ecl:hzl hgt:170cm
+iyr:2011
+byr:1966 eyr:2028
+pid:609548717 hcl:#c0946f
+
+byr:1921 hcl:#c0946f ecl:blu iyr:2019 eyr:2024 pid:643387204
+
+cid:324 hgt:162cm ecl:amb
+hcl:#18171d byr:1961
+eyr:2027 iyr:2010 pid:939720354
+
+byr:1933 hcl:#fffffd
+pid:353343882
+eyr:2025 hgt:171cm ecl:amb cid:329
+iyr:2017
+
+byr:2004 iyr:2022
+pid:157cm eyr:2035
+ecl:#eafe47 hgt:129
+hcl:z
+
+cid:55 iyr:2025 hgt:177in pid:493884348
+hcl:#888785 byr:1925 ecl:#b11d27 eyr:2036
+
+ecl:hzl
+hgt:171cm
+iyr:2012 pid:479669573 cid:335 hcl:#fffffd byr:1953
+eyr:2029
+
+byr:1930 hcl:5bdf31
+pid:#b21f8a hgt:164cm
+cid:134
+iyr:2023 ecl:lzr
+
+iyr:2018 eyr:2026 ecl:grn
+pid:541667478 hcl:#6b5442 byr:1992 hgt:155cm
+
+hcl:2a1c4f iyr:2011
+hgt:192cm eyr:2028 byr:2029 cid:270 ecl:dne pid:7995627426
+
+byr:1929 ecl:oth
+pid:954905104 iyr:2016
+hgt:68in hcl:#7d3b0c eyr:2020
+
+cid:167 byr:2000 hgt:186cm iyr:2013 hcl:#ff4019 pid:384287209
+eyr:2024 ecl:amb
+
+eyr:2022
+iyr:2018 byr:1972 cid:290
+hgt:170cm ecl:grn pid:127269636
+
+byr:1997
+ecl:amb hgt:150cm
+pid:056368047 hcl:#fffffd eyr:2020 iyr:2020
+
+ecl:gry hgt:167in byr:2020 cid:131 pid:651833067 hcl:#623a2f iyr:2027 eyr:2038
+
+hcl:#56c370
+iyr:2014
+byr:1941
+pid:654258425 hgt:184cm
+eyr:2025 ecl:hzl
+
+pid:571765355
+byr:2021
+hcl:z
+eyr:1921 cid:106 iyr:1978
+ecl:#1162c5
+hgt:184in
+
+iyr:2015 hcl:#18171d cid:237 pid:348578306 ecl:blu
+byr:1988 eyr:2025 hgt:155cm
+
+byr:1963 hcl:#733820 cid:145 eyr:2030 ecl:oth pid:964094037 hgt:164cm iyr:2018
+
+pid:595618708 ecl:amb
+hcl:#866857
+hgt:186cm eyr:2024 byr:1924 iyr:2014
+
+ecl:hzl pid:484466493
+hgt:176cm iyr:2016 byr:1983 hcl:#ceb3a1
+
+ecl:gry hcl:#6b5442
+hgt:185cm
+eyr:2029
+pid:045583320 byr:1974 iyr:2020
+
+ecl:brn hcl:352cf1 cid:149
+hgt:184cm byr:2011
+eyr:2031
+pid:21942403 iyr:2028
+
+ecl:brn eyr:2029 pid:083295950 byr:1995 hgt:176cm hcl:#c0946f
+cid:68 iyr:2014
+
+hgt:170cm
+byr:1945 hcl:#623a2f
+iyr:2013 pid:912213595 ecl:gry eyr:2020
+
+ecl:gry
+hcl:#18171d iyr:2015 hgt:185cm eyr:2023
+byr:1950
+
+byr:1997 hgt:68in pid:368643584 hcl:#623a2f ecl:hzl eyr:2029 iyr:2012
+cid:239
+
+iyr:2003 eyr:2020 cid:99 byr:2027 hcl:2c10a6 hgt:74cm
+ecl:brn
+
+pid:151cm hcl:46a5fd eyr:2031
+iyr:2014
+byr:2005 ecl:xry hgt:176cm
+
+byr:2011 ecl:oth pid:821123244
+iyr:2022
+hcl:839b47 eyr:2039 hgt:150in
+
+pid:604669618 hgt:152cm iyr:2013
+byr:1954
+eyr:2021 ecl:amb hcl:#623a2f
+
+hgt:182cm
+byr:1993
+cid:177 hcl:#b6652a ecl:gry iyr:2011 pid:441649857 eyr:2027
+
+cid:296 hgt:98
+ecl:grt iyr:2028 hcl:#a97842 byr:2022
+pid:69736889 eyr:1935
+
+iyr:2016 hcl:#cfa07d
+byr:1941
+hgt:182cm
+pid:720595987 ecl:gry
+eyr:2022
+
+iyr:2018 hgt:164cm hcl:#650d28 byr:1973 cid:108 pid:#b0df80 ecl:blu eyr:2020
+
+hcl:z
+pid:315901778
+iyr:2013
+byr:1999 ecl:#49f691 eyr:2026 hgt:179cm
+
+byr:1925
+pid:555786686 hgt:189cm hcl:#cfa07d iyr:2012 ecl:gry eyr:2028
+
+iyr:2016
+hgt:168cm
+eyr:2027 cid:60 ecl:gry hcl:#cfa07d
+pid:322944081 byr:1993
+
+pid:163cm
+hgt:189cm iyr:1997 hcl:03db25 eyr:1970
+byr:2016 ecl:#6c59eb
+
+pid:766719295 iyr:2017
+hgt:168cm
+hcl:z ecl:grt
+eyr:2022 byr:2010
+
+hgt:173cm pid:247156751 cid:109 eyr:2022 iyr:2012 ecl:gry byr:1989
+
+cid:288
+hcl:77241f
+hgt:157cm byr:1956 pid:587115461 iyr:2016 ecl:lzr
+eyr:2034
+
+hcl:5307c9 ecl:#cc4aff
+pid:#d80d30
+cid:224 hgt:72cm byr:2025 eyr:2039 iyr:2025
+
+eyr:2027 byr:2015
+hgt:184 hcl:98fb9d pid:58151347
+iyr:2029
+
+hgt:183cm cid:187 byr:2019 ecl:xry iyr:2013 pid:164cm hcl:#18171d eyr:2021
\ No newline at end of file
diff --git a/2020.csproj b/2020.csproj
index 3af76a4..6c2b00f 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -16,6 +16,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Program.cs b/Program.cs
index 72b2aa8..df74adb 100644
--- a/Program.cs
+++ b/Program.cs
@@ -7,6 +7,7 @@
Q01.Go();
Q02.Go();
Q03.Go();
+ Q04.Go();
}
}
}
diff --git a/Q04.cs b/Q04.cs
new file mode 100644
index 0000000..2c03e80
--- /dev/null
+++ b/Q04.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace _2020
+{
+ class Q04
+ {
+ static List> Passports = new List>();
+
+ static Regex PassportRegex = new Regex(@"(?[a-z]{3}):(?\S+)", RegexOptions.Compiled);
+ static Regex HTMLColor = new Regex("^#[0-9a-f]{6}$", RegexOptions.Compiled);
+ static Regex PassportID = new Regex("^[0-9]{9}$", RegexOptions.Compiled);
+
+ public static void Go()
+ {
+ MakeList();
+ Part1();
+ Part2();
+ }
+
+ static void MakeList()
+ {
+ using var fs = new FileStream("04input.txt", FileMode.Open);
+ using var sr = new StreamReader(fs);
+ string line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (line.Length == 0 || Passports.Count == 0)
+ {
+ Passports.Add(new Dictionary());
+ }
+
+ var matches = PassportRegex.Matches(line);
+ for (int i = 0; i < matches.Count; i++)
+ {
+ Passports[Passports.Count - 1].Add(matches[i].Groups["key"].Value, matches[i].Groups["val"].Value);
+ }
+ }
+ }
+
+ static bool IsValid_Basic(Dictionary passport)
+ {
+ if (passport.Count >= 8)
+ {
+ return true;
+ }
+ else if (passport.Count == 7 && !passport.ContainsKey("cid"))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ static void Part1()
+ {
+ int numValid = 0;
+ foreach (var passport in Passports)
+ {
+ if (IsValid_Basic(passport))
+ {
+ numValid++;
+ }
+ }
+
+ Debug.WriteLine($"Q04Part1: num valid={numValid}");
+ }
+
+ static void Part2()
+ {
+ int numValid = 0;
+ foreach (var passport in Passports)
+ {
+ bool isValid = IsValid_Basic(passport);
+ foreach (var set in passport)
+ {
+ switch (set.Key)
+ {
+ case "byr":
+ {
+ var year = Convert.ToInt32(set.Value);
+ isValid = isValid && year >= 1920 && year <= 2002;
+ }
+ break;
+
+ case "iyr":
+ {
+ var year = Convert.ToInt32(set.Value);
+ isValid = isValid && year >= 2010 && year <= 2020;
+ }
+ break;
+
+ case "eyr":
+ {
+ var year = Convert.ToInt32(set.Value);
+ isValid = isValid && year >= 2020 && year <= 2030;
+ }
+ break;
+
+ case "hgt":
+ {
+ var val = 0;
+ var unit = "";
+ if (set.Value.Length > 2)
+ {
+ val = Convert.ToInt32(set.Value[..^2]);
+ unit = set.Value[^2..];
+ }
+ isValid = isValid && ((unit == "cm" && val >= 150 && val <= 193) || (unit == "in" && val >= 59 && val <= 76));
+ }
+ break;
+
+ case "hcl":
+ {
+ isValid = isValid && HTMLColor.IsMatch(set.Value);
+ }
+ break;
+
+ case "ecl":
+ {
+ isValid = isValid && (set.Value == "amb" || set.Value == "blu" || set.Value == "brn" || set.Value == "gry" || set.Value == "grn" || set.Value == "hzl" || set.Value == "oth");
+ }
+ break;
+
+ case "pid":
+ {
+ isValid = isValid && PassportID.IsMatch(set.Value);
+ }
+ break;
+ }
+ }
+
+ if (isValid)
+ {
+ numValid++;
+ }
+ }
+
+ Debug.WriteLine($"Q04Part2: num valid={numValid}");
+ }
+ }
+}