Add 9 first days
This commit is contained in:
1
4-passport_processing/.gitignore
vendored
Normal file
1
4-passport_processing/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
119
4-passport_processing/Cargo.lock
generated
Normal file
119
4-passport_processing/Cargo.lock
generated
Normal file
@@ -0,0 +1,119 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68803225a7b13e47191bab76f2687382b60d259e8cf37f6e1893658b84bb9479"
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
|
||||
|
||||
[[package]]
|
||||
name = "passport_processing"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"regex",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
"thread_local",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
10
4-passport_processing/Cargo.toml
Normal file
10
4-passport_processing/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "passport_processing"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.36"
|
||||
regex = "1.4.2"
|
||||
thiserror = "1.0.22"
|
||||
953
4-passport_processing/data/input.txt
Normal file
953
4-passport_processing/data/input.txt
Normal file
@@ -0,0 +1,953 @@
|
||||
ecl:amb
|
||||
pid:690616023
|
||||
byr:1994 iyr:2014 hgt:172cm hcl:#c0946f eyr:2022
|
||||
|
||||
eyr:1980 cid:97
|
||||
hcl:z ecl:#102145 iyr:2011 byr:1945
|
||||
pid:187cm hgt:179in
|
||||
|
||||
ecl:amb
|
||||
iyr:2011
|
||||
cid:113
|
||||
eyr:2021 hcl:#b6652a pid:004682943 byr:1940
|
||||
hgt:173cm
|
||||
|
||||
iyr:2023
|
||||
cid:146 byr:2022 ecl:dne hgt:76in eyr:2040 hcl:z
|
||||
|
||||
hcl:#f97e30
|
||||
cid:73 iyr:2013 byr:1929 hgt:157cm
|
||||
eyr:2024 ecl:blu pid:673398662
|
||||
|
||||
hcl:5343fe
|
||||
hgt:152 byr:2018
|
||||
eyr:1992 pid:85999926 iyr:1938 ecl:#15bd97
|
||||
|
||||
byr:1975 hcl:z eyr:1988 pid:#c36f52
|
||||
iyr:2018
|
||||
hgt:184cm
|
||||
|
||||
byr:1954 eyr:2023 hgt:170cm iyr:2012 ecl:blu pid:299556897 hcl:#b6652a
|
||||
|
||||
hgt:191cm ecl:oth hcl:#7d3b0c
|
||||
iyr:2016 pid:187567535
|
||||
byr:1999 eyr:2023
|
||||
|
||||
pid:814358147 eyr:2022 iyr:2000 byr:2001 hcl:#18171d
|
||||
ecl:blu
|
||||
hgt:76in
|
||||
|
||||
ecl:hzl
|
||||
hgt:163cm byr:1955 iyr:2018 eyr:2024 hcl:#6b5442 pid:343362099
|
||||
|
||||
eyr:2020 pid:185090160 ecl:#21a5e6
|
||||
iyr:1928 byr:2006 hcl:a2ebbf hgt:104
|
||||
|
||||
hgt:153cm
|
||||
hcl:#a97842 ecl:blu eyr:2028 byr:1969 iyr:2019
|
||||
pid:729700590
|
||||
|
||||
iyr:2019 byr:1981 hgt:150cm pid:606092356 hcl:#18171d eyr:2026
|
||||
ecl:grn
|
||||
|
||||
pid:760899887
|
||||
eyr:2023 hcl:#866857 hgt:185cm iyr:2017
|
||||
byr:1976 ecl:gry
|
||||
|
||||
byr:1965 eyr:2026
|
||||
hcl:#623a2f
|
||||
ecl:blu pid:483363116 iyr:2010 hgt:178cm cid:204
|
||||
|
||||
ecl:oth eyr:2022
|
||||
pid:268557763 byr:1965 iyr:2015 hcl:#c0946f hgt:164cm
|
||||
|
||||
ecl:gry hgt:168cm hcl:#623a2f eyr:2020 cid:163 pid:124082663 iyr:2016 byr:1996
|
||||
|
||||
hcl:4c44fb iyr:1957 eyr:2039 ecl:grt hgt:63cm byr:2012 cid:104
|
||||
|
||||
byr:2024 iyr:2023
|
||||
ecl:gry
|
||||
eyr:2007 pid:170cm hgt:68 hcl:d57b67 cid:333
|
||||
|
||||
byr:1956
|
||||
hgt:169cm iyr:2013 pid:370491367
|
||||
ecl:gry hcl:#5bc41d
|
||||
|
||||
eyr:2023 iyr:2028 byr:1969 ecl:lzr hcl:1989b1 hgt:71cm pid:#12c226
|
||||
|
||||
cid:304 pid:866132461
|
||||
byr:2022
|
||||
hcl:z hgt:191in ecl:lzr iyr:2029 eyr:1989
|
||||
|
||||
ecl:brn hcl:#9a45a7
|
||||
hgt:176cm
|
||||
byr:1974 pid:758747330 iyr:2014 eyr:2020
|
||||
|
||||
cid:190 ecl:hzl iyr:2014 byr:1990 hgt:69in eyr:2037 pid:384015829 hcl:#ceb3a1
|
||||
|
||||
byr:1998 eyr:2022 iyr:2018 hgt:153cm
|
||||
hcl:#733820 pid:424512443
|
||||
ecl:blu
|
||||
|
||||
hcl:27c41f byr:1972 eyr:1994 pid:777840405
|
||||
ecl:gry
|
||||
hgt:179cm
|
||||
iyr:2021
|
||||
|
||||
hgt:166cm eyr:2032 ecl:gry byr:1936
|
||||
pid:41703652
|
||||
|
||||
hcl:#efcc98 iyr:2019 byr:1936 pid:985830958 eyr:2021
|
||||
hgt:175cm ecl:brn
|
||||
|
||||
eyr:2025 pid:972163513 hgt:155cm ecl:brn cid:169 iyr:2015
|
||||
hcl:#6b5442
|
||||
|
||||
eyr:2026
|
||||
hgt:173cm
|
||||
byr:1984
|
||||
cid:191
|
||||
pid:791209101 hcl:#341e13 iyr:2020 ecl:hzl
|
||||
|
||||
hgt:64cm
|
||||
iyr:2010 byr:1978
|
||||
pid:618891746 hcl:#d6ac23 eyr:2023 ecl:brn
|
||||
|
||||
eyr:2021 hcl:#341e13 iyr:2018 pid:502081929
|
||||
ecl:blu
|
||||
|
||||
ecl:amb
|
||||
iyr:2018 pid:8933462515
|
||||
hgt:160cm hcl:e330f0 eyr:2030 byr:2007
|
||||
|
||||
ecl:gry byr:1980 hcl:#341e13 iyr:2015 pid:830724822 hgt:167cm cid:156
|
||||
eyr:2023
|
||||
|
||||
ecl:gry hcl:#c39b75 byr:1995 hgt:153cm
|
||||
eyr:2029 pid:83056475 iyr:2013
|
||||
|
||||
byr:1965 cid:250
|
||||
ecl:oth iyr:2016
|
||||
pid:242792947 eyr:2025 hcl:#efcc98
|
||||
|
||||
byr:2011 ecl:#62fe2d hcl:#2b434a hgt:190cm
|
||||
eyr:2031 iyr:1964 pid:7096872943
|
||||
|
||||
cid:258 hcl:#c0946f pid:698224453 eyr:2029 hgt:189cm iyr:2012 ecl:blu byr:1963
|
||||
|
||||
eyr:2028 byr:1942 hgt:156cm pid:836243052 iyr:2016
|
||||
hcl:#888785 cid:310 ecl:brn
|
||||
|
||||
hcl:#a97842 pid:740164307 ecl:oth byr:1997
|
||||
hgt:166cm
|
||||
iyr:2015 eyr:2026
|
||||
|
||||
hcl:4ee9da iyr:2020
|
||||
eyr:1933 hgt:136 ecl:#8dee29 pid:44266010 byr:1966 cid:82
|
||||
|
||||
ecl:amb byr:1921 hgt:182cm eyr:2026
|
||||
hcl:#c0946f iyr:2010
|
||||
|
||||
hgt:178cm cid:343 eyr:2023 pid:197119382 hcl:#623a2f iyr:2017
|
||||
ecl:brn byr:2002
|
||||
|
||||
eyr:2030 byr:1967 ecl:blu hgt:166cm iyr:2017
|
||||
pid:655602762 hcl:#6b5442
|
||||
|
||||
cid:143 hgt:152cm eyr:2026 iyr:2018 byr:1950 ecl:grn hcl:#866857 pid:067535973
|
||||
|
||||
byr:2019 ecl:#e3c288 iyr:1948 hgt:72cm hcl:7da71b eyr:1956
|
||||
|
||||
hcl:#cfa07d
|
||||
pid:688405238 cid:200 byr:1950
|
||||
iyr:2020 ecl:hzl hgt:170cm
|
||||
|
||||
eyr:2026 hgt:164cm iyr:2010 hcl:#b6652a pid:404835595 byr:1924 ecl:blu
|
||||
|
||||
iyr:2016 hcl:#866857
|
||||
ecl:gry
|
||||
eyr:2023 pid:986813245 cid:247 byr:1977
|
||||
hgt:173cm
|
||||
|
||||
ecl:#a59335 eyr:2023
|
||||
hcl:033f22 byr:1947 hgt:152
|
||||
iyr:2029 pid:#1e686a cid:305
|
||||
|
||||
byr:2005
|
||||
ecl:amb hcl:#a97842
|
||||
iyr:1972
|
||||
eyr:1967 pid:274884869
|
||||
|
||||
eyr:2038 iyr:2018
|
||||
pid:181cm ecl:xry hgt:185in
|
||||
hcl:109b28 cid:287
|
||||
|
||||
ecl:amb byr:1943 pid:002483342 hgt:178cm
|
||||
hcl:#c0946f eyr:2030
|
||||
iyr:2014
|
||||
|
||||
iyr:2020 byr:1963 cid:131 hcl:#18171d hgt:181cm pid:146726616 eyr:2021
|
||||
|
||||
pid:062629370 byr:1931 hgt:188cm eyr:2021 ecl:gry
|
||||
hcl:#166b3d
|
||||
|
||||
pid:007028786 ecl:blu hgt:156cm byr:1981 hcl:#888785 cid:53 iyr:2019
|
||||
|
||||
iyr:2014 hcl:#623a2f
|
||||
ecl:hzl eyr:2029 byr:1988
|
||||
pid:849096536 hgt:167cm cid:322
|
||||
|
||||
pid:160824363
|
||||
hcl:#19bed3
|
||||
eyr:2024 hgt:171cm
|
||||
byr:1968 iyr:2019
|
||||
|
||||
eyr:2024 hcl:#dd66d0
|
||||
byr:1986
|
||||
cid:105 pid:816153574 ecl:hzl iyr:2013
|
||||
hgt:173cm
|
||||
|
||||
hcl:#ceb3a1 hgt:62in ecl:gry
|
||||
iyr:2017 cid:234 byr:1963
|
||||
eyr:2029
|
||||
pid:514406488
|
||||
|
||||
hcl:#fffffd ecl:blu
|
||||
eyr:2020 iyr:2010
|
||||
pid:544347103 hgt:164cm byr:1939
|
||||
|
||||
eyr:2021
|
||||
pid:999479324 hgt:164in ecl:brn iyr:2016
|
||||
hcl:#a97842 byr:2020
|
||||
|
||||
pid:053149570 byr:1920 eyr:2027 hgt:190cm iyr:2011 hcl:#fffffd ecl:oth
|
||||
|
||||
hgt:165cm
|
||||
hcl:#cfa07d
|
||||
ecl:oth
|
||||
eyr:2023
|
||||
pid:186cm
|
||||
byr:1937 iyr:2012
|
||||
|
||||
eyr:2026 hgt:64cm hcl:#ac426a byr:1969
|
||||
cid:345 iyr:1960
|
||||
pid:#df648a ecl:blu
|
||||
|
||||
byr:1923 iyr:2017
|
||||
eyr:2027 pid:798497862 hgt:182cm
|
||||
hcl:#ceb3a1 ecl:oth
|
||||
|
||||
hgt:182cm eyr:1990 ecl:grn hcl:#efcc98 byr:1968
|
||||
pid:005962011
|
||||
iyr:2010
|
||||
|
||||
cid:74 eyr:2020 hgt:71in
|
||||
iyr:2015 pid:487940408 byr:1952
|
||||
hcl:#733820
|
||||
|
||||
hgt:75cm cid:249
|
||||
ecl:hzl
|
||||
hcl:#6b5442 pid:4860441 eyr:2020
|
||||
|
||||
ecl:hzl eyr:2025 hgt:183cm
|
||||
iyr:2020 byr:1993 pid:572766871 hcl:#866857
|
||||
|
||||
hcl:#888785 pid:200125941 hgt:155cm byr:1923
|
||||
eyr:2021 iyr:2010 ecl:gry
|
||||
|
||||
pid:502547835 iyr:2014 hcl:#b6652a
|
||||
byr:1985 hgt:189cm eyr:2024
|
||||
|
||||
eyr:2024 hcl:#fffffd ecl:amb byr:1952
|
||||
pid:724639818
|
||||
iyr:2013 hgt:183cm
|
||||
|
||||
byr:2023
|
||||
iyr:2026 ecl:gry eyr:2032 hcl:3e0fc4 pid:5620497552
|
||||
hgt:84
|
||||
|
||||
cid:79
|
||||
hgt:68cm
|
||||
iyr:2021
|
||||
pid:#365b83 byr:1928
|
||||
ecl:#79a6b3 eyr:2027 hcl:54130e
|
||||
|
||||
hgt:74cm byr:1953
|
||||
cid:263 iyr:2018
|
||||
ecl:zzz
|
||||
hcl:#efcc98
|
||||
pid:154cm eyr:1951
|
||||
|
||||
cid:272 pid:0638528559 hcl:z hgt:63cm byr:2029 ecl:zzz
|
||||
eyr:2033
|
||||
|
||||
iyr:2016
|
||||
hgt:193cm hcl:#6b5442 pid:715518898 ecl:brn cid:195
|
||||
eyr:2025
|
||||
|
||||
ecl:oth
|
||||
eyr:2025 hgt:166cm byr:1944
|
||||
iyr:2017 pid:814141652
|
||||
|
||||
eyr:2025 cid:140 ecl:hzl hcl:#c0946f pid:824866056 iyr:2011 hgt:65in byr:1947
|
||||
|
||||
iyr:2016
|
||||
ecl:brn eyr:2021
|
||||
hgt:161cm
|
||||
byr:1984 hcl:#602927 pid:821539320
|
||||
|
||||
hgt:175cm cid:190 hcl:#ceb3a1 ecl:brn byr:1927 iyr:2017 eyr:2029 pid:836598854
|
||||
|
||||
eyr:2026 ecl:brn hgt:157cm pid:038645205 byr:1995
|
||||
iyr:2019 cid:339
|
||||
|
||||
ecl:brn hgt:70in hcl:#c0946f
|
||||
pid:535498918 cid:153
|
||||
iyr:2012 eyr:2030
|
||||
|
||||
byr:1995
|
||||
hcl:#efcc98 hgt:174cm eyr:2030 pid:180839761
|
||||
ecl:grn iyr:2010
|
||||
|
||||
hgt:59cm eyr:2035 byr:2021 iyr:2012 ecl:hzl pid:219328725 hcl:#888785
|
||||
|
||||
ecl:oth hgt:184cm byr:1984 iyr:2016
|
||||
hcl:#cfa07d
|
||||
|
||||
iyr:1998 byr:2024 ecl:lzr hgt:187 hcl:z eyr:1935 pid:#789b56
|
||||
|
||||
iyr:1967 hcl:z pid:828930046 hgt:59in
|
||||
cid:153
|
||||
byr:2021
|
||||
ecl:grn
|
||||
eyr:1935
|
||||
|
||||
byr:1991
|
||||
hcl:#341e13 ecl:gry iyr:2018
|
||||
hgt:67in pid:157970631 eyr:2021
|
||||
|
||||
byr:1941 hgt:169cm pid:322510952 hcl:#cfa07d cid:75 ecl:oth
|
||||
eyr:2021 iyr:2020
|
||||
|
||||
hcl:#7d3b0c iyr:2013 cid:78 hgt:167cm ecl:brn byr:1974 pid:237404828
|
||||
|
||||
pid:1567157833
|
||||
hcl:#7d3b0c iyr:2025 eyr:2023
|
||||
byr:2002 ecl:oth hgt:191cm
|
||||
|
||||
ecl:amb iyr:2014 hgt:182cm pid:526612838
|
||||
cid:287 eyr:2025 byr:1988
|
||||
hcl:#866857
|
||||
|
||||
hcl:#866857 hgt:174cm byr:1992 eyr:2028 iyr:2015
|
||||
|
||||
eyr:2029
|
||||
hgt:190cm
|
||||
hcl:#18171d
|
||||
cid:245
|
||||
ecl:oth pid:3636033742 byr:2024
|
||||
iyr:2019
|
||||
|
||||
byr:1972 hgt:163cm eyr:2020 hcl:#b6652a
|
||||
pid:360516396 iyr:2019 ecl:grn
|
||||
|
||||
iyr:1997 ecl:#be02d2
|
||||
eyr:2020 cid:259 byr:1953
|
||||
hcl:#6b5442
|
||||
hgt:177cm pid:978155362
|
||||
|
||||
pid:377596476 cid:153
|
||||
eyr:2025 byr:2000 hgt:181cm iyr:2014 hcl:#abc5cb ecl:hzl
|
||||
|
||||
cid:171 ecl:lzr iyr:2013 eyr:1973 byr:2004
|
||||
pid:#267099 hgt:101
|
||||
|
||||
hcl:#623a2f
|
||||
pid:029193661
|
||||
hgt:183cm
|
||||
ecl:hzl eyr:2029 iyr:2013
|
||||
byr:1977
|
||||
|
||||
ecl:amb eyr:2021 hgt:159cm byr:1970 cid:152
|
||||
hcl:#b6652a iyr:2020 pid:180512119
|
||||
|
||||
eyr:2025
|
||||
ecl:grn
|
||||
hgt:60in iyr:2013 pid:697352361
|
||||
hcl:#18171d byr:1989
|
||||
|
||||
byr:1934 hgt:165cm pid:703537570 ecl:hzl iyr:2015
|
||||
hcl:#888785
|
||||
|
||||
ecl:gmt
|
||||
hcl:6dd6a5
|
||||
byr:1951
|
||||
pid:#7ab761 cid:304 iyr:1924 eyr:1953 hgt:71in
|
||||
|
||||
ecl:amb hcl:#733820 eyr:2030 hgt:178cm
|
||||
pid:692422832 iyr:2019
|
||||
cid:276
|
||||
|
||||
iyr:2012 ecl:oth
|
||||
pid:674969358
|
||||
eyr:2027 hgt:157cm cid:247 hcl:#a97842
|
||||
|
||||
byr:2017 eyr:2031 hgt:180cm hcl:#ceb3a1 pid:372071110
|
||||
iyr:2015 ecl:amb
|
||||
|
||||
hgt:165cm iyr:2015
|
||||
eyr:2021 ecl:amb byr:2000 cid:235
|
||||
|
||||
eyr:2027 hcl:#623a2f pid:595874068
|
||||
ecl:amb
|
||||
hgt:177cm iyr:2019 byr:1929
|
||||
|
||||
pid:8150929412 hgt:191in eyr:2031 cid:233 byr:2027
|
||||
iyr:2026 ecl:#e94348 hcl:z
|
||||
|
||||
hgt:65 byr:2009 iyr:2029 hcl:#fffffd eyr:1950 pid:950012410 cid:212 ecl:#5a6042
|
||||
|
||||
ecl:#44c561 hgt:178cm eyr:2021 pid:753771724
|
||||
iyr:2014
|
||||
hcl:#70adb2 byr:1989
|
||||
|
||||
iyr:2018 pid:809109448 ecl:amb hcl:#b6652a hgt:63in byr:1976 cid:96
|
||||
|
||||
byr:2021 ecl:grn pid:9284377919 iyr:2011 hgt:75cm hcl:#18171d eyr:2026
|
||||
|
||||
ecl:oth
|
||||
byr:1926
|
||||
hgt:63 iyr:1948 cid:61 hcl:a528d1 eyr:2034
|
||||
|
||||
byr:1978 pid:150503169 iyr:2015 ecl:grn hgt:172cm cid:70 eyr:2022 hcl:#7d3b0c
|
||||
|
||||
byr:1957 hcl:#cfa07d iyr:2010 ecl:amb eyr:2025 pid:921901279
|
||||
|
||||
ecl:utc pid:154cm
|
||||
byr:1964 eyr:1978 hgt:114 hcl:z
|
||||
|
||||
byr:1929 ecl:amb eyr:2028 iyr:2013
|
||||
hcl:#fffffd pid:479814281
|
||||
cid:105 hgt:64in
|
||||
|
||||
pid:949640425
|
||||
cid:205 hcl:#341e13 ecl:amb
|
||||
hgt:171cm byr:1998
|
||||
|
||||
hgt:190cm cid:113 ecl:grn eyr:2037
|
||||
hcl:#ceb3a1 pid:7994792779 iyr:2011
|
||||
|
||||
hgt:152cm iyr:2010
|
||||
byr:1992 eyr:2020
|
||||
hcl:#602927
|
||||
cid:66
|
||||
pid:604149642
|
||||
|
||||
eyr:2028
|
||||
byr:1961 hgt:71in
|
||||
iyr:2013 cid:135
|
||||
pid:534090716 hcl:#ceb3a1 ecl:oth
|
||||
|
||||
iyr:1937 byr:1995 cid:200
|
||||
eyr:2037 pid:#daf9af
|
||||
hcl:052017 ecl:zzz hgt:73cm
|
||||
|
||||
ecl:amb
|
||||
hcl:#a97842
|
||||
iyr:2018
|
||||
hgt:153cm
|
||||
cid:149 eyr:2023 pid:533403632
|
||||
|
||||
cid:275 ecl:brn iyr:2017 pid:087665205 byr:1945 hcl:#7d3b0c
|
||||
eyr:2025
|
||||
|
||||
eyr:2030 hgt:177cm hcl:#cfa07d iyr:2018 pid:734113761
|
||||
byr:1965
|
||||
|
||||
hgt:163cm byr:1924 ecl:blu cid:125
|
||||
eyr:2027 hcl:#fffffd pid:137238888
|
||||
|
||||
hgt:174cm hcl:#623a2f eyr:2023 ecl:gry pid:585758460
|
||||
iyr:2011
|
||||
|
||||
cid:183
|
||||
byr:1928 pid:471385060
|
||||
hgt:192cm
|
||||
ecl:oth iyr:2010 hcl:#623a2f eyr:2020
|
||||
|
||||
hgt:177cm
|
||||
cid:273 ecl:oth eyr:2020
|
||||
hcl:#efcc98
|
||||
iyr:2012 pid:246299733
|
||||
byr:1954
|
||||
|
||||
pid:052203766 cid:146 ecl:hzl byr:1974 hcl:#6b5442
|
||||
eyr:2030 hgt:173cm
|
||||
iyr:2011
|
||||
|
||||
hgt:167cm
|
||||
byr:1972 iyr:2010
|
||||
pid:783359411 ecl:hzl hcl:#9f8cc9 eyr:2028
|
||||
|
||||
iyr:2020 hcl:#18171d ecl:grn
|
||||
byr:1992
|
||||
hgt:189cm
|
||||
eyr:2023 pid:736882272
|
||||
|
||||
cid:230 ecl:utc iyr:2022
|
||||
pid:170cm
|
||||
byr:2015 hcl:#c0946f
|
||||
eyr:2031
|
||||
|
||||
cid:261
|
||||
byr:1922 hgt:170cm ecl:brn eyr:2021
|
||||
pid:593276915 hcl:#18171d
|
||||
iyr:2017
|
||||
|
||||
hcl:#341e13 pid:038417039 hgt:61in eyr:2025 iyr:2017
|
||||
cid:117
|
||||
|
||||
iyr:2017 eyr:2026 pid:441484223
|
||||
hgt:155cm byr:1968 hcl:#ceb3a1 ecl:hzl
|
||||
|
||||
eyr:2021
|
||||
hgt:64in
|
||||
ecl:oth hcl:#b6652a byr:1954 pid:204959612 iyr:2016
|
||||
|
||||
hcl:z eyr:1969
|
||||
pid:162cm ecl:#944b0f
|
||||
iyr:2030 byr:2029
|
||||
|
||||
hgt:114 eyr:2034 byr:2026 hcl:84fa1a
|
||||
pid:47909473
|
||||
iyr:2028
|
||||
ecl:utc
|
||||
|
||||
eyr:2025 ecl:blu hgt:157cm iyr:2014 hcl:#a97842 byr:1974 pid:702610675 cid:241
|
||||
|
||||
pid:732388109
|
||||
hcl:#6b5442 cid:272 eyr:2026 hgt:193cm
|
||||
ecl:amb byr:1982
|
||||
|
||||
eyr:2030 byr:1994
|
||||
hgt:177in ecl:amb pid:1589147420 iyr:2011 hcl:#4bf920
|
||||
cid:252
|
||||
|
||||
ecl:oth eyr:2022
|
||||
byr:1948
|
||||
pid:177cm cid:90 hgt:102 hcl:z iyr:2028
|
||||
|
||||
hgt:157cm pid:233347213
|
||||
hcl:z
|
||||
byr:2009 eyr:2027 cid:235 ecl:blu
|
||||
iyr:1965
|
||||
|
||||
ecl:blu iyr:2030 eyr:2028 hcl:#18171d pid:322593908 byr:1954
|
||||
cid:215 hgt:63in
|
||||
|
||||
hgt:72cm
|
||||
cid:345 pid:911728732 eyr:2025
|
||||
byr:2004 ecl:#0c4af7 hcl:3bb675
|
||||
|
||||
pid:171714794 byr:2019
|
||||
hcl:#866857
|
||||
cid:290 hgt:183in ecl:#d0c30f eyr:2032
|
||||
|
||||
iyr:2016 pid:905945155 hcl:#ceb3a1 byr:1958 hgt:159cm eyr:2028 cid:180 ecl:oth
|
||||
|
||||
hcl:efb614
|
||||
eyr:2022 hgt:177cm pid:46962273
|
||||
byr:1974
|
||||
ecl:#089bdd iyr:1988
|
||||
|
||||
pid:662993164 iyr:2011 eyr:2025 ecl:hzl
|
||||
byr:1942 hcl:#fffffd
|
||||
hgt:175cm
|
||||
|
||||
hcl:#7d3b0c iyr:2016 hgt:175cm eyr:2022 pid:953132241
|
||||
byr:1963 cid:261 ecl:grn
|
||||
|
||||
iyr:2013 hgt:180cm cid:318
|
||||
ecl:amb
|
||||
byr:1985 pid:439097817 eyr:2029 hcl:#602927
|
||||
|
||||
hgt:162cm ecl:blu
|
||||
pid:675749832 cid:73
|
||||
byr:1940 hcl:#888785
|
||||
eyr:2026
|
||||
|
||||
pid:275352007 iyr:2012 eyr:2020
|
||||
ecl:amb hcl:#623a2f hgt:175cm cid:317 byr:1988
|
||||
|
||||
hcl:z hgt:164in
|
||||
iyr:2026 eyr:1961 ecl:#2df35e pid:#5c9ed5 cid:341
|
||||
|
||||
pid:848086119 ecl:oth eyr:2021 iyr:2011 hgt:180cm byr:1923 hcl:#93461b
|
||||
|
||||
eyr:2028
|
||||
iyr:2014
|
||||
byr:1978
|
||||
hgt:184cm
|
||||
pid:966277564 ecl:hzl
|
||||
cid:176
|
||||
|
||||
hcl:#888785 ecl:amb cid:329 pid:835961958 byr:1927 eyr:2028 iyr:2016
|
||||
|
||||
pid:160cm eyr:2026 hcl:#08714b
|
||||
ecl:hzl iyr:1961
|
||||
hgt:156cm byr:1984
|
||||
|
||||
ecl:gry cid:302
|
||||
byr:1965
|
||||
iyr:2019 hcl:#ceb3a1 eyr:2027 pid:458192010 hgt:156cm
|
||||
|
||||
pid:058273969 byr:1942 eyr:2027
|
||||
hcl:#c0946f iyr:2013 hgt:179cm
|
||||
|
||||
iyr:2019 hgt:193in pid:52144528 eyr:2036
|
||||
cid:169 ecl:grt hcl:7e7039
|
||||
|
||||
hgt:192cm ecl:blu iyr:2015 pid:544936486 eyr:2024
|
||||
byr:1972 hcl:#c0946f
|
||||
|
||||
eyr:2000
|
||||
hcl:78de23 byr:2020
|
||||
hgt:171in pid:160cm cid:68
|
||||
iyr:1956 ecl:gmt
|
||||
|
||||
hcl:#733820 ecl:grn iyr:2018
|
||||
byr:2001 pid:770957230
|
||||
|
||||
cid:103 ecl:grn iyr:2018
|
||||
pid:068344094
|
||||
eyr:2023 hgt:69in byr:1984 hcl:#6b5442
|
||||
|
||||
hgt:193cm eyr:2021 ecl:grn hcl:#602927 byr:1938 iyr:2011
|
||||
|
||||
iyr:1931
|
||||
hcl:c0a318
|
||||
pid:99195939
|
||||
byr:2028 ecl:grt hgt:164 eyr:2017
|
||||
|
||||
eyr:1980
|
||||
ecl:zzz
|
||||
hgt:98 cid:161
|
||||
pid:#96fe01 hcl:z
|
||||
iyr:1974
|
||||
|
||||
byr:1936 hgt:176cm pid:56797167 iyr:2015
|
||||
ecl:#07ad47
|
||||
hcl:z
|
||||
|
||||
pid:48720181 hcl:270e76
|
||||
byr:2022
|
||||
hgt:180cm ecl:#dde399
|
||||
eyr:2035 iyr:2023
|
||||
|
||||
eyr:2030 byr:2022 iyr:2018 hgt:162in ecl:gry
|
||||
hcl:#63e2ec pid:615812600
|
||||
|
||||
ecl:grn
|
||||
cid:56 hcl:#623a2f eyr:2020 hgt:167cm byr:1971 iyr:2012
|
||||
pid:262692066
|
||||
|
||||
hgt:61 hcl:#efcc98 iyr:2011 eyr:2026
|
||||
byr:1938
|
||||
ecl:amb pid:385025739
|
||||
|
||||
pid:972423724 hcl:#602927 eyr:2027 ecl:oth iyr:2015
|
||||
hgt:158cm byr:1956
|
||||
|
||||
pid:530035096
|
||||
ecl:hzl
|
||||
iyr:2017
|
||||
eyr:2024 hcl:#888785 byr:1962 hgt:64in
|
||||
|
||||
byr:1935 eyr:2022 ecl:grn hcl:#7d3b0c pid:294714199
|
||||
|
||||
eyr:2029
|
||||
iyr:2013
|
||||
byr:1927 hgt:175cm pid:058261075 hcl:#cfa07d ecl:amb
|
||||
|
||||
ecl:blu pid:188764763 hgt:155cm byr:1921
|
||||
iyr:2018 eyr:2029 hcl:#b6652a
|
||||
|
||||
byr:1975 hcl:930e76 iyr:2019
|
||||
pid:169cm eyr:2009 hgt:191
|
||||
ecl:#d28c56
|
||||
|
||||
hcl:z
|
||||
pid:3190617557
|
||||
hgt:160cm cid:80 ecl:oth iyr:2022 eyr:2008
|
||||
byr:2016
|
||||
|
||||
hcl:#888785 byr:1999 ecl:blu cid:238 iyr:2018 hgt:160cm
|
||||
eyr:2028 pid:174517111
|
||||
|
||||
eyr:2035
|
||||
hcl:z byr:2020
|
||||
pid:262135957 cid:324 iyr:2016 hgt:161cm ecl:grn
|
||||
|
||||
byr:1936
|
||||
ecl:grn
|
||||
iyr:2013 hcl:#623a2f eyr:2029 hgt:166cm
|
||||
|
||||
hcl:#cfa07d hgt:159cm eyr:2021
|
||||
ecl:hzl
|
||||
iyr:2014 pid:816039817 byr:1935
|
||||
|
||||
pid:596634790 hgt:161cm
|
||||
eyr:2036 iyr:2016
|
||||
hcl:#7d3b0c byr:2015 ecl:brn
|
||||
|
||||
byr:1952
|
||||
hgt:157cm eyr:2024 cid:60 pid:876160626
|
||||
ecl:blu iyr:2011 hcl:z
|
||||
|
||||
hgt:193cm iyr:2020 eyr:2026
|
||||
pid:0136642346 ecl:hzl hcl:#efcc98 byr:1995
|
||||
|
||||
byr:1934 hgt:177cm
|
||||
pid:445993865
|
||||
ecl:brn iyr:2018
|
||||
eyr:2030
|
||||
hcl:#733820
|
||||
|
||||
eyr:2021 hgt:71in
|
||||
pid:918630878
|
||||
hcl:#602927 iyr:2017 byr:1943
|
||||
ecl:gry
|
||||
|
||||
ecl:#81de2c iyr:2021 hgt:176cm eyr:1947 hcl:#888785 pid:1370052400
|
||||
|
||||
ecl:amb
|
||||
byr:1922 iyr:2012 eyr:2022 pid:098866466 hcl:#18171d hgt:63in
|
||||
|
||||
eyr:2028 iyr:2010 hcl:184355
|
||||
byr:1968 pid:337089458 ecl:brn hgt:181cm
|
||||
|
||||
hcl:#733820 pid:225958483 ecl:gry eyr:2030 hgt:62in iyr:2012 byr:1987
|
||||
|
||||
eyr:1955
|
||||
hcl:03199c
|
||||
pid:#3e832e
|
||||
byr:2014 ecl:#453931 hgt:70cm
|
||||
|
||||
byr:1975
|
||||
ecl:blu hcl:#7d3b0c
|
||||
cid:169 pid:582470437 hgt:151cm
|
||||
iyr:2019 eyr:2027
|
||||
|
||||
iyr:2017 byr:1971 pid:343492418 hgt:150cm hcl:#fffffd eyr:2024
|
||||
|
||||
byr:1997
|
||||
eyr:2026
|
||||
cid:257 hcl:#7d3b0c ecl:blu hgt:166cm iyr:2016 pid:117625518
|
||||
|
||||
iyr:2014 cid:248 hgt:165cm hcl:#18171d pid:294270262
|
||||
byr:1925 ecl:amb
|
||||
eyr:2028
|
||||
|
||||
hgt:167in ecl:dne pid:174cm iyr:2019 byr:2005 hcl:b29331 cid:86
|
||||
|
||||
hcl:#733820 pid:259969636 eyr:2023
|
||||
ecl:hzl cid:317
|
||||
hgt:185cm byr:2025
|
||||
iyr:2012
|
||||
|
||||
hcl:#cfa07d hgt:152cm pid:807755992 iyr:2020
|
||||
byr:1922 ecl:grn eyr:2025 cid:241
|
||||
|
||||
pid:997807107 byr:1958 ecl:dne iyr:2013 eyr:2023 hcl:#18171d
|
||||
hgt:152cm
|
||||
|
||||
ecl:blu hgt:170cm
|
||||
byr:1932
|
||||
pid:775223495 eyr:2024 iyr:2015
|
||||
|
||||
iyr:2011
|
||||
ecl:grn hcl:#ceb3a1 pid:190577415
|
||||
hgt:63in
|
||||
eyr:2021
|
||||
byr:1986
|
||||
|
||||
ecl:oth eyr:2025 hgt:180cm
|
||||
pid:258195402 iyr:2017
|
||||
byr:1961
|
||||
cid:109 hcl:#888785
|
||||
|
||||
hgt:178cm byr:1952 eyr:2023 hcl:#733820
|
||||
pid:106939563 ecl:brn iyr:2012
|
||||
|
||||
hgt:188cm iyr:2012 hcl:#fffffd byr:1942
|
||||
ecl:brn pid:804371742
|
||||
|
||||
byr:1978 cid:120
|
||||
eyr:2026 pid:405714523 hgt:60in
|
||||
hcl:#a97842 ecl:blu
|
||||
iyr:2017
|
||||
|
||||
iyr:2015 byr:1958 ecl:grn
|
||||
hcl:#b6652a pid:#9e8af3
|
||||
eyr:2026 hgt:167cm
|
||||
|
||||
hgt:171cm hcl:#888785
|
||||
cid:274
|
||||
ecl:grn pid:919263460 eyr:2023 iyr:2020
|
||||
|
||||
pid:606726472 eyr:2022
|
||||
byr:2008
|
||||
ecl:zzz cid:72 hgt:173in
|
||||
|
||||
eyr:2032 byr:2004
|
||||
hcl:z iyr:2011 ecl:hzl
|
||||
pid:523494728
|
||||
hgt:70cm
|
||||
|
||||
hgt:169cm pid:755822781 byr:1984 ecl:hzl hcl:#6b5442 iyr:2014
|
||||
|
||||
eyr:2020
|
||||
byr:1942 cid:85
|
||||
hgt:157cm pid:558287447 hcl:#efcc98
|
||||
ecl:hzl
|
||||
|
||||
byr:1980 cid:225 pid:367501996 iyr:2016 ecl:grn hcl:#efcc98
|
||||
hgt:175cm eyr:2029
|
||||
|
||||
pid:264780775 hgt:182cm ecl:grn
|
||||
hcl:#18171d
|
||||
eyr:2024
|
||||
byr:1926 iyr:2013
|
||||
|
||||
byr:1969 iyr:2015
|
||||
eyr:2026 ecl:blu
|
||||
hcl:#fffffd
|
||||
pid:005695878 cid:273
|
||||
|
||||
ecl:brn byr:2006 hgt:152cm
|
||||
hcl:#888785
|
||||
pid:171cm cid:249 iyr:2026
|
||||
eyr:2022
|
||||
|
||||
byr:2011 iyr:2020 ecl:zzz hcl:z pid:412624100
|
||||
eyr:2031
|
||||
|
||||
cid:111 hcl:df9bd0
|
||||
iyr:2022 ecl:#32fdf9
|
||||
byr:2017 eyr:2000
|
||||
hgt:166in pid:0654651026
|
||||
|
||||
eyr:2021
|
||||
ecl:gry pid:587324819 hgt:187cm byr:1951 hcl:#6b5442
|
||||
|
||||
iyr:2011
|
||||
pid:180780096 hcl:#623a2f ecl:amb hgt:160cm byr:1991 eyr:2026
|
||||
|
||||
byr:2022 hgt:152cm eyr:2023 cid:70 ecl:grn
|
||||
hcl:e0a24e
|
||||
iyr:1959 pid:77110462
|
||||
|
||||
pid:251982311 byr:1994 ecl:gry hgt:165cm eyr:2021
|
||||
hcl:#623a2f
|
||||
iyr:2019
|
||||
|
||||
ecl:blu byr:1945
|
||||
cid:241
|
||||
pid:732768808 hcl:#efcc98
|
||||
hgt:171cm eyr:2020 iyr:2012
|
||||
|
||||
cid:243 eyr:2001
|
||||
hcl:01a022
|
||||
hgt:162 pid:507703455
|
||||
byr:2003 ecl:#c6a07b
|
||||
iyr:1941
|
||||
|
||||
hcl:#733820 cid:150
|
||||
ecl:hzl pid:843607639 hgt:190cm
|
||||
byr:1958
|
||||
eyr:2025
|
||||
|
||||
eyr:2030
|
||||
pid:489370607 iyr:2014 ecl:oth hcl:#cfa07d byr:1995 hgt:193cm
|
||||
|
||||
hgt:68in
|
||||
byr:1933
|
||||
iyr:2010 ecl:brn
|
||||
pid:380075958
|
||||
hcl:#623a2f cid:279
|
||||
eyr:2025
|
||||
|
||||
iyr:2019
|
||||
byr:2001
|
||||
hcl:#cfa07d ecl:brn pid:349877352
|
||||
hgt:161cm eyr:2029
|
||||
|
||||
hgt:171cm
|
||||
eyr:2040 ecl:dne hcl:#6b5442 iyr:2020 byr:1990
|
||||
|
||||
hcl:#fffffd
|
||||
hgt:154cm
|
||||
byr:1979 eyr:2020 iyr:2018
|
||||
pid:118713281 cid:174
|
||||
|
||||
hcl:#7d3b0c eyr:2030 ecl:brn iyr:2017
|
||||
cid:184 hgt:180cm pid:504181498 byr:1925
|
||||
|
||||
hgt:150cm
|
||||
eyr:2020 byr:1999 hcl:#a97842 iyr:2011 ecl:grn pid:620166468
|
||||
|
||||
hcl:#602927
|
||||
iyr:2015
|
||||
byr:1928
|
||||
pid:083747352
|
||||
eyr:2027 hgt:193cm
|
||||
ecl:hzl
|
||||
|
||||
byr:1938 ecl:gry
|
||||
pid:511669464 eyr:1973 hgt:70cm
|
||||
cid:262 iyr:2015 hcl:#c0946f
|
||||
|
||||
eyr:2029
|
||||
byr:1923 hgt:160cm hcl:#7d3b0c iyr:2013 pid:525837692 ecl:gry
|
||||
|
||||
hcl:#602927 eyr:2025
|
||||
pid:232338168 hgt:174cm cid:322 iyr:2010 ecl:oth
|
||||
|
||||
hgt:192in cid:126 hcl:#6b5442
|
||||
pid:101406211 byr:1922 ecl:hzl eyr:2022 iyr:2013
|
||||
|
||||
eyr:2026 ecl:amb
|
||||
byr:1921
|
||||
cid:336
|
||||
iyr:2020 hgt:182cm pid:533626984
|
||||
|
||||
pid:411943955 ecl:amb eyr:2025 hgt:166cm byr:1964 hcl:#341e13 cid:285
|
||||
iyr:2010
|
||||
|
||||
ecl:grn byr:1933 eyr:2024
|
||||
hgt:153cm
|
||||
hcl:#5cfb31 iyr:2019 pid:773885967
|
||||
|
||||
ecl:hzl pid:426060511
|
||||
hgt:159cm
|
||||
byr:1922 hcl:#6ffd04 iyr:2017
|
||||
|
||||
byr:2025 pid:#097d1b iyr:2020 eyr:2029 hcl:73d113 hgt:69cm ecl:utc
|
||||
|
||||
ecl:amb hgt:170cm eyr:2025 byr:1930 iyr:2018 hcl:#733820
|
||||
cid:262
|
||||
|
||||
iyr:2019
|
||||
eyr:2021
|
||||
cid:65 pid:258615618
|
||||
ecl:oth byr:1987
|
||||
hcl:#efcc98
|
||||
hgt:178cm
|
||||
|
||||
hcl:z eyr:1980 ecl:#1c5fd1 hgt:65cm byr:2014
|
||||
cid:222 pid:#c69fd5 iyr:2020
|
||||
|
||||
cid:271 pid:#4b8380 hcl:80fab0
|
||||
byr:2024 ecl:#20e25f
|
||||
iyr:1945
|
||||
eyr:1935 hgt:159cm
|
||||
191
4-passport_processing/src/main.rs
Normal file
191
4-passport_processing/src/main.rs
Normal file
@@ -0,0 +1,191 @@
|
||||
use std::{collections::HashMap, str::FromStr};
|
||||
use anyhow::Result;
|
||||
use regex::Regex;
|
||||
|
||||
#[derive(Debug,thiserror::Error)]
|
||||
enum ParseError {
|
||||
#[error("Expected {0}")]
|
||||
Expected(String)
|
||||
}
|
||||
|
||||
#[derive(Debug,PartialEq, Eq, Hash)]
|
||||
enum EntryType {
|
||||
Byr,
|
||||
Iyr,
|
||||
Eyr,
|
||||
Hgt,
|
||||
Hcl,
|
||||
Ecl,
|
||||
Pid,
|
||||
Cid,
|
||||
}
|
||||
|
||||
impl FromStr for EntryType {
|
||||
type Err = ParseError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
"byr" => Ok(Self::Byr),
|
||||
"iyr" => Ok(Self::Iyr),
|
||||
"eyr" => Ok(Self::Eyr),
|
||||
"hgt" => Ok(Self::Hgt),
|
||||
"hcl" => Ok(Self::Hcl),
|
||||
"ecl" => Ok(Self::Ecl),
|
||||
"pid" => Ok(Self::Pid),
|
||||
"cid" => Ok(Self::Cid),
|
||||
_ => Err(ParseError::Expected(format!("byr, iyr, eyr, hgt, hcl, ecl, pid, cid, but got {}", s)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl EntryType {
|
||||
pub fn is_valid(&self, value: &Option<&str>) -> bool {
|
||||
match (*value, self) {
|
||||
(Some(value), EntryType::Byr) => {
|
||||
// four digits; at least 1920 and at most 2002.
|
||||
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) => {
|
||||
(1920..=2002).contains(&number)
|
||||
}
|
||||
Err(_) => { false }
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Iyr) => {
|
||||
// four digits; at least 2010 and at most 2020.
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) => {
|
||||
(2010..=2020).contains(&number)
|
||||
}
|
||||
Err(_) => { false }
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Eyr) => {
|
||||
// four digits; at least 2020 and at most 2030.
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) if (2020..=2030)
|
||||
.contains(&number) => true,
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Hgt) => {
|
||||
// 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.
|
||||
let rex_cm = Regex::new(r"(\d*)cm").unwrap();
|
||||
let rex_in = Regex::new(r"(\d*)in").unwrap();
|
||||
if rex_cm.is_match(value) {
|
||||
let m = rex_cm.captures(value);
|
||||
// At least "None" fails the test
|
||||
match str::parse::<i64>(m.unwrap().get(1).unwrap().as_str()) {
|
||||
Ok(height) if (150..=193).contains(&height) => true,
|
||||
_ => false
|
||||
}
|
||||
} else if rex_in.is_match(value) {
|
||||
let m = rex_in.captures(value);
|
||||
// At least "None" fails the test
|
||||
match str::parse::<i64>(m.unwrap().get(1).unwrap().as_str()) {
|
||||
Ok(height) if (59..=76).contains(&height) => true,
|
||||
_ => false
|
||||
}
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Hcl) => {
|
||||
// a # followed by exactly six characters 0-9 or a-f.
|
||||
//probably ok as long as we deal with ascii right ?
|
||||
let rex = Regex::new(r"([a-z]|[0-9]){6}").unwrap();
|
||||
value.starts_with('#') && rex.is_match(&(value.chars().skip(1).collect::<String>()))
|
||||
}
|
||||
(Some(value), EntryType::Ecl) => {
|
||||
// exactly one of: amb blu brn gry grn hzl oth.
|
||||
let valid_values = vec!["amb", "blu", "brn", "gry", "grn", "hzl", "oth"];
|
||||
valid_values.contains(&value)
|
||||
}
|
||||
(Some(value), EntryType::Pid) => {
|
||||
// a nine-digit number, including leading zeroes.
|
||||
// probably ok if we deal only with ascii right ?
|
||||
value.as_bytes().len() == 9 && str::parse::<i64>(value).is_ok()
|
||||
}
|
||||
(_, EntryType::Cid) => {
|
||||
// ignored, missing or not
|
||||
true
|
||||
}
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Passport<'a> {
|
||||
fields: HashMap<EntryType, Option<&'a str>>
|
||||
}
|
||||
|
||||
impl<'a> Passport<'a> {
|
||||
fn new() -> Self {
|
||||
let mut res = Self {
|
||||
fields: HashMap::new()
|
||||
};
|
||||
res.fields.insert(EntryType::Byr, None);
|
||||
res.fields.insert(EntryType::Iyr, None);
|
||||
res.fields.insert(EntryType::Eyr, None);
|
||||
res.fields.insert(EntryType::Hgt, None);
|
||||
res.fields.insert(EntryType::Hcl, None);
|
||||
res.fields.insert(EntryType::Ecl, None);
|
||||
res.fields.insert(EntryType::Pid, None);
|
||||
res.fields.insert(EntryType::Cid, None);
|
||||
res
|
||||
}
|
||||
fn parse(&mut self, s: &'static str) {
|
||||
for entry_s in s.split(&[' ', '\n'][..]) {
|
||||
let mut tokens = entry_s.split(':');
|
||||
if let Ok(etype) = EntryType::from_str(tokens.next().unwrap()) {
|
||||
self.fields.insert(etype, tokens.next());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_valid_legacy(&self, mandatory_cid: bool) -> bool {
|
||||
self.fields.iter().all(|(key, value)| {
|
||||
(!mandatory_cid && *key == EntryType::Cid) ||
|
||||
*value != None
|
||||
})
|
||||
}
|
||||
|
||||
fn is_valid(&self) -> bool {
|
||||
self.fields.iter().all(|(key, value)| {
|
||||
key.is_valid(value)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let data = include_str!("../data/input.txt");
|
||||
// eprintln!("data = {}", data);
|
||||
//eprintln!("data.split() = {:?}", data.split("\n\n").collect::<Vec<&str>>());
|
||||
let passports: Vec<Passport> = data.split("\n\n").map(|pass_str| {
|
||||
let mut res = Passport::new();
|
||||
res.parse(pass_str);
|
||||
res
|
||||
}).collect();
|
||||
// eprintln!("passports = {:#?}", passports);
|
||||
// eprintln!("passports.size() = {:#?}", passports.len());
|
||||
let nb_valid = passports.iter().filter(|p| (*p).is_valid_legacy(false)).count();
|
||||
eprintln!("nb_valid = {:#?}", nb_valid);
|
||||
let nb_valid_secondpass = passports.iter().filter(|p| p.is_valid()).count();
|
||||
eprintln!("nb_valid_secondpass = {:#?}", nb_valid_secondpass);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_validation() {
|
||||
let mut pass = Passport::new();
|
||||
pass.parse("cid:271 pid:009457684 hcl:#80fab0\nbyr:1999 ecl:blu\niyr:2015\neyr:2029 hgt:159cm");
|
||||
eprintln!("pass = {:#?}", pass);
|
||||
assert_eq!(pass.is_valid(), true)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user