Skip to content

Instantly share code, notes, and snippets.

@rob-saunders
Created December 5, 2020 02:13
Show Gist options
  • Save rob-saunders/51ae39369fbcb88eb1ca651b6a6bd90d to your computer and use it in GitHub Desktop.
Save rob-saunders/51ae39369fbcb88eb1ca651b6a6bd90d to your computer and use it in GitHub Desktop.
passport_processor.rb
--- Part Two ---
The line is moving more quickly now, but you overhear airport security talking about how passports with invalid data are getting through. Better add some data validation, quick!
You can continue to ignore the cid field, but each other field has strict rules about what values are valid for automatic validation:
byr (Birth Year) - four digits; at least 1920 and at most 2002.
iyr (Issue Year) - four digits; at least 2010 and at most 2020.
eyr (Expiration Year) - four digits; at least 2020 and at most 2030.
hgt (Height) - a number followed by either cm or in:
If cm, the number must be at least 150 and at most 193.
If in, the number must be at least 59 and at most 76.
hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f.
ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth.
pid (Passport ID) - a nine-digit number, including leading zeroes.
cid (Country ID) - ignored, missing or not.
Your job is to count the passports where all required fields are both present and valid according to the above rules. Here are some example values:
byr valid: 2002
byr invalid: 2003
hgt valid: 60in
hgt valid: 190cm
hgt invalid: 190in
hgt invalid: 190
hcl valid: #123abc
hcl invalid: #123abz
hcl invalid: 123abc
ecl valid: brn
ecl invalid: wat
pid valid: 000000001
pid invalid: 0123456789
Here are some invalid passports:
eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946
hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007
Here are some valid passports:
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f
eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
Count the number of valid passports - those that have all required fields and valid values. Continue to treat cid as optional. In your batch file, how many passports are valid?
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
class PassportProcessor
attr_reader :passport_fields
NECESSARY_FIELDS = %w{byr iyr eyr hgt hcl ecl pid}
UNNECESSARY_FIELDS = %{cid}
def initialize
end
def process_fields passport_fields
contains_fields = NECESSARY_FIELDS.all? { |field| passport_fields.include? field }
if not contains_fields
raise "This passport does not contain the necessary fields"
end
fields = passport_fields.split(/\s/).sort!
hash = {}
fields.map do |field|
key, value = field.split(":")
#next if UNNECESSARY_FIELDS.include? "cid"
hash[key] = value
end
hash
end
def check_byr
(1920..2002).include? @passport_fields['byr'].to_i
end
def check_iyr
(2010..2020).include? @passport_fields['iyr'].to_i
end
def check_eyr
(2020..2030).include? @passport_fields['eyr'].to_i
end
def check_hgt
match = @passport_fields['hgt'].match(/(\d+)([a-z]{2})/)
unless match.nil?
case match[2]
when 'cm'
return (150..193).include? match[1].to_i
when 'in'
return (59..76).include? match[1].to_i
end
end
return false
end
def check_hcl
@passport_fields['hcl'].match?(/#[0-9a-f]{6}/)
end
def check_ecl
eye_colors = %w{amb blu brn gry grn hzl oth}
eye_colors.include? @passport_fields['ecl']
end
def check_pid
@passport_fields['pid'].match?(/[0-9]{9}/)
end
def is_valid?
[ check_byr,
check_iyr,
check_eyr,
check_hgt,
check_hcl,
check_ecl,
check_pid].all?
end
def passport_string=(passport_string)
@passport_fields = process_fields(passport_string)
@passport_fields.delete("cid")
end
end
pp = PassportProcessor.new()
valid_passports = 0
total_passports = 0
File.foreach('input.txt', "\n\n") do |entry|
begin
pp.passport_string = entry
if pp.is_valid?
valid_passports += 1
else
#p pp.passport_fields
end
rescue
"Invalid passport"
end
total_passports += 1
end
p valid_passports
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment