Skip to content

Instantly share code, notes, and snippets.

@nwjlyons
Created December 10, 2020 18:33
Show Gist options
  • Save nwjlyons/28655d4c10373dcb33d4d1b659b0e483 to your computer and use it in GitHub Desktop.
Save nwjlyons/28655d4c10373dcb33d4d1b659b0e483 to your computer and use it in GitHub Desktop.
Advent Of Code Day Four Part Two
ecl:hzl byr:1926 iyr:2010
pid:221225902 cid:61 hgt:186cm eyr:2021 hcl:#7d3b0c
hcl:#efcc98 hgt:178 pid:433543520
eyr:2020 byr:1926
ecl:blu cid:92
iyr:2010
iyr:2018
eyr:2026
byr:1946 ecl:brn
hcl:#b6652a hgt:158cm
pid:822320101
iyr:2010
hgt:138 ecl:grn pid:21019503 eyr:1937 byr:2008 hcl:z
byr:2018 hcl:z eyr:1990 ecl:#d06796 iyr:2019
hgt:176in cid:75 pid:153cm
byr:1994
hcl:#ceb3a1 hgt:176cm cid:80 pid:665071929 eyr:2024 iyr:2020 ecl:grn
cid:280 byr:1955 ecl:blu hgt:155cm hcl:#733820
eyr:2013 iyr:2011 pid:2346820632
hcl:#4a5917 hgt:61cm
pid:4772651050
iyr:2026 ecl:brn byr:2015 eyr:2026
iyr:2019 hcl:#a97842 hgt:182cm eyr:2024 ecl:gry pid:917294399 byr:1974
ecl:#9c635c pid:830491851 hgt:175cm cid:141
iyr:2010
hcl:z
byr:2026 eyr:1998
byr:1927 iyr:2011 pid:055176954 ecl:gry hcl:#7d3b0c eyr:2025 hgt:166cm
hcl:#733820 byr:2008 ecl:utc eyr:1920 pid:159cm hgt:66cm iyr:2030
pid:027609878
eyr:2022 iyr:2012
byr:1960 hgt:157cm
hcl:#b6652a
cid:117
ecl:grn
iyr:2025 pid:7190749793 ecl:grn byr:1984 hgt:71in hcl:c41681
cid:259 eyr:1928
eyr:2029 pid:141655389 cid:52 hcl:#cfa07d iyr:2019
ecl:blu hgt:69in byr:1938
eyr:2020 hgt:166cm
ecl:gry
pid:611660309 iyr:2011
hcl:#623a2f byr:1943
hgt:190cm eyr:2022 byr:2000 cid:210 pid:728418346 hcl:#a97842 ecl:xry iyr:2015
byr:1973 eyr:2028 iyr:2012
hcl:#ff0ec8 pid:740554599 ecl:amb cid:58 hgt:155cm
iyr:2016 pid:922938570 ecl:oth hcl:#fffffd hgt:154cm eyr:2021 byr:1966
ecl:amb
byr:1929
hcl:#c3bbea pid:511876219
iyr:2019
hgt:191cm
eyr:2026
ecl:utc hgt:155cm pid:#9f0a41 iyr:2012 hcl:#bd4141
byr:1998 eyr:2020
ecl:grn hgt:173cm cid:321 pid:851120816 byr:1968 hcl:#a97842 eyr:2027
iyr:2014
hgt:155cm hcl:#f40d77 pid:038224056 byr:1953 ecl:brn iyr:2014
eyr:2022
pid:181869721
iyr:2011 hgt:151cm hcl:#733820 cid:110 ecl:blu
byr:1931 eyr:2024
byr:1948
hcl:#888785
hgt:74in
cid:112 ecl:hzl pid:921761213 eyr:2028
iyr:2015
ecl:gry
byr:1931
pid:600127430 hcl:#341e13 eyr:2027
iyr:2013 hgt:173cm
hgt:178cm pid:530791289 hcl:#6b5442
eyr:2022 byr:1979 iyr:2014 ecl:hzl
pid:412193170 hcl:#cfa07d hgt:186cm iyr:2012 cid:284 eyr:2020 byr:1967
ecl:grn
hcl:#6b5442
iyr:2015 pid:808448466 ecl:blu eyr:2022 hgt:159cm byr:1969
eyr:2020
iyr:2019 hgt:170cm pid:8964201562 hcl:#6b5442 byr:1947 ecl:amb
eyr:2029 ecl:hzl hcl:#866857 byr:1961
iyr:2017
ecl:#3456ba eyr:2013 iyr:2020 pid:378280953
hcl:z hgt:174cm
hgt:172cm
cid:202 ecl:oth eyr:2021 byr:1980
iyr:2012
hcl:#cfa07d pid:605707698
cid:281 hgt:161cm iyr:2017 pid:122936432 hcl:#602927 byr:1981 ecl:gry eyr:2021
byr:1959 hgt:193cm pid:083900241 iyr:2020 eyr:2037 hcl:#623a2f
ecl:hzl
iyr:2030 hgt:153cm eyr:2022 hcl:#efcc98 cid:131
byr:2016 ecl:hzl pid:64053944
hgt:172cm eyr:2025
hcl:#866857
byr:1938 ecl:dne
pid:192cm iyr:2014
pid:016297574 cid:152 iyr:2015
eyr:2024 hcl:#341e13 byr:1965 hgt:175cm
ecl:oth
pid:604330171 cid:125 byr:1974 hgt:160cm iyr:2014
eyr:2022 ecl:oth hcl:#6b5442
pid:59747275
byr:2027
hgt:145
hcl:1fd71f iyr:1944 eyr:2037 ecl:brn
iyr:2010
eyr:2021 byr:1953
pid:7098774146 ecl:brn hcl:98737d hgt:158cm
hcl:#602927 eyr:2039 pid:#81a5a1 iyr:2012 cid:67 byr:1951
ecl:#6551f5 hgt:76cm
hgt:170cm ecl:oth
cid:235 eyr:2022
byr:1929 iyr:2019
hcl:#341e13 pid:797557745
iyr:2011
hcl:#733820
eyr:2022 pid:830183476 ecl:blu byr:1976 cid:157 hgt:75in
hgt:164cm ecl:amb pid:653425455 hcl:#623a2f byr:1977 eyr:2020
iyr:2013
byr:2009 eyr:1953 hgt:178cm pid:#5d02f0
hcl:#a97842 iyr:2016
ecl:amb
pid:009643210 eyr:2036 ecl:zzz
cid:97 hcl:32e540 byr:2005 hgt:187cm iyr:2021
pid:155cm
iyr:2022 byr:2024 eyr:2031 ecl:amb cid:79
hcl:#cfa07d hgt:69cm
cid:176 ecl:oth
pid:688645779 byr:1933 eyr:2026 hgt:69cm
iyr:2016 hcl:#888785
hcl:#888785
eyr:2027
iyr:2020 pid:802243213 ecl:brn
hgt:179cm byr:1976
hcl:#6cad3e hgt:164cm byr:1982 iyr:2020
ecl:gry
pid:142160687 eyr:2023
hcl:#18171d
hgt:153cm
iyr:2014 ecl:hzl cid:231 pid:167809118 byr:1997 eyr:2028
byr:1940
ecl:hzl iyr:2016 cid:67 hcl:#c800da
pid:563956960 eyr:2021
hgt:189cm
pid:133094996 eyr:2032 hgt:60cm hcl:#623a2f byr:2030 ecl:dne iyr:2023
pid:65195409 hcl:d0d492
iyr:1956
byr:2019 ecl:#bb043f eyr:2031 hgt:167in
iyr:2016 byr:2006 ecl:#35d62f eyr:2029
hgt:186cm
hcl:1d8307
eyr:1935 iyr:1960 pid:346667344 ecl:grn hgt:170cm hcl:cfcc36
ecl:oth byr:1979 pid:165581192
hgt:177cm
hcl:#c0946f
iyr:2011
iyr:2011 eyr:2030 pid:250840477
byr:1934 cid:174 hgt:179cm hcl:#866857
ecl:blu
hgt:157cm hcl:#7d3b0c eyr:2027 pid:979510046
ecl:oth
iyr:2025
hgt:69
ecl:grt byr:1935
eyr:1928 pid:168cm
cid:271 hcl:z
pid:998166233
iyr:2020 hgt:166cm ecl:amb byr:1995 hcl:#fffffd
hcl:#ceb3a1 ecl:amb
iyr:2019
eyr:2024 hgt:184cm byr:1980 pid:839215481
cid:146
byr:1967
pid:444303019 ecl:oth hgt:150cm eyr:2024
eyr:2023 byr:1960 iyr:2010
cid:236 hcl:#733820 pid:900635506
hgt:69in
ecl:hzl
eyr:2029 pid:969574247
hgt:150cm byr:1967
iyr:2010 ecl:blu
pid:575879605 iyr:2010
ecl:hzl
byr:1963
hgt:151cm
hcl:#c0946f cid:277
byr:1998 pid:621374275
ecl:brn hcl:z iyr:2029
eyr:2024
hgt:68cm
pid:365407169 ecl:amb hcl:#87f433 iyr:2011 eyr:2021 byr:1987
hgt:175cm cid:201
hgt:175cm iyr:2020
ecl:gry
eyr:2029 pid:806927384 cid:59
byr:1932 hcl:#888785
pid:589898274 cid:113 hcl:z hgt:184cm eyr:2000
ecl:lzr iyr:2016 byr:2016
ecl:#2bafbb
eyr:2038 iyr:2027
hcl:#fffffd
hgt:174 byr:2007
pid:093750113
eyr:2022 hgt:59in
hcl:#ceb3a1
pid:159921662 ecl:gry
byr:1948 iyr:2014
cid:50
hgt:190cm
iyr:2014 pid:480507618 hcl:#fffffd byr:1945 eyr:2029
byr:1951 hgt:152cm ecl:brn iyr:2016 eyr:2029 cid:179 pid:027575942
hcl:#fffffd
cid:198 pid:728480773 eyr:2028 hgt:153cm iyr:2018
hcl:#888785 ecl:amb byr:1983
byr:1968 hcl:#c0946f ecl:grn eyr:2027
iyr:2013 pid:269749807
cid:227
hgt:178cm
eyr:2024 hgt:185cm ecl:oth
hcl:#448ace byr:1987 iyr:2018 pid:454243136
byr:1930 ecl:grn iyr:2018 hgt:158cm
hcl:#341e13 eyr:2021
eyr:2024 cid:194 pid:425431271
hgt:169cm ecl:grn byr:1973
iyr:2014 hcl:#fffffd
ecl:grn cid:110 iyr:2013 hcl:#18171d
hgt:155cm eyr:2024 byr:1962 pid:522435225
byr:1934 ecl:hzl hgt:152cm iyr:2018
eyr:2024 pid:079740520
ecl:grn eyr:2023 hcl:c3f119 pid:468039715 iyr:2013 hgt:150cm byr:1955
pid:809357582 eyr:2025 byr:1958
hcl:#6b5442 iyr:2013
hgt:161cm ecl:hzl
hcl:#b6652a pid:068979430 byr:1960 iyr:2010 ecl:grn hgt:159cm eyr:2021
cid:105 pid:495292692 byr:1965
hcl:#ceb3a1 hgt:160cm ecl:amb
iyr:2020
iyr:2010
eyr:2024 byr:1941 ecl:grn hcl:#b35770 hgt:171cm cid:132 pid:975699036
pid:767448421 hgt:186cm hcl:#733820
byr:1972 iyr:2020 eyr:2026 ecl:grn
pid:036236909 iyr:2012
hgt:181cm hcl:#888785
eyr:2026
ecl:hzl byr:1936
hgt:173cm
byr:1923 ecl:blu
eyr:2026 pid:570818321
hcl:#733820 iyr:2016
cid:59
pid:2711059768
byr:2024
cid:139 ecl:blu hcl:z hgt:60cm
eyr:2025
pid:671193016
byr:1950 hcl:#6b4b25 iyr:2017 hgt:158cm ecl:blu
hgt:175cm iyr:2015 ecl:amb
byr:1984 eyr:2026 pid:342782894
cid:140
iyr:2019 eyr:2027 byr:1972
pid:196266458
hgt:158cm hcl:#7d3b0c cid:69
pid:604018034 iyr:2016 ecl:brn eyr:2028 hgt:172cm hcl:#6b5442 byr:1922
cid:238
eyr:2024 ecl:gry byr:1970 pid:356551266 cid:340 hgt:162cm iyr:2013
ecl:amb
hgt:151cm hcl:#18171d byr:1921 pid:187276410 eyr:2030 iyr:2015
eyr:2030 pid:056372924 hcl:#d236d9 hgt:156cm
iyr:2014 ecl:blu
iyr:2014 eyr:2028 byr:1991
hcl:#b6652a pid:119231378 hgt:155cm ecl:blu
cid:77
hcl:#341e13
eyr:2027
iyr:2012 ecl:grn hgt:152cm pid:405955710 byr:1970
iyr:2013 hgt:180cm eyr:1978 ecl:amb byr:1929 pid:3198111997 hcl:z
pid:32872520 ecl:#8a0dd4 iyr:1955 eyr:2036
byr:2027 cid:133 hcl:z hgt:184in
hgt:152cm pid:402361044
hcl:#efcc98 eyr:2029 ecl:grn iyr:2014
byr:1960
byr:1972 eyr:2026 pid:411187543 iyr:2014
hgt:184cm cid:211 hcl:#866857 ecl:brn
ecl:brn
hcl:#efcc98
pid:311916712
byr:1957 hgt:151cm eyr:2020 iyr:2020
iyr:1968
hcl:a28220
pid:#ed250d cid:240 eyr:2031
hgt:181cm ecl:xry
ecl:grn byr:1946 hgt:172cm iyr:2010 hcl:#b6652a pid:372011640 eyr:2026
ecl:brn
eyr:2026 byr:1980 hcl:#c0946f
hgt:151cm pid:153076317 iyr:2012
byr:1966 pid:852999809 ecl:oth
hgt:163cm
iyr:2014 eyr:2029 hcl:#341e13
ecl:blu
byr:1959 hgt:191cm pid:195095631 iyr:2016 hcl:#ceb3a1 eyr:2028
byr:2001 ecl:gry hcl:#888785 iyr:2018 hgt:177cm pid:576714115
iyr:2017
byr:1949
ecl:blu hgt:186cm cid:289 pid:859016371
hcl:#ceb3a1 eyr:2021
byr:1999 hcl:#b6652a eyr:2023
hgt:175cm
ecl:gry iyr:2013 cid:165 pid:194927609
hgt:70in eyr:2027 ecl:brn iyr:2012 pid:162238378 hcl:#ceb3a1 byr:1986
hgt:63in ecl:xry
byr:2011 iyr:2024
hcl:5337b0
hcl:#341e13 eyr:2029
hgt:184cm ecl:amb iyr:2012
byr:1970
byr:1920 pid:472914751
eyr:2028
hgt:187cm hcl:#cfa07d cid:290 ecl:gry
byr:1948 ecl:gry eyr:2025 hgt:151cm cid:276 hcl:#6b5442 pid:937979267
iyr:2016
byr:1934
pid:626915978 hcl:#623a2f hgt:167cm ecl:gry
iyr:2020 eyr:2023
byr:1949
hgt:68in eyr:2027 iyr:2019 hcl:#733820 ecl:brn cid:237
pid:057797826
pid:155cm
hgt:68cm ecl:lzr hcl:z cid:344 eyr:2028 iyr:2020 byr:2017
byr:1959
hcl:#341e13 eyr:2022
iyr:2019 pid:728703569
hgt:167cm
ecl:oth
ecl:grn
eyr:2024 byr:1999
pid:566956828
iyr:2015 cid:293 hcl:#602927 hgt:192cm
byr:1939
ecl:xry pid:929512270 hgt:66in iyr:1939 eyr:2030 hcl:#efcc98
eyr:2026
iyr:2014
pid:176cm hcl:#fffffd
ecl:gry
hgt:151cm byr:1933
cid:256
ecl:oth eyr:2025 iyr:2017 hgt:159cm pid:055267863 cid:55 byr:2001 hcl:#cfa07d
eyr:2029 byr:1954 ecl:hzl cid:123 iyr:2020 hgt:192cm hcl:#866857
pid:225593536
pid:320274514 cid:289 byr:1963
eyr:1942
ecl:gmt hcl:z hgt:167in iyr:2022
byr:2013
ecl:gmt
iyr:2011
hcl:#733820 pid:#e7962f
hgt:178cm eyr:2029
pid:154cm ecl:hzl
eyr:2035 byr:2023 cid:104 iyr:2026
eyr:2024 ecl:hzl hcl:#7d3b0c iyr:2010
pid:105864164
byr:1955
hgt:163cm
eyr:2021 hgt:151cm
iyr:2017 hcl:#c0946f
ecl:amb
cid:150
pid:296798563
byr:1953
iyr:2012
byr:1990 hcl:#341e13
pid:189449931 eyr:2024 hgt:64in
hcl:z cid:79 byr:2028
eyr:2028 pid:886152432
ecl:#ce0596 hgt:178cm
iyr:2029
ecl:brn
iyr:2019 hgt:151cm
hcl:#341e13
byr:1969
pid:468846056
eyr:2022
ecl:grn hgt:157cm iyr:2012
eyr:2020
hcl:#b6652a cid:338
byr:1954 pid:153867580
iyr:2011
eyr:2027
byr:1935
hgt:151cm
ecl:blu pid:802665934 cid:276 hcl:#623a2f
hcl:#efcc98 eyr:2026 ecl:amb
iyr:2014 pid:320160032
hgt:157cm
byr:1976
eyr:2021 cid:172
iyr:2012 ecl:oth hgt:187cm
pid:432856831 byr:2001 hcl:#733820
eyr:2028 ecl:amb hcl:#efcc98
iyr:2020 byr:1954 hgt:153cm
byr:1930 ecl:brn hcl:#fffffd
pid:458840035 hgt:178cm eyr:2021
iyr:2011 cid:336
pid:216876576 hcl:#341e13
eyr:2028 iyr:2018 hgt:177cm byr:1938
ecl:brn cid:214
byr:2029 eyr:1987
hgt:75cm pid:193cm hcl:#b6652a cid:246 iyr:2028
ecl:hzl hgt:151cm hcl:#7d3b0c
eyr:2030 pid:910999919
iyr:2019 byr:1956
byr:1950
cid:95 iyr:2013 ecl:grn
eyr:2020 hcl:#623a2f
pid:603817559 hgt:159cm
pid:913791667
iyr:2018 byr:1959 hcl:#a97842 hgt:179cm eyr:2029 ecl:gry
hgt:71in
ecl:blu eyr:2028
hcl:#18171d byr:1937 iyr:2011 pid:951572571
hcl:#b6652a iyr:2015 hgt:170cm ecl:blu cid:292
byr:1977 pid:475457579 eyr:2020
ecl:amb eyr:2029
pid:530769382 iyr:2018 cid:53
hgt:63in
byr:1954 hcl:#07de91
hcl:#cfa07d hgt:185cm
byr:1929 iyr:2011
eyr:2027
iyr:2019 ecl:oth byr:2023 hcl:#341e13 pid:879919037
eyr:2030 hgt:174cm
hcl:z hgt:182cm ecl:grn iyr:2010 eyr:2020 pid:2063425865
cid:182
byr:2019
byr:1930 hgt:185cm pid:412694897 eyr:2025 ecl:brn iyr:2020
hcl:#a97842
hgt:150cm byr:1955 eyr:2020 cid:149 pid:597600808
hcl:#ceb3a1
ecl:hzl
pid:209568495
eyr:2026 byr:1928 hcl:#341e13 hgt:183cm ecl:brn iyr:2011
pid:723789670 ecl:blu iyr:2013 byr:1933
cid:239 hcl:#7d3b0c eyr:2026 hgt:151cm
byr:1978 eyr:2027 hgt:164cm
pid:009071063
hcl:#602927 iyr:2014 ecl:blu
hcl:#18171d ecl:grn hgt:154cm cid:154 iyr:2016
byr:1952 pid:730027149 eyr:2024
eyr:2025 hcl:#888785 iyr:2013 cid:90
byr:1975 ecl:grn
pid:619198428 hgt:161cm
ecl:gry iyr:2013 pid:795604673 cid:198 byr:1962
hcl:#6b5442 hgt:64in eyr:2021
hcl:#ceb3a1 ecl:oth iyr:2015
eyr:2021 pid:920586799 cid:302 hgt:60in
byr:1964
eyr:2021 ecl:gry iyr:2019
hcl:#6b5442 hgt:192cm
byr:1996
pid:692698177
ecl:grn pid:141369492 byr:1956 eyr:2028 hcl:#6b5442 hgt:190cm iyr:2014
hcl:#6b5442
ecl:grn iyr:2020 hgt:153cm
pid:312738382 eyr:2028
byr:1985
byr:1979
eyr:2021 ecl:gry hgt:175cm pid:787676021 cid:81 hcl:#b6652a iyr:2012
cid:80 hgt:188cm byr:1964 pid:105773060 iyr:2014 hcl:#733820 ecl:gry eyr:2028
byr:1960 pid:251870522 iyr:2018 hgt:168cm ecl:blu hcl:#c0946f eyr:2026
cid:270
pid:#5661f0 hgt:182in
ecl:dne
byr:1930
hcl:z iyr:2026
hcl:#888785 byr:1954 pid:170544716 eyr:2028 hgt:162cm cid:244
iyr:2014
ecl:grn
iyr:2017
hgt:69in
ecl:hzl
pid:544135985 hcl:#ceb3a1 eyr:2020
hcl:92d4a1 iyr:2018 pid:178cm
cid:347
hgt:97 eyr:2017
ecl:gmt byr:2004
ecl:oth iyr:2018 hcl:#fffffd byr:1999 pid:853396129
cid:119 eyr:2026 hgt:178cm
hgt:69in
hcl:#fffffd eyr:2026 byr:1922
iyr:2010 ecl:oth pid:664840386
hgt:178cm
byr:2000
iyr:2013 hcl:#cfa07d
eyr:2028 pid:842454291
ecl:amb
ecl:hzl
hcl:#733820 pid:316835287 byr:1998
eyr:2024
iyr:2015 hgt:165cm
pid:684064750 byr:1928 ecl:gry iyr:2015 cid:343
hgt:189cm
hcl:#4c6cb4 eyr:2020
byr:1923 hcl:#a97842 eyr:2024 ecl:gry
pid:095911913
hgt:185cm iyr:2010
ecl:hzl
byr:1996
eyr:2023
hgt:177cm
hcl:#b6652a pid:011541746
iyr:2011
hcl:#efcc98
iyr:2014 ecl:oth byr:1942 pid:730960830
hgt:183cm
eyr:2025
byr:1939 eyr:2029 ecl:amb hcl:#fffffd
hgt:188cm pid:732730418 iyr:2013 cid:313
hgt:164cm cid:217 byr:1985 hcl:#888785 eyr:2020
iyr:2014 ecl:oth
pid:071172789
eyr:2024 pid:215897274 ecl:#c67898
byr:1972 hcl:#866857 iyr:2010 hgt:170cm cid:310
ecl:hzl pid:030118892 byr:1941 hgt:158cm hcl:#b6652a
eyr:2029 iyr:2012
ecl:gry hcl:#c0946f hgt:166cm pid:604313781
byr:1924 eyr:2023 iyr:2020
hcl:#602927 hgt:168cm eyr:2027 ecl:brn
pid:764635418 byr:1968 iyr:2010
pid:157933284
ecl:grn
eyr:2030 byr:2000
hgt:81 hcl:z
hcl:#ec24d1
pid:647881680 byr:1922
hgt:178cm iyr:2020 ecl:amb eyr:2021 cid:94
ecl:hzl byr:1971 iyr:2018 pid:975690657 eyr:2027
hgt:192in
cid:202 hcl:#c0946f
pid:678999378
hgt:61in
byr:1981 hcl:#cfa07d eyr:2029 iyr:2014
ecl:oth
eyr:2022 iyr:2012 ecl:grn pid:883419125
hcl:#ceb3a1
cid:136 hgt:75in
byr:1952
iyr:2018 hgt:185cm
byr:1985 pid:119464380 eyr:2028 hcl:#623a2f ecl:gry
eyr:2025 hcl:#ceb3a1 byr:1953
cid:277 hgt:164cm iyr:2010 pid:574253234
cid:252 ecl:amb pid:594663323
hgt:75in hcl:#cfa07d iyr:2019
eyr:2026 byr:1964
iyr:2026 hcl:z pid:60117235 ecl:lzr
byr:2016 hgt:156in eyr:1994
pid:448392350
eyr:2022 hcl:#a97842
hgt:157cm
ecl:hzl
iyr:2018 byr:1973
ecl:brn
byr:1951
eyr:2028
hcl:#7d3b0c iyr:2018 hgt:164cm
hgt:156cm
byr:1963
iyr:2014 eyr:2020 ecl:blu hcl:#ceb3a1
pid:#a87d16
pid:447170366 ecl:blu hcl:#888785
iyr:2012 cid:236
hgt:167cm
eyr:2022 byr:1942
hcl:#623a2f
eyr:2020 iyr:2017 cid:128 ecl:amb pid:279550425
byr:1983 hgt:154cm
byr:2014 eyr:2034 hgt:176in hcl:z
ecl:#d4e521
pid:3629053477 cid:177
iyr:1970
pid:30370825 byr:1966 eyr:2026
iyr:2026 hcl:#866857
cid:346 ecl:#f7c189
iyr:2010 pid:271066119 eyr:2023 hcl:#efcc98 hgt:179cm byr:1956
byr:1966 hgt:156cm pid:977897485 cid:287 iyr:2011 hcl:#b6652a ecl:amb eyr:2029
cid:211 ecl:gmt byr:2017
hcl:z eyr:2029 hgt:180in iyr:2021 pid:81920053
byr:2019
pid:5229927737 hcl:75b4f1 hgt:146 iyr:2026 ecl:#92cf7d eyr:2032
eyr:2027 pid:604671573
ecl:hzl
hgt:189cm byr:1979
hcl:#efcc98 iyr:2020
iyr:2018 cid:192
eyr:2029 ecl:grn
pid:653764645 hgt:179cm
hcl:#341e13 byr:1927
byr:2012
iyr:2015
hcl:#b6652a
pid:168500059 eyr:2038 cid:234 hgt:191cm ecl:zzz
ecl:gry hcl:#623a2f byr:1925
iyr:2016
eyr:2028 cid:157
hgt:154cm
pid:196280865
cid:319 pid:928322396 ecl:gry
byr:1949
eyr:2028
hcl:#341e13 hgt:171cm
iyr:2018
byr:2023
iyr:1953 hgt:154cm ecl:dne
hcl:#888785
pid:066246061 eyr:1983
hcl:z
iyr:2016 byr:1986 ecl:utc
hgt:179cm eyr:2019 pid:583251408
ecl:amb iyr:2014 pid:499004360
byr:1927 eyr:2021 hgt:193cm hcl:#ceb3a1
pid:631303194 ecl:gry
hcl:#18171d cid:216 iyr:2019
eyr:2024 hgt:178cm
hcl:#341e13 cid:201
byr:1949 iyr:2019 ecl:gry pid:372356205
eyr:2024
hcl:#18171d
pid:867489359
hgt:185cm
iyr:2020 ecl:amb
eyr:2030
byr:1955
byr:1991
ecl:brn eyr:2025 hgt:184cm iyr:2016 pid:202216365
ecl:xry pid:#524139 hgt:151cm hcl:z eyr:2031 byr:2030 iyr:2005
byr:1971 hgt:178cm ecl:amb hcl:#ceb3a1
iyr:2010
eyr:2026 pid:396974525
iyr:2014
hgt:177cm pid:928522073
eyr:2022
ecl:hzl
hcl:#c0946f byr:1983
hgt:167cm hcl:#ceb3a1 iyr:2014
pid:172415447
eyr:2020 byr:1956
iyr:2011 hgt:188cm byr:1947 eyr:2020 pid:667108134 ecl:amb hcl:#44a86b
cid:302 ecl:brn pid:292483175 hgt:154cm
byr:1997
eyr:2026
iyr:2014 hcl:#623a2f
hgt:171cm
iyr:2014 hcl:z ecl:hzl pid:321513523 eyr:2027 cid:146
byr:2001
eyr:1956 ecl:dne hgt:75cm hcl:82e1fa
iyr:2030 byr:2027
eyr:2020
iyr:2011 pid:656669479 ecl:oth hgt:151cm hcl:#efcc98 byr:1981
iyr:2013
byr:1934
pid:142890410 hgt:62in
eyr:2022
hcl:#87cca4
ecl:hzl
pid:006232726
hgt:173cm ecl:hzl cid:110
eyr:2026 hcl:#866857 iyr:2017 byr:1992
cid:208
iyr:2014 ecl:brn eyr:2024 byr:1935 hgt:187cm
hcl:#b6652a
pid:770836724
iyr:2014 cid:144 hgt:169cm
eyr:2022
ecl:oth
pid:117575716 hcl:#fffffd byr:1926
byr:1971 ecl:brn
hcl:#733820 eyr:1942 iyr:2013
pid:606274259 hgt:163cm cid:196
byr:1964
pid:997828217 eyr:2029 iyr:2017 ecl:blu hcl:#341e13
hgt:158cm
pid:568202531 hcl:#efcc98 hgt:154cm eyr:2029 iyr:2010
byr:1946
ecl:blu
iyr:2011
pid:619355919
byr:1955
ecl:brn hcl:#888785 eyr:2030 hgt:155cm
ecl:hzl pid:367152545
hgt:162cm
cid:221 hcl:#866857
eyr:2024
byr:1997 iyr:2019
hgt:157in
cid:268 hcl:32371d byr:2020
ecl:zzz pid:1081234390
ecl:hzl eyr:2026
byr:1969 pid:850482906 cid:166 hcl:#602927 hgt:60in
iyr:2019
hcl:#c0946f
hgt:176cm
ecl:brn eyr:2026 iyr:2018 cid:172 byr:1986 pid:172963254
ecl:grn iyr:2016
hgt:187cm
byr:1983
hcl:#efcc98
pid:722084344 eyr:2025
ecl:oth hcl:#341e13 pid:130312766 hgt:171cm iyr:2018 byr:1927 eyr:2024
byr:2021 hgt:152cm hcl:74dda6
eyr:1984 cid:216
iyr:2018 pid:95283942
hcl:#b6652a pid:924778815 iyr:2017 ecl:gry
eyr:2035
hgt:68cm
iyr:2010
hcl:#efcc98 ecl:brn eyr:2020 pid:801894599 hgt:163cm byr:1959
pid:798701070 eyr:2030
hcl:#866857 ecl:hzl hgt:169cm byr:1994 cid:219 iyr:2010
pid:#e9b41b
hcl:#341e13 byr:1970
iyr:2014
ecl:oth cid:266 hgt:68cm eyr:2023
byr:1931 pid:929960843 hgt:187cm hcl:#6b5442 cid:52 iyr:2010 eyr:2024 ecl:brn
iyr:2017 byr:1974
ecl:hzl cid:243 pid:66053995 hgt:147 eyr:1920 hcl:z
iyr:2012 byr:1962 ecl:brn pid:773399437 hcl:#341e13
eyr:2026
pid:738442771 hgt:186cm eyr:2027 hcl:#efcc98 iyr:2013
ecl:brn byr:1928
pid:855794198
ecl:oth
hgt:67in
cid:81
iyr:2011 hcl:#b6652a eyr:2020
byr:1921
hcl:176abf hgt:161in
byr:2002 iyr:2016 eyr:2027 pid:639047770 ecl:brn
cid:178
pid:335686451
hcl:#86c240 iyr:2017 hgt:190cm byr:1968 ecl:amb
hgt:150cm
hcl:094a87 ecl:#09c463 eyr:1926 pid:537511570 byr:2009
iyr:1998
hgt:74in
pid:927963411
eyr:2026 ecl:gry cid:323 iyr:2012 hcl:#fffffd byr:1959
iyr:2018 byr:1978
hcl:#ff1829 eyr:2023
pid:823129853 ecl:hzl
hgt:65in
pid:189cm
ecl:#00391e hgt:72cm hcl:11050f
byr:2029
eyr:1994
iyr:1935
cid:186
ecl:grn byr:1942 pid:217290710 hgt:181cm eyr:2021 hcl:#7d3b0c iyr:2019 cid:320
byr:1983 iyr:2013 cid:122 hcl:#ceb3a1 eyr:2030 hgt:59in ecl:grn pid:946451564
ecl:amb
cid:236 hgt:184cm
hcl:#cfa07d iyr:2017 pid:934730535 eyr:2021 byr:2002
byr:1950 ecl:hzl eyr:2030 hcl:#623a2f pid:742249321
hgt:158cm iyr:2018
byr:1946 eyr:2021 hcl:#a97842 pid:204671558 ecl:grn
iyr:2010 hgt:187cm
hcl:#b6652a pid:528124882 hgt:162cm byr:1924 ecl:amb iyr:2027 cid:157
eyr:2028
hgt:180cm iyr:2013 byr:1926 pid:232265934 hcl:#602927 ecl:oth
byr:1984 ecl:brn
iyr:2016 pid:756596443 eyr:2030 hcl:#7d3b0c hgt:183cm
hgt:185cm
hcl:#fffffd byr:1991 eyr:2023 iyr:2014
ecl:amb
pid:759105859
cid:82 iyr:2012 hgt:160cm eyr:2022 pid:593798464 ecl:gry hcl:#4e7571 byr:1983
pid:478427550
iyr:2010
ecl:amb byr:1969 hgt:68in cid:94 eyr:2021 hcl:#866857
ecl:amb iyr:2019 byr:1986 hgt:170cm
hcl:#c0946f
pid:779205106 eyr:2027
ecl:brn eyr:2025 byr:1925
hcl:#7d3b0c hgt:76in pid:576353079 iyr:2010
hgt:175cm hcl:4bf5ae ecl:amb
eyr:2029 pid:173cm cid:329
iyr:1952 byr:1972
ecl:grn
eyr:2030
iyr:2015 hcl:#c0946f
byr:1989
hgt:178cm
pid:287209519
pid:834505198 byr:1985 ecl:gry eyr:2024
cid:295 hgt:169cm iyr:2017
hgt:170cm
pid:054644831 eyr:2023 iyr:1949 ecl:amb
hcl:#888785
byr:1955
hgt:171cm
pid:947263309 iyr:2015 byr:1944 eyr:2027 ecl:grn cid:79 hcl:#341e13
eyr:1982
cid:147
iyr:2015
hgt:70cm hcl:a77c10 ecl:zzz byr:2007
pid:161cm
ecl:gry byr:1933
hcl:#c0946f pid:483275512 iyr:2012 eyr:2025 hgt:161cm
eyr:1985 hgt:176cm hcl:7b6ddc iyr:2012 cid:326 byr:1973 pid:929418396 ecl:gmt
ecl:gry
byr:1971
hgt:184cm
eyr:2027 hcl:#3adf2c iyr:2017 cid:210
pid:693561862
eyr:2021 pid:779298835 byr:1921 hgt:193cm ecl:amb
iyr:2016 hcl:#ceb3a1
hcl:4a1444
byr:2019 iyr:2024 hgt:182in
cid:87 ecl:#122264
pid:181cm
eyr:1927
cid:267 ecl:amb eyr:2020 byr:2000
hcl:#18171d iyr:2012 hgt:190cm pid:18525759
ecl:oth byr:1988
iyr:2019 pid:660570833
hcl:#866857 hgt:176cm
eyr:2030 hcl:#866857
byr:1967 cid:316 pid:560346474 iyr:2015
hgt:160cm
ecl:gry
ecl:hzl
iyr:2014 hgt:164cm hcl:#733820 eyr:2025
pid:106302413 byr:1920
iyr:2016 pid:515066491
ecl:grn eyr:2026 hgt:179cm hcl:#b6652a byr:1982
ecl:#7de6a0
iyr:2004 eyr:1955 hgt:154cm cid:138 byr:2004
pid:758934555
hcl:a21980
pid:#2a21e0 ecl:#1b9b27 hgt:165in
byr:1998 iyr:2014 eyr:2032
eyr:2021 hgt:184cm pid:431054313 hcl:#ceb3a1 cid:109 byr:1977 ecl:blu
iyr:2011
pid:006339126 hgt:177cm
cid:188 hcl:#a97842
iyr:1959
ecl:xry
byr:2000
ecl:hzl eyr:2029
iyr:2011 hcl:#866857 hgt:74in
import re
import unittest
from typing import Optional
class Passport:
FIELDS = {"byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid", "cid"}
REQUIRED_FIELDS = {"byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"}
def __init__(
self,
*,
byr: Optional[str] = None,
iyr: Optional[str] = None,
eyr: Optional[str] = None,
hgt: Optional[str] = None,
hcl: Optional[str] = None,
ecl: Optional[str] = None,
pid: Optional[str] = None,
cid: Optional[str] = None,
) -> None:
self.byr = byr
self.iyr = iyr
self.eyr = eyr
self.hgt = hgt
self.hcl = hcl
self.ecl = ecl
self.pid = pid
self.cid = cid
def __repr__(self):
return f"<Passport {self.byr=} {self.iyr=} {self.eyr=} {self.hgt=} {self.hcl=} {self.ecl=} {self.pid=} {self.cid=}>"
def is_valid(self) -> bool:
return bool(
self.has_required_fields() and
self.is_valid_byr() and
self.is_valid_iyr() and
self.is_valid_eyr() and
self.is_valid_hgt() and
self.is_valid_hcl() and
self.is_valid_ecl() and
self.is_valid_pid()
)
def has_required_fields(self) -> bool:
"""
Has passport got all required fields
>>> Passport().has_required_fields()
False
>>> Passport(pid="087499704", hgt="74in", ecl="grn", iyr="2012", eyr="2030", byr="1980", hcl="#623a2f").has_required_fields()
True
"""
fields_with_data: set = {
field
for field in self.FIELDS
if getattr(self, field) is not None
}
return self.REQUIRED_FIELDS.issubset(fields_with_data)
def is_valid_byr(self) -> bool:
"""±
Is birth year valid
>>> Passport(byr="1920").is_valid_byr()
True
>>> Passport(byr="1900").is_valid_byr()
False
>>> Passport(byr=None).is_valid_byr()
False
"""
return int(self.byr) in range(1920, 2002) if self.byr is not None else False
def is_valid_iyr(self) -> bool:
"""
Is issue year valid
>>> Passport(iyr="2010").is_valid_iyr()
True
>>> Passport(iyr="2009").is_valid_iyr()
False
>>> Passport(iyr=None).is_valid_iyr()
False
"""
return int(self.iyr) in range(2010, 2020) if self.iyr is not None else False
def is_valid_eyr(self):
"""
Is expiration year valid
>>> Passport(eyr="2020").is_valid_eyr()
True
>>> Passport(eyr="2010").is_valid_eyr()
False
>>> Passport(eyr=None).is_valid_eyr()
False
"""
return int(self.eyr) in range(2020, 2030) if self.eyr is not None else False
def is_valid_hgt(self) -> bool:
"""
Is height valid
>>> Passport(hgt="60in").is_valid_hgt()
True
>>> Passport(hgt="190cm").is_valid_hgt()
True
>>> Passport(hgt="190in").is_valid_hgt()
False
>>> Passport(hgt="190").is_valid_hgt()
False
"""
if self.hgt and self.hgt.endswith("cm"):
return int(self.hgt.removesuffix("cm")) in range(150, 193)
elif self.hgt and self.hgt.endswith("in"):
return int(self.hgt.removesuffix("in")) in range(59, 76)
return False
def is_valid_hcl(self) -> bool:
"""
Is hair colour valid
>>> Passport(hcl="#123abc").is_valid_hcl()
True
>>> Passport(hcl="#123abz").is_valid_hcl()
False
>>> Passport(hcl="123abc").is_valid_hcl()
False
>>> Passport(hcl=None).is_valid_hcl()
False
"""
return bool(re.match(r"^#[a-f0-9]{6}$", self.hcl)) if self.hcl is not None else False
def is_valid_ecl(self) -> bool:
"""
Is eye colour valid
>>> Passport(ecl="brn").is_valid_ecl()
True
>>> Passport(ecl="wat").is_valid_ecl()
False
>>> Passport(ecl=None).is_valid_ecl()
False
"""
return self.ecl in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"] if self.ecl is not None else False
def is_valid_pid(self) -> bool:
"""
Is passport ID valid
>>> Passport(pid="000000001").is_valid_pid()
True
>>> Passport(pid="0123456789").is_valid_pid()
False
>>> Passport(pid=None).is_valid_pid()
False
"""
return len(self.pid) == 9 and self.pid.isnumeric() if self.pid is not None else False
def parse_raw_data_to_passport(raw_passport_data: str) -> Passport:
"""
Parse raw data to Passport object
"""
return Passport(
**dict(
tuple(field.split(":"))
for field in raw_passport_data.split()
)
)
class DayFourPartTwoTestCase(unittest.TestCase):
def test_invalid(self):
for raw_passport_data in [
"eyr:1972 cid:100\nhcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926",
"iyr:2019\nhcl:#602927 eyr:1967 hgt:170cm\necl:grn pid:012533040 byr:1946",
"hcl:dab227 iyr:2012\necl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277",
"hgt:59cm ecl:zzz\neyr:2038 hcl:74454a iyr:2023\npid:3556412378 byr:2007",
]:
with self.subTest(raw_passport_data=raw_passport_data):
self.assertFalse(parse_raw_data_to_passport(raw_passport_data).is_valid())
def test_valid(self):
for raw_passport_data in [
"pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980\nhcl:#623a2f",
"eyr:2029 ecl:blu cid:129 byr:1989\niyr:2014 pid:896056539 hcl:#a97842 hgt:165cm",
"hcl:#888785\nhgt:164cm byr:2001 iyr:2015 cid:88\npid:545766238 ecl:hzl\neyr:2022",
"iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719"
]:
with self.subTest(raw_passport_data=raw_passport_data):
self.assertTrue(parse_raw_data_to_passport(raw_passport_data).is_valid())
file = open('./data.txt', 'r')
data = file.read()
file.close()
passports = [parse_raw_data_to_passport(raw_passport_data) for raw_passport_data in data.split("\n\n")]
valid_passports = [passport for passport in passports if passport.is_valid()]
invalid_passports = [passport for passport in passports if not passport.is_valid()]
print("valid_passports", len(valid_passports))
@nwjlyons
Copy link
Author

Results in 144 valid passports out of 290. Answer is too low. Any ideas?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment