advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git
commit a89768987882d6fbcf70391a0c5c596048cfa0bd
parent 0d6e1bc99a6908b32a2207dd09ba276b7b9ec077
Author: Shimmy Xu <shimmy.xu@shimmy1996.com>
Date:   Fri,  4 Dec 2020 20:18:21 -0600

Add 2020 day 04

Diffstat:
A2020/day04/input.txt | 1147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2020/day04/main.go | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 1245 insertions(+), 0 deletions(-)
diff --git a/2020/day04/input.txt b/2020/day04/input.txt
@@ -0,0 +1,1147 @@
+eyr:2021 hgt:168cm hcl:#fffffd pid:180778832 byr:1923 ecl:amb iyr:2019 cid:241
+
+hcl:#341e13 ecl:lzr eyr:2024 iyr:2014 pid:161cm byr:1991 cid:59 hgt:150cm
+
+iyr:2018 eyr:2027
+hgt:153cm
+pid:642977294 ecl:gry hcl:#c0946f byr:1999
+
+pid:#534f2e eyr:2022
+ecl:amb cid:268
+iyr:2028 hcl:2b079f
+byr:2008
+hgt:185cm
+
+byr:2000 hgt:161cm ecl:blu
+eyr:2030 pid:647793597 hcl:#a97842 iyr:2011
+
+hcl:#3e335d
+hgt:75cm
+iyr:2010 byr:1940 ecl:#e0f130
+pid:434016528
+cid:138 eyr:2017
+
+hcl:#6b5442 cid:185 hgt:163cm eyr:2023
+pid:510706612 byr:2001 ecl:amb iyr:2019
+
+hcl:#6b5442 byr:1942 eyr:2022
+iyr:2016 pid:969898152 ecl:amb
+
+ecl:blu
+pid:734638153 byr:1968
+hcl:#733820 eyr:2020 hgt:160cm
+iyr:2019
+
+iyr:2014 eyr:2020 byr:1996
+hgt:158cm ecl:oth pid:920487833 hcl:#888785
+
+byr:1948 hcl:#341e13 cid:117 pid:802002577
+hgt:188cm eyr:2028
+ecl:blu iyr:2010
+
+pid:9572562 hgt:65cm ecl:#ac200e iyr:2028
+byr:2002
+eyr:2031 hcl:z
+
+byr:2024 hcl:#866857 ecl:dne
+eyr:2031 pid:#a28d39
+iyr:1920 hgt:158in
+
+pid:023850020 hgt:163cm iyr:2017 byr:1966
+cid:145
+ecl:grn eyr:2027 hcl:#ceb3a1
+
+hcl:z byr:2008 eyr:2020 ecl:#e810c9 hgt:76cm pid:0485860220
+
+hgt:154cm
+hcl:#fffffd ecl:grn byr:1929 iyr:2019 pid:868514160 eyr:2026
+
+cid:181 byr:1991 eyr:2026 hgt:166cm
+hcl:#cfa07d
+iyr:2010 ecl:hzl pid:248467397
+
+eyr:2036
+hgt:60cm byr:2023 ecl:#7f7a50 iyr:1964 hcl:z pid:189cm
+cid:233
+
+ecl:#8b23b5 iyr:1940 hcl:#341e13 pid:806874850 hgt:150cm eyr:2033 byr:1930
+
+hcl:#efcc98 ecl:#cf8dd0 byr:1939 hgt:75cm eyr:2023 pid:7912576181
+iyr:2014
+
+cid:282 hcl:#18171d
+ecl:blu pid:475471726
+hgt:158cm byr:1948 eyr:2030 iyr:2018
+
+eyr:2030 iyr:2013 pid:843774570 hgt:186cm ecl:amb
+byr:1961 hcl:#7d3b0c
+
+cid:239
+eyr:2021 pid:814286281
+ecl:gry byr:1945 iyr:2016 hcl:#efcc98
+hgt:167cm
+
+byr:1931 hcl:#cfa07d pid:148883217 iyr:2011
+hgt:172cm
+eyr:2026 ecl:gry
+
+hcl:z
+eyr:2037
+ecl:#bbb299 iyr:2015 byr:1931 hgt:186in
+pid:8019203964
+
+hgt:178 hcl:bf28b4
+eyr:2028
+ecl:zzz
+pid:184cm byr:1935 iyr:2017
+
+cid:195 byr:1936
+eyr:2028 hgt:168cm hcl:#a69e3b pid:836680712
+ecl:amb iyr:2020
+
+hgt:65in
+pid:580748663 eyr:2028 iyr:2018 ecl:amb hcl:#866857 byr:1969
+
+iyr:2021 hcl:94dc65
+eyr:2027
+byr:2011 pid:172cm ecl:#84a05a
+hgt:72cm
+
+pid:138102285
+hcl:#efcc98 iyr:2019
+ecl:grn cid:270 byr:1969
+hgt:187cm eyr:2027
+
+eyr:2022 hgt:151cm pid:505032844
+ecl:brn iyr:2020 hcl:#cfa07d byr:1965
+
+hcl:#7d3b0c
+ecl:blu eyr:2024
+pid:7946112272 iyr:2010 cid:337 hgt:180in
+byr:2011
+
+hgt:65in iyr:2011 pid:774065195 eyr:2020
+ecl:brn
+byr:1993
+hcl:#c0946f
+
+ecl:blu
+hgt:65in
+iyr:2014
+hcl:#6b5442 byr:1948
+pid:672157135
+
+hcl:#2e5fe2 hgt:182cm byr:1989
+cid:205 iyr:2010 pid:116603730 eyr:2020 ecl:oth
+
+ecl:zzz iyr:2029
+pid:152cm hcl:z hgt:67cm
+eyr:2032
+byr:1942
+
+iyr:2012 hgt:180cm byr:1951 pid:777840558 cid:324 eyr:2029
+ecl:blu hcl:#341e13
+
+hcl:z
+cid:320 byr:1995 eyr:2022 pid:#0830f1 hgt:63 ecl:#9db56f iyr:2017
+
+eyr:1996 iyr:2018 ecl:gmt
+hgt:182cm pid:523450129 hcl:#6660a6 cid:76 byr:1959
+
+iyr:2013
+pid:427856678
+eyr:2027 cid:146
+ecl:hzl
+hgt:171cm
+
+eyr:2027 hgt:158cm
+pid:54529307 hcl:z
+ecl:hzl byr:2018 iyr:1980
+
+iyr:2010 eyr:2026
+ecl:amb hcl:#a97842 pid:404930776 cid:277 byr:1994 hgt:184cm
+
+eyr:2028 hgt:150cm pid:#534041 iyr:2022
+hcl:#733820
+cid:130 ecl:blu
+byr:1963
+
+ecl:blu hgt:160cm hcl:#ceb3a1 byr:1951 eyr:2029
+pid:655280714
+iyr:2020
+
+cid:248 byr:1966 iyr:2017
+eyr:2025 ecl:blu pid:930670644 hcl:#866857
+
+ecl:amb eyr:2028 cid:308 byr:1951 hgt:183cm pid:260537189
+iyr:2011 hcl:#cfa07d
+
+byr:1993
+hcl:#7d3b0c pid:787304941
+iyr:2017 eyr:2024 hgt:178cm cid:314
+ecl:hzl
+
+ecl:#62c438 hcl:915943 iyr:1958 pid:1027793033 byr:2015 hgt:90
+eyr:2035
+
+hcl:#b6652a eyr:2028 ecl:gry hgt:168cm byr:1921 pid:130528933 iyr:2020
+
+eyr:2023 pid:675106386 ecl:brn byr:2021
+iyr:2011
+hgt:153cm hcl:#888785
+
+iyr:2010 pid:586165419 eyr:2023
+ecl:gry hgt:169cm hcl:#623a2f byr:1993
+
+iyr:2015 pid:332903175 eyr:2021
+hgt:154cm
+hcl:#733820 ecl:gry byr:1951
+
+hcl:e58fa1 byr:1932 ecl:dne
+cid:272 eyr:2026 hgt:175cm iyr:1936 pid:408053740
+
+iyr:2013 hgt:151cm
+pid:151cm
+hcl:#888785
+byr:2014
+cid:207 eyr:2023 ecl:#51625d
+
+iyr:2016 cid:112
+ecl:amb
+pid:727316519
+eyr:2020 byr:1947 hcl:#ceb3a1 hgt:180cm
+
+eyr:2036 hcl:z
+ecl:gmt pid:11080111
+byr:1972 hgt:161in iyr:2030
+
+iyr:2013 ecl:gry eyr:2030
+hcl:#602927 byr:1968 hgt:160cm
+pid:888357737
+
+eyr:2026
+pid:259305913 iyr:2012 hgt:166cm ecl:amb byr:1951 hcl:#b6652a
+
+byr:1939 hgt:158cm
+cid:232 eyr:2022 ecl:amb
+hcl:#fffffd pid:312632405
+iyr:2016
+
+ecl:amb hgt:166cm pid:138763305 hcl:#a97842 byr:1972 eyr:2020
+iyr:2020
+
+hgt:155cm hcl:#733820 byr:2010
+pid:138766753
+ecl:grt eyr:2032 cid:50
+iyr:2002
+
+eyr:2029 ecl:gry iyr:2013 byr:1924
+hgt:181cm
+hcl:#fffffd pid:194780722
+cid:216
+
+eyr:2020 pid:1817301064 hcl:#b6652a
+ecl:grn iyr:2014
+byr:2000 hgt:171cm
+
+hcl:#03f240 iyr:2017 ecl:oth byr:1921 pid:464020404 eyr:2025 cid:348
+hgt:179cm
+
+cid:284 hcl:23f681
+pid:190cm iyr:2023 eyr:2032
+hgt:61cm ecl:#6da9d9
+byr:2029
+
+hgt:175cm byr:1959 ecl:amb
+eyr:2030 cid:315 hcl:#ceb3a1
+pid:795101457
+iyr:2013
+
+eyr:2027 hgt:170cm cid:100 ecl:grn
+iyr:2011 hcl:#d6b2ee pid:760346767 byr:1950
+
+eyr:2014 hcl:#a97842 ecl:blu
+pid:5560121737 hgt:73in
+iyr:2010
+
+byr:1945 hcl:#7d3b0c eyr:2024 ecl:brn iyr:2013
+pid:433715275
+
+eyr:2022 ecl:gry byr:1982 hcl:#6b5442 iyr:2019 pid:650096889 hgt:65in
+
+iyr:2010 ecl:oth hgt:154cm eyr:2024 cid:122 hcl:#341e13
+byr:1929 pid:264796724
+
+eyr:2026 cid:225
+byr:1928 pid:479832664 hcl:#cfa07d iyr:2020
+hgt:192cm
+ecl:gry
+
+pid:460595787 hgt:157cm iyr:2018
+ecl:oth
+hcl:#ceb3a1 eyr:2021
+
+iyr:2018 pid:787208686 hgt:178cm cid:118
+hcl:#ceb3a1 ecl:oth
+eyr:2030 byr:1949
+
+hcl:#efcc98 byr:1934 hgt:175cm ecl:oth
+iyr:2019 cid:326 pid:337273951 eyr:2024
+
+hcl:#6b5442
+pid:422717762 iyr:2010 ecl:gry
+eyr:2024
+hgt:165cm byr:1950
+
+pid:712203563 eyr:2023
+hgt:151cm
+iyr:2010
+byr:1950
+hcl:#ceb3a1 ecl:grn
+
+hcl:#888785 eyr:2020 iyr:2016
+hgt:191cm byr:1927 pid:848960326 ecl:hzl
+
+byr:1999 iyr:2016
+hgt:62in hcl:#7d3b0c eyr:2028
+
+cid:195
+iyr:1957 eyr:2023 byr:1993
+hgt:176cm pid:316550627 hcl:68f2e3 ecl:amb
+
+hcl:#623a2f pid:780723069
+byr:1936 cid:271 eyr:2022
+hgt:188cm
+iyr:2017 ecl:grn
+
+eyr:2021 pid:209774111 hgt:192cm
+hcl:#6b5442 ecl:amb
+iyr:2018
+byr:1983
+
+hcl:#edeee4 byr:2001 cid:68 pid:717560044 ecl:hzl eyr:2030 iyr:2016 hgt:191cm
+
+eyr:1968 cid:222 ecl:gry pid:90867093 hcl:#866857
+iyr:2026 hgt:72 byr:1965
+
+eyr:2028
+hgt:152cm pid:759034572 iyr:2017 hcl:#a97842
+ecl:brn
+cid:168 byr:1987
+
+hcl:453e20 eyr:2011
+ecl:gry hgt:75cm byr:1994 pid:41067436 iyr:2024
+
+ecl:blu hgt:61cm
+byr:1988 eyr:2022 iyr:2020
+pid:219813481 hcl:#ceb3a1
+
+pid:635783992
+byr:1950 eyr:2029 hgt:182cm hcl:#c0946f ecl:oth
+
+iyr:2016 ecl:amb pid:393320246 hgt:156cm
+hcl:#fffffd byr:1988 eyr:2028
+
+pid:689161094
+hcl:#623a2f iyr:2011
+eyr:2020 byr:1953
+hgt:153cm ecl:brn
+
+hgt:185cm hcl:#ceb3a1
+pid:751921928 iyr:2019 ecl:grn eyr:2028
+byr:1943
+
+hcl:#b6652a eyr:2025 iyr:2016 ecl:hzl
+hgt:169cm byr:1931 pid:486548422
+
+hgt:160cm pid:49931386
+ecl:gry iyr:2010 eyr:2021 hcl:#341e13 cid:64 byr:1933
+
+byr:1927
+pid:415362434
+ecl:gmt eyr:2028
+hgt:153cm hcl:#18171d iyr:2017 cid:163
+
+byr:1949 pid:427698686
+eyr:2027 iyr:2018 ecl:hzl hgt:159cm
+hcl:#ceb3a1 cid:132
+
+hcl:#7d3b0c iyr:2013 byr:2023 eyr:2037
+cid:83 ecl:#05c60a hgt:160
+pid:429836535
+
+hgt:174cm eyr:1937 pid:149685914 byr:2004 iyr:2017
+hcl:#623a2f cid:303
+ecl:blu
+
+hgt:60cm pid:47770642
+byr:2020 eyr:2032 ecl:#cc7bc6 cid:144 iyr:2025 hcl:z
+
+iyr:2010 ecl:amb
+pid:#5f3343 hcl:#733820 eyr:2021 byr:1933
+hgt:169cm
+
+hcl:#efcc98
+hgt:172cm eyr:2020
+ecl:oth
+byr:2001 pid:027554330
+iyr:1983 cid:165
+
+byr:2026 hgt:158cm iyr:2016 hcl:#733820
+ecl:hzl cid:117
+eyr:2037
+pid:37781880
+
+hcl:#602927 cid:248
+byr:1999
+hgt:181cm eyr:2029 pid:554270506
+iyr:2016
+ecl:blu
+
+byr:1952 iyr:2014
+ecl:oth
+hcl:#cfa07d hgt:186cm pid:875655050
+eyr:2024
+
+eyr:2030 hgt:186cm hcl:#18171d pid:038705513 ecl:grn cid:100 byr:1927
+iyr:2015
+
+cid:98 eyr:2022
+byr:1957 ecl:grn
+hgt:182cm pid:607781478
+hcl:#ceb3a1
+
+eyr:1977 iyr:2021
+hgt:178cm cid:186 byr:2026
+pid:#b15551 ecl:utc
+hcl:z
+
+pid:334408791
+hgt:158cm hcl:#6b5442 cid:83 byr:1983 iyr:2012 ecl:grn
+eyr:2030
+
+eyr:2028 iyr:2015 ecl:amb
+pid:352112783
+cid:345 byr:1938 hgt:71in
+hcl:#6b5442
+
+byr:2028 pid:380227894 eyr:2025
+ecl:blu hgt:189cm hcl:a51656
+iyr:1956
+
+hgt:184cm iyr:2016 ecl:hzl pid:485327910 hcl:#fffffd byr:1970 eyr:2027
+
+byr:1992 iyr:2018 eyr:2030 hcl:#888785 hgt:168cm pid:535221295 ecl:blu
+
+hgt:165cm hcl:#fffffd byr:1961 ecl:gry pid:639998127
+eyr:2028
+iyr:2011
+
+hgt:74in iyr:2015 cid:284 pid:035643775 byr:1978 hcl:#623a2f
+ecl:grn eyr:2023
+
+byr:1954
+ecl:#16e7c4 hgt:164cm
+eyr:2029 iyr:2015 pid:377679333 hcl:#a97842 cid:233
+
+eyr:2026 pid:266604186 byr:1981 ecl:brn
+iyr:2012
+hgt:156cm
+hcl:#c0946f
+
+cid:189 hcl:z ecl:#40f51a
+hgt:180cm iyr:2014 pid:0942329667 byr:1946 eyr:2025
+
+eyr:2020 hgt:165cm byr:1961
+iyr:2013 hcl:#888785 ecl:blu pid:156cm
+
+cid:126 hcl:#623a2f pid:153152767 hgt:163cm ecl:grn eyr:2030 iyr:2020 byr:1959
+
+byr:1935
+pid:990549858 hcl:#623a2f
+ecl:blu iyr:2012 cid:160 eyr:2028 hgt:172cm
+
+hcl:111b82
+byr:1955 pid:765740335 hgt:150cm ecl:amb
+iyr:2019 eyr:1937
+
+hgt:59cm byr:2023 eyr:2032 pid:652161761 cid:61 ecl:brn iyr:2011
+hcl:#623a2f
+
+byr:1951 eyr:2023 iyr:2017
+hcl:#18171d
+ecl:brn cid:306 pid:446746225 hgt:187cm
+
+hgt:160cm ecl:blu pid:855958582 byr:1988 hcl:#6f97ba iyr:2016
+eyr:2026
+
+iyr:2010 byr:1948
+cid:336 ecl:hzl
+eyr:2030
+pid:475243853
+hgt:175cm
+hcl:#ceb3a1
+
+hgt:168cm eyr:2021 ecl:oth hcl:#229bb0
+iyr:2016 byr:1949 pid:720804107
+
+iyr:2011
+eyr:2025
+ecl:gry cid:330 byr:1927 pid:699837182
+hcl:#b6652a hgt:161cm
+
+byr:1988 eyr:2026 ecl:gry
+hgt:162cm pid:924306872
+iyr:2013
+hcl:#888785
+
+byr:1934 ecl:brn pid:0774345729 iyr:1964 hcl:z hgt:170in cid:262
+
+eyr:2028 byr:1989
+iyr:2014
+ecl:blu pid:388512489
+hcl:#7bc6b9
+cid:212
+hgt:187cm
+
+byr:1960 pid:#e494ee eyr:2026 hgt:192cm hcl:a82f5a
+iyr:1999 ecl:#89848d
+
+byr:2006 pid:#3bac86
+cid:297
+hcl:55d36e
+iyr:1985
+ecl:#538688
+eyr:1923
+
+ecl:hzl iyr:1925 eyr:2030
+pid:1231954396 hgt:154cm byr:2009
+hcl:#c0946f
+
+hgt:63in
+pid:229535785 ecl:oth hcl:#9e34cd
+iyr:2020
+eyr:2021 byr:1943 cid:73
+
+hgt:63cm hcl:z byr:2029 eyr:1928 pid:4559542479
+cid:258 iyr:2024 ecl:#7058ad
+
+ecl:hzl hcl:z pid:146884476 iyr:2011 cid:158
+byr:1991 eyr:2030 hgt:156cm
+
+byr:2030 iyr:2017 pid:19198146
+hcl:#7d3b0c
+ecl:#af1431 eyr:2023
+hgt:74cm
+
+hcl:#6b5442 hgt:168cm eyr:2020
+cid:260 byr:1920
+ecl:hzl
+
+byr:1971 cid:186 hgt:60 eyr:2022 pid:160cm
+hcl:z
+iyr:2013
+ecl:blu
+
+hcl:#7d3b0c cid:218 eyr:2022 pid:015062066 ecl:hzl iyr:2010 hgt:170cm byr:2001
+
+iyr:1984 byr:2027
+eyr:2033
+hcl:94d9ab hgt:148 ecl:gmt
+cid:288
+pid:160cm
+
+hcl:#74c9e7 eyr:2026 hgt:168cm byr:1994 ecl:brn pid:651587465
+
+hgt:160cm
+ecl:gry cid:182 byr:1929 pid:890454205 hcl:#efcc98 eyr:2029 iyr:2020
+
+ecl:brn hgt:156in
+eyr:2022
+cid:289 iyr:2022 hcl:e34ec4 pid:#206e1c byr:1938
+
+eyr:2030
+pid:99239063 cid:166
+hgt:153cm hcl:0a3633 byr:1990 iyr:2024 ecl:grn
+
+byr:2019 hgt:189cm hcl:#cfa07d iyr:1927 ecl:#bafabd pid:161cm eyr:2024
+
+hcl:#ceb3a1 iyr:2010
+hgt:163cm eyr:2020
+pid:948123697 ecl:brn byr:1973
+
+pid:691623749 iyr:2016 hcl:#18171d byr:1972 eyr:2030
+hgt:173cm ecl:hzl
+
+hcl:#ceb3a1 cid:271
+iyr:2010 byr:1977 hgt:161cm
+eyr:2022
+pid:460185976 ecl:hzl
+
+eyr:2028 ecl:hzl cid:98
+pid:828517281 hgt:154cm
+iyr:2016 hcl:#866857 byr:1924
+
+hgt:99
+iyr:2030 byr:2003 eyr:2039 pid:184cm ecl:lzr cid:71
+hcl:z
+
+eyr:2029 pid:864807599
+iyr:2013 hcl:#866857 ecl:grn byr:1961 hgt:185cm
+
+hcl:#866857
+hgt:66in ecl:oth iyr:2018
+eyr:2026 cid:170 byr:1999 pid:538451102
+
+iyr:2024 byr:2015 cid:271 pid:69951601 hgt:190cm
+ecl:xry
+eyr:2003
+hcl:#c0946f
+
+hgt:178cm hcl:#ceb3a1 byr:1942
+pid:583281865 iyr:2015 eyr:2020
+ecl:grn
+
+eyr:2020 hcl:#866857 ecl:oth hgt:153cm cid:212 byr:1972 iyr:2012 pid:198849319
+
+ecl:blu
+cid:222 hgt:174cm hcl:#866857
+byr:1971 iyr:2016 eyr:2030
+
+ecl:blu pid:521480106
+iyr:2020
+eyr:2027 byr:1942
+hcl:#733820 hgt:153cm cid:106
+
+cid:57 pid:685649434
+eyr:2026
+hcl:#efcc98 ecl:grn iyr:2013
+byr:1968 hgt:157cm
+
+cid:63 pid:195592844 hcl:#efcc98
+byr:1980 ecl:gry iyr:2016
+eyr:2023
+hgt:178cm
+
+hcl:z
+byr:2024 hgt:179cm
+iyr:2017
+eyr:1998 ecl:#d087a7
+
+pid:673581655 eyr:2023
+byr:1924 hcl:#18171d ecl:blu hgt:187cm iyr:2015
+cid:69
+
+byr:1979 eyr:2020 pid:925293477 ecl:amb cid:145 hcl:#1fc76d hgt:188cm iyr:2013
+
+pid:833495286
+hcl:#cfa07d ecl:brn
+byr:1993 eyr:2020 cid:209
+hgt:165cm iyr:2018
+
+hgt:181cm
+hcl:#efcc98 pid:264709463
+iyr:2019
+eyr:2026
+cid:313 byr:1926 ecl:gry
+
+pid:798909144 iyr:2015 ecl:brn hgt:183cm hcl:#623a2f byr:1979
+eyr:2023
+
+cid:257
+ecl:grn pid:203787314 hcl:#fffffd iyr:2020 hgt:192cm byr:1964
+
+pid:15955243
+eyr:1962
+byr:2012 hgt:155cm iyr:2025 hcl:z
+
+cid:126
+hgt:156cm
+byr:1936 pid:495593265
+ecl:brn hcl:ee357b iyr:2030 eyr:2014
+
+pid:182cm eyr:2022 ecl:#c8bb8a
+iyr:2021 byr:1922 cid:270 hcl:#866857 hgt:190cm
+
+eyr:2030
+byr:1963 cid:224 ecl:gry iyr:2020 hgt:192cm
+hcl:#8117b1 pid:845227725
+
+byr:2028 pid:168cm eyr:1989 ecl:blu hcl:311389 hgt:173cm cid:227
+iyr:2015
+
+byr:1949 hcl:#a97842 hgt:162cm
+pid:100263539 eyr:2027
+ecl:grn iyr:2015
+
+ecl:#6f9669 eyr:2033 byr:2003 hcl:z iyr:2019 pid:223282429
+hgt:172
+
+pid:#8bc2c0 hgt:74cm ecl:zzz hcl:5afd12 eyr:1922
+byr:2019 iyr:1924 cid:50
+
+hcl:#66518f hgt:187cm byr:1989
+eyr:2027 iyr:2018 ecl:blu pid:656263178
+
+pid:257605814 iyr:2013 eyr:2026 ecl:grn hgt:170cm byr:2018 hcl:e9d195
+
+ecl:grt byr:2010 eyr:2033
+pid:35619145
+iyr:2025
+hgt:64cm hcl:z
+cid:221
+
+eyr:1997 pid:221307345 hgt:120
+iyr:2019 ecl:zzz
+byr:2009
+hcl:#fffffd
+
+hgt:192cm byr:1932 cid:213 hcl:#ceb3a1
+ecl:oth iyr:2018
+eyr:2023 pid:232126505
+
+iyr:2020 cid:225
+eyr:2025 pid:456238536 byr:1932 hcl:#fffffd ecl:oth
+hgt:170cm
+
+eyr:2023 pid:113720753 hgt:173cm hcl:#efcc98
+ecl:blu
+byr:1977
+iyr:2010
+
+hcl:#866857 pid:240698984 byr:1973
+ecl:amb iyr:2014 hgt:159cm eyr:2020
+
+eyr:2026
+iyr:2019 pid:150506583 byr:1984 cid:249
+ecl:brn hgt:176cm
+hcl:#18171d
+
+iyr:2012
+hgt:189cm byr:1970
+pid:152682317 eyr:2025 cid:315 ecl:oth hcl:#6b5442
+
+hgt:167cm eyr:1923 hcl:4a53cb pid:392236104 iyr:2018 ecl:gry
+byr:1922
+
+byr:1966 hgt:191cm
+iyr:2011 cid:167
+ecl:brn eyr:2024 hcl:#29000d
+
+byr:1964 hgt:177
+eyr:2037 pid:4494972428 hcl:#7d3b0c ecl:utc cid:205 iyr:2019
+
+hcl:#cfa07d iyr:2028 pid:165cm ecl:#e2a3e0
+cid:147
+eyr:2025
+hgt:169in byr:2010
+
+hgt:162cm
+hcl:#866857
+eyr:2024 byr:1962 iyr:2020
+pid:246010906
+ecl:oth
+
+pid:145361253 ecl:brn iyr:2019 eyr:2025
+hcl:#ceb3a1 hgt:164cm byr:1938
+
+hgt:157cm ecl:#f6feaa iyr:2015
+hcl:#623a2f
+cid:290 eyr:2034
+pid:058787629
+
+hcl:#ceb3a1 iyr:2011
+pid:468547313 cid:175 byr:1991 eyr:2021 hgt:158cm
+ecl:blu
+
+ecl:hzl eyr:2026 pid:448134141 hgt:186cm iyr:2016 byr:1929 hcl:#c0946f
+
+hgt:64cm eyr:2027
+ecl:#277bd0 hcl:df2be7
+iyr:2023
+pid:167286554
+byr:2004
+
+pid:739664020 eyr:2026 hgt:61in
+iyr:2011 byr:1959 ecl:grn
+hcl:#602927
+
+eyr:2039 hgt:183cm hcl:z pid:5208130216
+ecl:blu
+cid:161 iyr:1932 byr:2004
+
+iyr:2015 pid:509173428 eyr:2030 ecl:#14471f hcl:z hgt:177in byr:1994
+
+byr:1951
+iyr:2012 hcl:#733820
+pid:799059999 hgt:70in eyr:2026 ecl:hzl
+
+eyr:2028 byr:1925
+hgt:181cm
+ecl:grn
+iyr:2016
+hcl:#cfa07d pid:558448804
+
+pid:675014385 iyr:2012 ecl:oth hgt:183cm
+hcl:#623a2f byr:1997
+eyr:2026 cid:311
+
+eyr:1972 hcl:c452d2
+ecl:gmt
+byr:2010 iyr:2015
+hgt:66cm cid:266
+pid:021900882
+
+ecl:gry hgt:65in cid:182 hcl:#c0946f
+pid:558235233
+eyr:2027 byr:1946 iyr:2017
+
+hcl:#b6652a pid:846441761 iyr:1971 hgt:59cm eyr:2027 byr:2010 ecl:amb cid:144
+
+cid:77 hgt:180in eyr:2024
+hcl:b6c2c6 pid:159cm iyr:2002
+ecl:#62e506 byr:1976
+
+iyr:1969 eyr:2024 cid:143 pid:#f31765 ecl:brn
+hgt:68cm hcl:7f9598 byr:1949
+
+byr:1964
+hcl:#341e13
+ecl:gry
+hgt:168cm eyr:2028
+iyr:2012 pid:714678484
+
+hgt:185cm eyr:2028
+hcl:#b6652a byr:1945 iyr:2012 ecl:hzl
+
+iyr:2015 hgt:191cm
+ecl:blu hcl:#888785 pid:206356787
+eyr:2021 byr:1920
+
+eyr:1937
+hcl:b3eb9c hgt:175cm
+iyr:2012 ecl:brn pid:62490997 cid:267
+byr:2024
+
+hcl:#866857
+byr:1960
+pid:021105433
+hgt:174cm eyr:2022 iyr:2017
+ecl:blu cid:123
+
+hcl:#ceb3a1 byr:1976 pid:306207321
+iyr:2019
+cid:262 hgt:175cm
+eyr:2025 ecl:oth
+
+byr:1945
+cid:346 eyr:2030 hcl:#1f6f6f iyr:2013
+hgt:65in pid:857729755
+ecl:blu
+
+byr:1934 ecl:oth hgt:174cm
+eyr:2030
+cid:263 hcl:#47e20e pid:545880650
+
+pid:190920088 byr:1995
+hcl:b4f162 iyr:2019 ecl:gry eyr:2020 hgt:176cm
+
+byr:1984 hcl:#7d3b0c
+pid:947573713 hgt:154cm
+ecl:blu
+eyr:2023
+iyr:2017
+
+hcl:#ceb3a1 pid:645117349 cid:213
+eyr:2022 ecl:brn
+iyr:2017 hgt:151cm byr:1997
+
+byr:1929 hcl:#18171d hgt:184cm pid:378639521
+ecl:amb iyr:2018
+eyr:2022
+
+pid:567411452 hgt:158cm byr:1998 eyr:2030 iyr:2013 hcl:#fffffd
+ecl:grn
+
+iyr:1962
+pid:184cm
+eyr:2034 cid:62 ecl:gry hcl:z hgt:156in
+
+eyr:2022 byr:2015 pid:193cm ecl:#ca25ab
+hcl:eb0dfc cid:136
+hgt:150cm
+iyr:1977
+
+pid:087678152
+hcl:#ecdb8b
+hgt:162cm iyr:2015
+eyr:2024
+byr:1939
+ecl:grn
+
+eyr:2024 hgt:150cm iyr:2023 ecl:#ca3855 hcl:#888785 byr:1943
+pid:4402658120
+
+pid:107396492 hcl:#341e13
+hgt:145 ecl:oth iyr:2013
+eyr:2025 cid:128 byr:2023
+
+eyr:2020 hgt:167cm byr:1997 hcl:#888785
+ecl:oth pid:609333522 iyr:2017
+
+pid:172cm
+eyr:1930 iyr:1966 ecl:#f98bd9 hgt:179in hcl:a1d424
+
+ecl:hzl byr:1924 iyr:2018 eyr:2020
+pid:505733566
+hcl:#733820
+hgt:151cm
+
+eyr:2011 pid:176cm hgt:163in iyr:1964
+hcl:z ecl:#9e90ad byr:2010
+
+ecl:brn iyr:2011 pid:932000043 byr:1995 eyr:2025 hgt:150cm
+hcl:#6b5442
+
+pid:347820679
+iyr:2010 ecl:#aa4902 hcl:56faf0 hgt:70cm byr:1923 eyr:2024
+
+ecl:blu
+hgt:160cm iyr:2015 pid:706725204 byr:1987 eyr:2030 hcl:#cfa07d
+
+hcl:#763a5b iyr:2011
+byr:1965 pid:834192733
+cid:302 ecl:blu eyr:2028 hgt:170cm
+
+byr:1967 hgt:193cm
+ecl:hzl
+pid:598436934 cid:262
+iyr:2014 hcl:#b6652a eyr:2021
+
+pid:336728648
+eyr:2030 hcl:#888785
+hgt:150cm ecl:hzl byr:1926
+iyr:2015
+
+pid:073366341 byr:1984 hcl:#cfa07d iyr:2019 hgt:178cm ecl:grn eyr:2026
+
+iyr:1923 pid:19933565 ecl:#16b3c1 hgt:162
+eyr:1945 hcl:e0e20c
+byr:2028
+
+hgt:159in
+pid:171cm eyr:2023 iyr:2022 ecl:#c073e6 hcl:22ed05 byr:2011
+
+byr:2003 eyr:2022
+cid:336 ecl:grt
+iyr:2020 hgt:156cm
+hcl:#c0946f pid:716113144
+
+ecl:hzl
+iyr:2019 hgt:171cm hcl:#9855d4
+byr:1974
+eyr:2025 pid:260661320
+
+hgt:165cm byr:2016 pid:203313454
+iyr:2011
+hcl:z ecl:blu eyr:2023
+
+eyr:2016
+hgt:182cm iyr:2029 byr:2004
+ecl:gmt hcl:25d3a1
+pid:4435010716
+
+ecl:blu
+pid:159928755 hgt:177 hcl:74fd3f eyr:2023 cid:244 byr:1956
+iyr:2016
+
+hcl:#c5c154 iyr:2011 ecl:gry byr:1971 hgt:75in cid:251
+eyr:2025
+
+eyr:2023
+hgt:155cm byr:1943 iyr:2020 ecl:amb hcl:#ceb3a1 pid:591194126
+
+cid:123
+byr:1950 iyr:2022 hgt:154cm ecl:hzl pid:555951199 hcl:#efcc98 eyr:2022
+
+cid:145 iyr:2028
+hgt:163
+byr:2007 ecl:#ca0e61 pid:#b57087 eyr:1985 hcl:#b6652a
+
+ecl:utc
+iyr:1953 eyr:2034 hcl:#602927
+cid:150 pid:166cm hgt:72cm byr:2003
+
+iyr:2012 pid:585191659
+byr:1959 eyr:2027
+hgt:150cm ecl:blu hcl:#888785
+
+ecl:#483899 eyr:2032 pid:#4d59f7 iyr:2020 byr:2005 hcl:a8a13c hgt:140
+
+ecl:brn pid:#8d9fe0 cid:265 byr:2029 hgt:68cm iyr:1989 hcl:4df783 eyr:1990
+
+cid:110 hgt:165cm
+ecl:grn
+iyr:2017 eyr:2025 byr:1923
+
+byr:1986 iyr:2020 hgt:69in pid:815979778 hcl:#ceb3a1 eyr:2027 ecl:blu
+
+pid:345227220
+eyr:2030
+byr:1954 ecl:hzl hcl:#733820 hgt:151cm iyr:2016
+
+hgt:152 byr:2016 ecl:grt hcl:z eyr:1994 pid:463925189
+iyr:2013
+
+hcl:#341e13
+hgt:169cm byr:1990 iyr:2015
+ecl:blu
+eyr:2034 pid:120750202
+
+iyr:2020
+pid:589274468 byr:1995 ecl:blu eyr:2025 hgt:168cm hcl:#888785
+
+hcl:#888785
+hgt:169cm iyr:2016
+byr:1930
+ecl:grn pid:864871732 eyr:2022
+
+eyr:2021 cid:73 hgt:186cm hcl:#8092f6 byr:1957 pid:151353277 ecl:blu iyr:2018
+
+hcl:5afb32 byr:2027 pid:179cm
+cid:222 hgt:59cm ecl:grt eyr:2040 iyr:1980
+
+hcl:#a97842 pid:403342198 eyr:2026
+byr:1976 ecl:gry hgt:150cm
+iyr:2015
+
+hgt:63in eyr:2023 hcl:#6b5442 pid:371994667 iyr:2020 byr:1991 ecl:gry
+
+pid:247978507
+hgt:175cm iyr:2016 eyr:2022
+byr:1945 hcl:#b6652a ecl:gry
+
+hgt:150cm cid:254 hcl:#18171d ecl:blu eyr:2030
+byr:1922
+pid:450204714 iyr:2015
+
+iyr:2016 pid:470585547
+hgt:60in
+eyr:2024 byr:1946
+ecl:oth hcl:#b6652a
+
+iyr:2020 eyr:2026
+hcl:#cfa07d
+pid:524717559 hgt:99
+cid:303 byr:1967 ecl:amb
+
+cid:178 byr:2021 hcl:7234f4 hgt:192in eyr:2038 iyr:2020 pid:466801711 ecl:amb
+
+pid:597934488 iyr:2011 cid:336 hcl:#81434f
+ecl:grt hgt:185cm eyr:2034
+byr:2014
+
+eyr:2038
+byr:2017 hgt:70cm cid:283
+ecl:brn pid:392669975 iyr:2013 hcl:#602927
+
+pid:#c85b65 hgt:60cm iyr:2001 eyr:2035 hcl:e28fae
+ecl:#32a45c byr:1924
+
+iyr:2011 byr:1945 hgt:164cm ecl:gry eyr:2029 hcl:#18171d
+pid:402905843
+
+pid:5602590426 byr:2013 eyr:2024
+ecl:zzz iyr:2014 hgt:173cm
+hcl:#733820
+
+ecl:hzl eyr:1964
+pid:508473248
+byr:1961 hgt:181cm iyr:2020
+hcl:#623a2f
+
+hcl:z hgt:121 pid:635654838 eyr:2020 iyr:1968
+byr:1954
+
+byr:1974 pid:759133744
+iyr:2010 eyr:2027
+cid:266 ecl:hzl
+hgt:153cm
+
+ecl:oth byr:1960
+eyr:2022
+iyr:2014
+hgt:62in hcl:#623a2f pid:155340768
+
+hgt:187cm
+hcl:#866857 pid:725526503 cid:134 iyr:2017 ecl:grn
+byr:1982 eyr:2020
+
+hgt:154cm byr:1953
+ecl:blu pid:212064297
+cid:69 eyr:2022
+hcl:#c0946f iyr:2015
+
+ecl:gry hgt:183cm iyr:2017 pid:995219023 eyr:2025
+byr:1960 hcl:#7d3b0c
+
+byr:1935 ecl:oth cid:235 pid:978368915
+hcl:#b6652a
+iyr:2019 hgt:69in eyr:2028
+
+iyr:2005
+eyr:2028
+hgt:192in hcl:#9ced60 byr:2004
+pid:102299023
+cid:348 ecl:hzl
+
+hcl:6cbe91 pid:191cm iyr:1962
+byr:2007 hgt:192in eyr:1963
+
+pid:020385831 hgt:173cm
+ecl:amb hcl:fdbb66 cid:287
+eyr:2034
+byr:2024 iyr:2018
+
+eyr:2024
+byr:1952 hgt:186cm cid:250
+pid:852070008 ecl:blu
+hcl:#c0946f iyr:2010
+
+ecl:#914e86 pid:164cm hgt:170cm iyr:2011
+byr:2014
+eyr:2026 hcl:z
+
+byr:1952 hgt:176in
+hcl:#e49400
+pid:011105160
+eyr:2026 cid:103 ecl:oth iyr:2011
+
+ecl:#362113 hgt:155in
+pid:859337122 cid:133
+eyr:2025 byr:1997 iyr:2012
+
+ecl:hzl eyr:2025 iyr:2013
+pid:669359650 byr:1922 hcl:#efcc98 cid:149 hgt:169cm
+
+iyr:2028 hgt:177in
+cid:75
+eyr:2036 byr:2007 pid:48265132
+ecl:zzz hcl:z
+
+hgt:66in eyr:2030
+hcl:#623a2f iyr:2010 pid:458699137
+byr:1980
+ecl:amb
+
+hgt:171cm ecl:amb iyr:2011 hcl:#888785 byr:1923 eyr:2020
+pid:312162952
+
+byr:1963
+hcl:#18171d pid:316505921 ecl:blu iyr:2017
+hgt:155cm eyr:2029
+
+ecl:gry
+byr:1973 iyr:2011
+pid:479606625 eyr:2028
+hcl:#888785 cid:108 hgt:160cm
diff --git a/2020/day04/main.go b/2020/day04/main.go
@@ -0,0 +1,98 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"regexp"
+)
+
+func readInput(filename string) (res []map[string]string) {
+	file, _ := os.Open(filename)
+	defer file.Close()
+
+	scanner := bufio.NewScanner(file)
+	matcher := regexp.MustCompile(`(eyr|hgt|hcl|pid|byr|ecl|iyr|cid):([^ ]+)`)
+	passport := make(map[string]string)
+	for scanner.Scan() {
+		line := scanner.Text()
+		if line == "" {
+			res = append(res, passport)
+			passport = make(map[string]string)
+		} else {
+			matches := matcher.FindAllStringSubmatch(line, -1)
+			for _, kv := range matches {
+				passport[kv[1]] = kv[2]
+			}
+		}
+	}
+	res = append(res, passport)
+	return
+}
+
+func main() {
+	input := readInput("./input.txt")
+	// 260
+	fmt.Println(part1(input))
+	// 153
+	fmt.Println(part2(input))
+}
+
+func isValid(pp map[string]string) bool {
+	_, has_cid := pp["cid"]
+	return len(pp) == 8 || (len(pp) == 7 && !has_cid)
+}
+
+func part1(input []map[string]string) (valid_count int) {
+	for _, pp := range input {
+		if isValid(pp) {
+			valid_count += 1
+		}
+	}
+	return
+}
+
+func isValid2(pp map[string]string) bool {
+	valid := isValid(pp)
+	if valid {
+		ok, _ := regexp.MatchString(`^[0-9]{4}$`, pp["byr"])
+		valid = valid && ok && (pp["byr"] >= "1920" && pp["byr"] <= "2002")
+	}
+	if valid {
+		ok, _ := regexp.MatchString(`^[0-9]{4}$`, pp["iyr"])
+		valid = valid && ok && (pp["iyr"] >= "2010" && pp["iyr"] <= "2020")
+	}
+	if valid {
+		ok, _ := regexp.MatchString(`^[0-9]{4}$`, pp["eyr"])
+		valid = valid && ok && (pp["eyr"] >= "2020" && pp["eyr"] <= "2030")
+	}
+	if valid {
+		matcher := regexp.MustCompile(`^([0-9]{2,3})(cm|in)$`)
+		matches := matcher.FindStringSubmatch(pp["hgt"])
+		valid = valid && matches != nil &&
+			((matches[2] == "cm" && matches[1] >= "150" && matches[1] <= "193") ||
+				(matches[2] == "in" && matches[1] >= "59" && matches[1] <= "76"))
+	}
+	if valid {
+		ok, _ := regexp.MatchString(`^#[0-9a-f]{6}$`, pp["hcl"])
+		valid = valid && ok
+	}
+	if valid {
+		ok, _ := regexp.MatchString(`^(amb|blu|brn|gry|grn|hzl|oth)$`, pp["ecl"])
+		valid = valid && ok
+	}
+	if valid {
+		ok, _ := regexp.MatchString(`^[0-9]{9}$`, pp["pid"])
+		valid = valid && ok
+	}
+	return valid
+}
+
+func part2(input []map[string]string) (valid_count int) {
+	for _, pp := range input {
+		if isValid2(pp) {
+			valid_count += 1
+		}
+	}
+	return
+}