~xenrox/aoc2020

595b3092f2ef30b9a70e556fe7de3e5d90fe28b3 — Thorben Günther 1 year, 4 months ago 58b1210 master
Solve day 4 part 1

Not very elegant, maybe return when I am more confident in writing good
parsers in rust.
5 files changed, 1211 insertions(+), 0 deletions(-)

A data/day04.dat
A data/day04_test.dat
M src/days.rs
A src/days/day04.rs
M src/main.rs
A data/day04.dat => data/day04.dat +1133 -0
@@ 0,0 1,1133 @@
eyr:2029 pid:157374862
byr:1991 ecl:amb hcl:#a97842 hgt:178cm

byr:1962 pid:547578491 eyr:2028 ecl:hzl hgt:65in iyr:2013 hcl:#623a2f

hgt:71in eyr:2037
ecl:#8e276e hcl:z iyr:2019
byr:2022 pid:157cm

hcl:#733820 hgt:175 eyr:2028 iyr:2011
pid:87786389
ecl:hzl byr:1980

hgt:163in hcl:z pid:8261494508 cid:136 ecl:grn eyr:1958
byr:2030 iyr:1991

iyr:2021
hcl:6708a3
ecl:zzz eyr:2034 byr:2010
hgt:189cm
pid:466438311

iyr:2012 pid:9720867166 byr:2006 eyr:2022 hgt:72cm ecl:utc hcl:#c0946f

ecl:#353bc9
iyr:2020 pid:874363951 cid:113
hcl:z eyr:2040 hgt:76in byr:1975

eyr:1971
byr:1955 pid:193cm hgt:189cm hcl:#ceb3a1 ecl:grn
iyr:2023

byr:2014
iyr:2026 eyr:1978 hcl:z cid:312 pid:8294818417
hgt:169in ecl:#82bb02

ecl:amb
byr:1936 hcl:#7d3b0c pid:429853734
cid:342 iyr:2010 eyr:2025 hgt:160cm

byr:2025 hgt:176in hcl:a490ac
ecl:#956d3f iyr:2027
eyr:2021 pid:9858101884

hgt:142 pid:175cm
eyr:1952 byr:2004 iyr:2007 ecl:#da035e hcl:#623a2f
cid:194

hgt:156cm
pid:349122810 hcl:#b6652a eyr:2026 byr:1948 ecl:lzr iyr:2020

byr:1997 ecl:blu
hcl:#888785 pid:381094641 iyr:2014 hgt:192cm eyr:2027

hcl:7b10a2 ecl:lzr byr:2022
eyr:2035
pid:#38b715 hgt:190in iyr:2029

pid:188cm byr:2014
cid:241 ecl:#dda9bd hcl:#8f6ebc
hgt:188cm iyr:2014 eyr:2029

hgt:76cm ecl:gmt hcl:z iyr:2024
pid:3283057785
byr:2019 eyr:2026

iyr:2010 pid:284327216 hgt:191cm
byr:1970
hcl:#18171d
ecl:grn
eyr:2023

byr:1929 eyr:2026 cid:194 ecl:oth hgt:156cm pid:224596482 hcl:#b6652a iyr:2013

eyr:2030 byr:1958 hgt:190cm
pid:162950579 iyr:2010
ecl:brn
cid:250 hcl:#fffffd

ecl:xry iyr:2025 pid:#0155c1
hcl:#341e13
eyr:2027 hgt:163cm byr:2025

hcl:#602927 pid:908859481 byr:1962 ecl:hzl
iyr:2021 eyr:2028 hgt:180cm

iyr:1966 eyr:1976 pid:#bbfe21 hcl:63454a cid:259
ecl:blu
byr:2024 hgt:69cm

ecl:#644daf
byr:2021 eyr:2040
hcl:bc83fe
iyr:1976 hgt:59in pid:60311335

iyr:2018
pid:121801570 hgt:182cm ecl:blu byr:1922 cid:265 eyr:2024 hcl:#888785

byr:1933
pid:232653422 ecl:gry hcl:#18171d
hgt:171cm eyr:2035 iyr:2011

ecl:oth iyr:2015 byr:1937
pid:828621370 hcl:#602927
eyr:2026
hgt:193cm

iyr:2010 ecl:grn eyr:2022
hcl:af37d1 pid:761632482 hgt:65in cid:93
byr:1993

hgt:169cm cid:121
iyr:2018
hcl:#6b5442
pid:059725560 ecl:oth
byr:1972 eyr:2028

eyr:2024 byr:2023 ecl:gry
iyr:2017
pid:778551716 cid:256 hcl:#733820 hgt:184cm

hcl:#ceb3a1 pid:613277258 byr:1941 hgt:67cm eyr:2029
ecl:hzl
iyr:2017

ecl:hzl iyr:2012 pid:498418959 eyr:2022
byr:1929 hgt:164cm hcl:#a97842 cid:226

hgt:157cm eyr:2029
byr:1922 iyr:2014 ecl:grn cid:233 hcl:#888785 pid:802870003

hgt:184cm
ecl:oth hcl:#888785 iyr:2010 byr:1929 eyr:2030
pid:063671905

hcl:#888785 hgt:144 eyr:1961
iyr:2005
byr:2027
cid:164 pid:41787324
ecl:utc

hcl:#7d3b0c
pid:570743051 byr:2022 eyr:1975
iyr:2018 ecl:utc hgt:188in

eyr:2028 pid:970460968
hgt:161cm
iyr:2017 ecl:amb
cid:318 byr:1967 hcl:#cfa07d

hgt:183cm eyr:2036 hcl:070713 iyr:1959
cid:242 byr:2011 pid:#0855a5 ecl:lzr

hcl:#ceb3a1 eyr:2023 iyr:2016
ecl:oth hgt:84
pid:156cm byr:1949

eyr:2025 ecl:brn hgt:172cm pid:487559063 iyr:2013
hcl:#efcc98
byr:1985

eyr:2023 hcl:#6b5442 byr:2021 hgt:75cm iyr:1943
pid:427375038 ecl:#70c167

ecl:hzl
eyr:2028 byr:1957 iyr:2010
hcl:#602927
hgt:151cm pid:755290924

cid:184 hgt:172cm
pid:7056500139 iyr:2016 byr:2016
hcl:e40e08 ecl:#d21247

ecl:oth
eyr:2025
iyr:2010 byr:1971 cid:128 pid:932834922
hcl:#602927
hgt:167cm

ecl:brn hgt:61in iyr:2016 hcl:#341e13
pid:918193693 byr:1972 eyr:2029 cid:56

byr:1956 iyr:2020 eyr:2030 hgt:72in
pid:179969841
ecl:blu

ecl:#09fd92 cid:209 hgt:69cm iyr:2014
eyr:2028 pid:#2ad9c0 hcl:#b6652a
byr:2012

ecl:lzr byr:1980 cid:104
iyr:1965 pid:57029893 hcl:z
eyr:2030 hgt:64cm

pid:496149551
hcl:#6b5442 hgt:181cm byr:1978 iyr:2017
eyr:2026
cid:291 ecl:hzl

iyr:2018 hcl:#ceb3a1
eyr:2021 cid:183 pid:612653062
ecl:oth
byr:1982

hgt:153cm pid:877597531 ecl:gry
iyr:2014 hcl:#866857 cid:333
byr:1953
eyr:2022

iyr:2015
ecl:brn
pid:823959694 byr:1998 hcl:#18171d
eyr:2025 hgt:174cm

iyr:2012 cid:93
ecl:oth pid:142618419 byr:1955 hgt:193cm eyr:1977 hcl:#602927

hcl:z ecl:dne iyr:1926 eyr:2026 pid:175cm hgt:150 byr:2023 cid:234

hgt:61cm iyr:1965 byr:1956
pid:224946350 cid:105
eyr:1951 hcl:#733820 ecl:amb

hcl:#866857
byr:1970 pid:447859408
eyr:2030
hgt:65in iyr:2011 ecl:grn

cid:184 eyr:1976 byr:2021 hgt:187cm
pid:858786336 ecl:#0d63e1 hcl:z

hgt:178cm iyr:1986 hcl:51ac0c ecl:dne eyr:2023 pid:180cm

hcl:#cfa07d pid:002093179
ecl:oth
byr:1983 hgt:159cm iyr:2016 eyr:2025

ecl:gry hcl:#c0946f
byr:2009 pid:#e00fc8
hgt:62in cid:150 iyr:2013 eyr:1957

byr:1942 ecl:oth eyr:2020 pid:765036664 hcl:#6b5442 iyr:2015 cid:155

ecl:hzl iyr:2014
hcl:#efcc98 hgt:179cm eyr:2028
byr:1921 pid:#666905

ecl:utc eyr:2040 hcl:669f5b pid:981368190
byr:2006 iyr:1949
hgt:179in

ecl:#062fcd eyr:2035 byr:1962 iyr:2026 hcl:z hgt:161cm pid:75591618

hcl:#b25ef5 pid:434943296
ecl:oth hgt:165cm
iyr:2013 eyr:2020
cid:78 byr:1924

iyr:2018 ecl:oth byr:1972 eyr:2028 pid:035313920
hgt:59in hcl:#fffffd

hgt:185cm
hcl:#6b5442
cid:102 iyr:2020 byr:2001
eyr:2028 pid:003365121 ecl:amb

pid:90937712 hcl:z hgt:173in byr:2012 ecl:blu iyr:2009 eyr:2039

pid:509460932 eyr:2026
hgt:71in iyr:2010 cid:138 byr:1929 ecl:grn

ecl:xry
hgt:119
pid:051834447 eyr:2033
iyr:2030 hcl:z byr:2030

pid:443984745 eyr:2026 ecl:oth
byr:1948 hcl:#a97842 hgt:168cm
iyr:2017

hcl:#602927 iyr:2020 cid:161 pid:069708283 hgt:178cm byr:1960
eyr:2022 ecl:hzl

iyr:2026 hcl:766b30 eyr:2032 byr:2030 pid:40361792 hgt:158in ecl:#b300dc

eyr:1998 pid:#5c21e4 iyr:2029 ecl:#bef182
byr:1944 hgt:166in
hcl:#b6652a cid:317

ecl:amb
eyr:2024
hcl:#a97842
pid:086765271 hgt:183cm iyr:2018 cid:314 byr:2001

hgt:163in pid:491612094 iyr:2028
cid:82 ecl:#8a052d
hcl:#ceb3a1
eyr:2018

byr:1970 eyr:2039
hgt:174in hcl:#623a2f
iyr:2020 cid:154 ecl:grn pid:103138652

pid:73895324 eyr:2026 byr:1952 ecl:brn hcl:#733820 hgt:159in iyr:2015

hcl:#623a2f ecl:brn eyr:2026 hgt:185cm pid:791563822 iyr:2019 byr:1951

hcl:#fffffd
iyr:2014 hgt:83 cid:101 pid:724483094
eyr:1995 byr:2015 ecl:lzr

hcl:#ceb3a1
iyr:2013
eyr:2021 byr:1994 ecl:hzl
pid:037849486 hgt:60in

pid:63340670 iyr:1995 hcl:b54c2b hgt:71cm
cid:184 byr:2004 ecl:dne eyr:2026

hgt:169cm
ecl:brn byr:1947 iyr:2014 cid:224 hcl:#7374df

hcl:#623a2f
pid:471948403 ecl:gry
hgt:154cm
eyr:2023 iyr:2016 byr:1925

eyr:2024 hgt:180cm hcl:#efcc98 iyr:2020 ecl:gry byr:1961 pid:318184801

ecl:blu iyr:2012 eyr:2020 hgt:190cm
byr:1977
pid:331654452 hcl:#cfa07d

pid:812502106 byr:1938
eyr:2020 hgt:169cm ecl:oth hcl:#341e13 iyr:2011

cid:286 byr:1942 eyr:2034 hgt:116
ecl:utc
iyr:2023 hcl:#602927 pid:181cm

ecl:amb iyr:2011 hcl:#cfa07d eyr:2029 byr:1975
hgt:183cm pid:548900689

ecl:utc pid:182cm
hgt:60cm
eyr:1989 iyr:1993 hcl:z

iyr:1985 hgt:186 byr:2018
eyr:2001 pid:9257131167
hcl:261a65 ecl:lzr

hgt:152
byr:1922 pid:72992226
iyr:1968
ecl:dne eyr:2028 hcl:5c2950

ecl:grn
byr:1943 hgt:74in eyr:2022
pid:135491924
iyr:2011 hcl:#623a2f

iyr:2026 pid:7955389103
cid:311
ecl:#b81171 hcl:z eyr:1935 byr:2024

byr:1974 iyr:2010 hgt:165cm
ecl:amb cid:343 eyr:2023
pid:972786259 hcl:#6b5442

iyr:2020 byr:1936
ecl:gry hcl:#efcc98 hgt:170cm eyr:2021 pid:520354073

hgt:185cm hcl:#ceb3a1
pid:317012754 byr:1991
cid:199 iyr:2011
ecl:blu eyr:2028

ecl:#e4e01f byr:2008
cid:293 iyr:2013 hcl:z pid:#368f7a eyr:2036

eyr:2022 pid:424388475 iyr:2008 hcl:z hgt:61cm
ecl:zzz byr:1985

hcl:#18171d iyr:2014
cid:88
byr:1951 eyr:2021 pid:812441789 hgt:181cm ecl:blu

ecl:amb eyr:2029 hgt:70in pid:580245172
iyr:2010 byr:1927
hcl:#a97842
cid:284

hcl:#3b85ed
ecl:gry eyr:2029 pid:417534919 byr:1960
iyr:2010 hgt:71in

hcl:#c0946f
pid:824103775 hgt:157cm iyr:2018 ecl:brn eyr:2024 byr:1961

pid:673501373
eyr:2033
ecl:#06523f hcl:z byr:2030 iyr:1978 hgt:153cm

iyr:2019
hcl:#a97842 byr:1951 hgt:183cm eyr:2024 ecl:blu
pid:346079429

eyr:1937 pid:964649406
hgt:162
cid:66
ecl:#f89cc0
hcl:#866857 byr:2024

hgt:114 ecl:#e7ed3a
byr:2029 cid:190
eyr:2026 iyr:1986 hcl:z pid:185cm

hcl:#cfa07d hgt:192cm
pid:12494711 eyr:2028
iyr:2020
ecl:brn byr:2004

pid:710015269
byr:2011 eyr:2033 hgt:181cm
ecl:#fb2702

cid:259 pid:208799387
eyr:2025 hcl:#623a2f byr:1947 ecl:oth hgt:164cm iyr:2014

ecl:brn eyr:2025 pid:432178809 hcl:#341e13
cid:50
hgt:192cm iyr:2012
byr:1994

hgt:150in pid:4902585462 ecl:#7074ad cid:230 iyr:2019 eyr:1931 hcl:z byr:2007

ecl:gry
byr:1942
hcl:#602927 cid:178 iyr:2014 hgt:193cm pid:349100081 eyr:2030

byr:1923 hcl:#cfa07d eyr:2021 ecl:brn pid:591544598 hgt:157cm
iyr:2016

hcl:e15737
iyr:2017 byr:2030
eyr:1994 pid:470833249
hgt:181cm cid:70 ecl:grn

eyr:2030
hcl:#866857 pid:569423049 byr:1948
ecl:oth

eyr:2026
byr:2006
hcl:#ceb3a1
iyr:2010 pid:094156115 hgt:64cm ecl:oth

byr:2002 cid:215 ecl:hzl
hcl:#602927 iyr:2015 pid:53150410 hgt:168cm eyr:2028

iyr:2016 hcl:#7d3b0c hgt:162cm
byr:1937 eyr:2020 ecl:hzl pid:728906226

byr:1921
iyr:2018 hcl:#888785
eyr:2026 hgt:185cm pid:164432370 ecl:brn

ecl:gry iyr:2011
eyr:2026 hgt:190cm
hcl:#866857 pid:884570088 byr:1996

ecl:blu
cid:257
iyr:2016 byr:1989
eyr:2024 hgt:179cm hcl:#c0946f pid:418340261

pid:9367990743 hcl:z hgt:182in ecl:utc
byr:1988 eyr:2025

ecl:hzl hgt:157cm
iyr:2010 eyr:2027
hcl:#fffffd byr:1956

eyr:2024 pid:834302242 ecl:hzl
iyr:2015 cid:97 hgt:188cm hcl:#888785 byr:1927

ecl:brn eyr:2021 byr:1958
hcl:#a97842 hgt:170cm pid:256795932 iyr:2017

hcl:756c4a
pid:812879747
byr:2002
eyr:2027 ecl:blu iyr:1952 hgt:66cm

pid:#c5e14f
iyr:2026 byr:2028 hgt:162 hcl:87ba57
eyr:1952 ecl:lzr

hcl:#341e13 hgt:81 eyr:2021 iyr:2029 cid:262 ecl:amb pid:61006868
byr:2011

pid:#e58702 cid:145 hcl:#866857
ecl:grn iyr:2028 hgt:192in eyr:2025 byr:2017

iyr:2026 byr:1969
ecl:grn
hgt:70cm cid:140 hcl:e0f231 eyr:2027
pid:2832019

cid:112 eyr:2028 iyr:2018 hcl:#7d3b0c pid:868808117 byr:1985 ecl:blu

iyr:2017
pid:350399038
cid:72 hcl:#ceb3a1
ecl:gry
hgt:151cm byr:1946 eyr:2029

eyr:2026 hgt:174cm iyr:2010 pid:534641153 hcl:#733820 byr:1965

hgt:66cm
byr:2010 ecl:gmt eyr:2039
iyr:2024 hcl:z

pid:626085326
byr:1971 eyr:2024
hcl:#cfa07d hgt:170cm
ecl:hzl iyr:2019

hgt:185cm pid:995661846 ecl:hzl iyr:2016 byr:1963 hcl:#a97842 eyr:2023

ecl:grt iyr:1976 byr:2010
pid:170cm
cid:343 hcl:#7d3b0c hgt:171cm

pid:732695396
ecl:zzz hgt:151in byr:1955
eyr:2035 iyr:2026 hcl:z

hgt:187cm hcl:#341e13 iyr:2015 pid:556697270 eyr:2025 ecl:blu byr:1926

ecl:oth
pid:515980529
hgt:168cm eyr:2023
byr:1983 iyr:2012 hcl:#341e13

byr:2010
hgt:189cm iyr:2016
hcl:#8ff71e
eyr:2010
ecl:blu
pid:317940449

iyr:2013 hgt:157cm hcl:#a97842 pid:967988435
ecl:blu cid:214 eyr:2027 byr:1960

pid:2666548509 cid:208 hgt:72cm hcl:#7d3b0c eyr:2040 byr:2008
ecl:amb
iyr:1926

eyr:2039
pid:203432895 hgt:154cm byr:1949
iyr:2010
hcl:z cid:144 ecl:xry

pid:984689798 byr:2016 iyr:1999 ecl:utc
eyr:2037 hgt:68cm hcl:z

byr:1969 cid:230 hgt:72cm eyr:2032
ecl:gry pid:849701444
hcl:#c0946f
iyr:2012

eyr:2026
pid:588870142
hcl:#ae5619 hgt:173cm
cid:189
ecl:grn byr:1996 iyr:2013

byr:1973
hcl:#cfa07d ecl:blu
hgt:193cm eyr:2028 cid:115 pid:786380485 iyr:2011

hcl:#fffffd eyr:2028 hgt:155cm pid:499022582
ecl:blu byr:1977 iyr:2014
cid:212

ecl:#92bb4b
pid:815154669 byr:1923 eyr:2023
hgt:183cm iyr:1929 hcl:#ceb3a1

byr:1966 eyr:2021 iyr:2020 hcl:#6b5442 ecl:hzl
pid:3508035599
hgt:70in

ecl:amb
hcl:#18171d
byr:1927
hgt:177cm pid:555764540 iyr:2018 eyr:2025 cid:90

hgt:139 ecl:#878a7d byr:2006 cid:275 iyr:1980 hcl:60fca6 eyr:1952 pid:001439727

byr:1985
hgt:174cm ecl:gry
iyr:2018
cid:204 hcl:#733820
pid:141048398 eyr:2027

ecl:gmt hcl:#6b5442 hgt:158cm
iyr:2025
byr:2030 pid:966397365 eyr:2029

byr:1962 hgt:166cm pid:261989937 cid:320 eyr:2026
iyr:2015 hcl:#c0946f
ecl:hzl

pid:852283506 iyr:2018 eyr:2020 byr:1981 hcl:#733820
ecl:hzl
hgt:162cm

pid:3873488100 iyr:1982 ecl:grn
hgt:63cm eyr:1936
byr:2011 hcl:8d118a

iyr:1937
hcl:817646
byr:2026 eyr:2031 pid:#47591d hgt:183in
ecl:blu

eyr:2025 hgt:153cm iyr:2015 pid:498382864
cid:307
byr:1943
hcl:#f66fe1 ecl:oth

iyr:2017 hgt:66in byr:1948 hcl:#b6652a eyr:2025
pid:188366364
ecl:amb

ecl:lzr
pid:453174702 iyr:2028 eyr:2032 cid:228 byr:2011 hcl:z
hgt:172cm

hgt:186cm eyr:2030 cid:316 hcl:z byr:1994
iyr:2012 ecl:amb pid:993162839

hgt:160cm
ecl:grn pid:523473760 byr:1993
iyr:2016 eyr:2025 hcl:#602927 cid:261

iyr:2016 pid:520973843 ecl:gry
eyr:2023 cid:232
byr:1944 hgt:159cm hcl:#cfa07d

byr:1969 hcl:#1d37de hgt:184cm eyr:2027 pid:088048141
iyr:2016 cid:307 ecl:hzl

eyr:2040 iyr:2012 pid:723592140
hgt:61cm hcl:#18171d ecl:dne

eyr:2025
ecl:oth pid:4697392468
hgt:183cm iyr:2017 hcl:b07d71
byr:1996

ecl:amb eyr:2022 cid:143 pid:806594272 hgt:158cm byr:1977 iyr:2014
hcl:#866857

ecl:blu
eyr:2022 iyr:2018 byr:1983 hgt:167cm cid:321 hcl:#efcc98
pid:344179526

byr:1925 eyr:2021
hgt:193cm iyr:2020 ecl:grn
hcl:#888785

iyr:2018
cid:319 byr:1972 hgt:181cm hcl:#fffffd eyr:2023 pid:493780616

eyr:2021
hcl:#733820
ecl:#e91c71
iyr:2020 pid:451676066 hgt:166in
byr:1993

eyr:2026
hcl:#b6652a ecl:blu byr:1999 iyr:2020
hgt:163cm pid:955741810

iyr:2016 hgt:179cm hcl:#602927
pid:673271332 byr:1963 eyr:2027 ecl:amb

byr:1927
iyr:2015 hcl:#866857
ecl:oth
hgt:159cm
pid:992992996 eyr:2030

pid:283188332 hgt:168cm hcl:#6b5442
eyr:2027 byr:2028 ecl:hzl iyr:2030

byr:1944 pid:628012522 eyr:2020
hcl:#866857
iyr:2019 ecl:amb
hgt:168cm

cid:317 pid:333228098 hgt:158cm iyr:2014 byr:1958 eyr:2024 hcl:#a97842 ecl:oth

hcl:#733820
cid:314 ecl:oth byr:1938 eyr:2030 hgt:71in
pid:790938694 iyr:2014

iyr:2020 ecl:grt eyr:2018
hgt:155cm
pid:1034925815 hcl:#623a2f cid:304

ecl:brn hgt:158cm hcl:#38fe6c eyr:2030 byr:1926 pid:0860404500 iyr:1993 cid:348

byr:1998
hgt:185cm
ecl:brn eyr:2021 pid:567032567 hcl:#733820 cid:328 iyr:2017

pid:491430863 cid:146 hgt:181cm eyr:2026 iyr:2015 ecl:amb byr:1950 hcl:#c0946f

eyr:2033 cid:289
pid:396679011 ecl:oth byr:1988
hgt:156in
hcl:#cfa07d iyr:2029

ecl:grn iyr:2015
byr:1986 hcl:#a97842 hgt:62in
pid:403990108 eyr:2030

pid:42635067 cid:301
iyr:2027 hgt:173in
byr:2004 hcl:z
eyr:2034

byr:2020 hcl:#fffffd
hgt:180in eyr:2040 pid:304951921
iyr:2030 ecl:#1aaf20

iyr:2020 hcl:#888785 ecl:hzl hgt:181cm byr:1992 eyr:2021 pid:936006959

hgt:172in ecl:#fd71a7
hcl:787715 pid:363058480 byr:2020
iyr:2022
eyr:2034

iyr:2018 ecl:blu eyr:2029 hcl:#cfa07d hgt:155cm byr:1937 pid:851148031

byr:2014
cid:222 ecl:zzz hgt:67cm eyr:2040 pid:#8ab0e2 hcl:z iyr:2027

hgt:180cm hcl:#375883 eyr:2027 byr:1925 ecl:brn
iyr:2011
pid:158752719

byr:1935 ecl:oth eyr:2027 pid:041108579
hcl:#602927 iyr:2011 hgt:190cm

hcl:#a97842 pid:131728607 ecl:blu iyr:2014 hgt:176cm eyr:2020
byr:1921

pid:11754457
iyr:2018
hgt:65cm eyr:2038
ecl:dne hcl:z
cid:293
byr:1940

eyr:2023
iyr:2016
byr:1930
ecl:hzl
cid:212
hcl:#733820 hgt:59in
pid:319501919

cid:278
eyr:1967 hcl:#ceb3a1 pid:#9f5254 hgt:177in byr:1977 iyr:2030

hcl:#ceb3a1 byr:1998 hgt:72in cid:202 ecl:gry pid:463378493 iyr:2015
eyr:2030

hcl:#7d3b0c hgt:164cm ecl:hzl byr:1960 eyr:2023
iyr:2017

ecl:hzl hcl:#866857 byr:1986 iyr:2018 eyr:2027 hgt:176cm pid:928057092

pid:431113230 hgt:186cm eyr:2025
iyr:2018 ecl:amb byr:1973 hcl:#623a2f

hcl:#cfa07d hgt:179cm iyr:2017 pid:760075190 ecl:amb eyr:2030

hcl:#602927
iyr:2012
pid:571020910 ecl:#b6715d byr:1943 eyr:2028
hgt:161cm

hgt:176cm cid:121 pid:654127593 ecl:brn hcl:#160d38 iyr:2015
eyr:2021 byr:1997

eyr:2021 byr:1929
pid:192025713
hcl:#c0946f iyr:2012 ecl:oth hgt:179cm

eyr:2024 ecl:gry
hgt:158cm byr:1932 hcl:#ceb3a1
iyr:2010
pid:521188306

eyr:2028 ecl:brn
hcl:#efcc98
hgt:157cm
iyr:2012
pid:212547203 byr:1970

eyr:2029 pid:182693366 hcl:#623a2f hgt:130 byr:1972
cid:310
iyr:2010 ecl:amb

byr:1944 iyr:2013
ecl:brn cid:335
hgt:163cm
eyr:2025 hcl:#7d3b0c pid:405230824

hcl:#ceb3a1 iyr:2015 pid:572001387 byr:1962
ecl:amb hgt:151cm

byr:1928
eyr:2022
iyr:2018 ecl:blu
hcl:#602927 pid:767081131

byr:1948 hgt:180in pid:188cm
ecl:hzl
eyr:2013 hcl:e0b9f3 iyr:1975

hcl:#c0946f byr:1989
eyr:1980 hgt:67cm pid:538025041
iyr:2014 ecl:gry

eyr:2028 pid:958756919 hcl:#733820 byr:1945 cid:158 ecl:blu
hgt:168cm iyr:2018

cid:200 hcl:#fffffd
byr:2015 ecl:gry eyr:2031 hgt:59 pid:065027646
iyr:1967

byr:1999 ecl:hzl pid:813536928 iyr:2015 cid:296 hcl:#6b5442
eyr:2025 hgt:186cm

byr:2000 iyr:2012
hcl:#fffffd
cid:263 hgt:68in pid:105489529
ecl:amb eyr:2024

eyr:2026 hcl:#602927 hgt:181cm
byr:1982
pid:603871531 iyr:2018 ecl:blu

cid:302 pid:387895477 eyr:2027
hcl:#cfa07d hgt:191cm iyr:2015
ecl:hzl byr:1940

iyr:2018 cid:165
ecl:blu hgt:181cm byr:1994 eyr:2026 pid:077013268

eyr:2022 hgt:174in iyr:2010 byr:2023
hcl:#733820 ecl:oth
pid:311692961

ecl:#10f2a9 pid:964417986
eyr:2024 hcl:#0aeec7 byr:1965 iyr:1943 hgt:167cm

hcl:#341e13 iyr:2020
ecl:brn
hgt:188cm eyr:2021 byr:1952
pid:077471062

byr:1950 cid:110 hgt:160cm eyr:2026
hcl:#623a2f
iyr:2013
pid:972823574

pid:553704996 hgt:171cm
eyr:2028 iyr:2017
hcl:#18171d byr:1954 ecl:blu

hgt:180cm ecl:brn eyr:2029 pid:707999496 hcl:#cfa07d byr:1960

pid:9325738036 iyr:1996 hgt:152in byr:2004 cid:292 hcl:14a56f
eyr:2031
ecl:#dbd99d

byr:1957
eyr:2021 pid:557648216 ecl:amb hcl:#7d3b0c hgt:186cm
iyr:2020

hcl:#602927 hgt:186cm pid:604175608
iyr:2013 eyr:2026 ecl:oth byr:1991 cid:65

ecl:gry
iyr:2012 hgt:154cm
pid:872898058 eyr:2030 hcl:#341e13 byr:1994

pid:228236326
iyr:2013 cid:347 byr:1942
eyr:2021 ecl:brn
hgt:165cm
hcl:#fffffd

pid:392777182 cid:189 hcl:#cfa07d eyr:2027 hgt:191cm ecl:blu byr:1978

hgt:158in iyr:2028
pid:5145408095 byr:2012 ecl:#94c57d hcl:z eyr:1996

byr:1949 eyr:2021
ecl:#5ffbeb iyr:1948 pid:42650064 hcl:z hgt:167cm

iyr:2013 ecl:xry cid:100
hgt:138 byr:2013
eyr:1944 hcl:92b68c

hgt:187cm
ecl:grn hcl:#602927
iyr:2010
eyr:2022 byr:1949 cid:280 pid:251802347

ecl:grn
cid:219
iyr:2018 hgt:165cm
pid:703878503 eyr:2024 hcl:#b6652a
byr:2002

hcl:#18171d cid:341 ecl:amb byr:1941 eyr:2021 iyr:1990 pid:865132177 hgt:153cm

byr:2008 pid:861480549
cid:97 eyr:2028 hcl:#efcc98
iyr:2015
hgt:191cm ecl:#232b23

hcl:#cfa07d
eyr:2030 iyr:2013 cid:304
ecl:gry pid:199056608 hgt:192cm
byr:1926

pid:355135528 hgt:153cm byr:1998 iyr:2019 eyr:2027
ecl:amb hcl:#18171d

eyr:2028 hcl:8eed9c ecl:grn
iyr:2010 byr:2005 hgt:107
pid:64892698

pid:601671623 hgt:153cm iyr:2011 hcl:#b6652a byr:1975 ecl:grn eyr:2029

ecl:grn hcl:#18171d hgt:157cm
eyr:2023 pid:507932715 byr:1920 iyr:2020

eyr:2022 byr:1933 hcl:#fffffd iyr:2016 hgt:181cm pid:826522507 ecl:blu

byr:2002 hcl:#866857 hgt:177cm pid:240202426
ecl:gry cid:127
eyr:2022
iyr:2014

byr:1971
iyr:2017
pid:733985576 hcl:#c58c6c hgt:178cm
ecl:blu
eyr:2023

ecl:blu iyr:2017 pid:558732458 hcl:#1b3ab5 eyr:2025 byr:1967 hgt:176cm

eyr:2025 ecl:gry iyr:2020 byr:1988
hcl:#733820
hgt:189cm cid:151 pid:934827751

ecl:gry eyr:1951
iyr:1932
pid:309366394 byr:1945 hcl:#623a2f hgt:179cm

pid:462345884 ecl:hzl
cid:206 eyr:2021 hcl:#733820
byr:1982 hgt:180cm iyr:2010

iyr:2020 hgt:155cm hcl:#341e13 pid:110467532 cid:92 ecl:hzl byr:1975 eyr:2028

hcl:#18171d iyr:2010
hgt:182cm byr:1930
eyr:2024
cid:226

byr:1956 hcl:fb0c6f pid:181cm eyr:2012 iyr:2020
ecl:#d38822
hgt:69cm

ecl:gry iyr:2018
hgt:169cm byr:1981
pid:534824014 cid:287 eyr:2021 hcl:#c0946f

eyr:2039 hcl:#328e90 iyr:2015
hgt:170cm pid:#9fa2a4 byr:1999
ecl:#cd1fd7

hgt:190cm hcl:#733820
pid:302244363
ecl:brn
byr:1965 iyr:2013

iyr:2012
eyr:2021
pid:579705743
ecl:brn hgt:190in
byr:1954 hcl:#888785

eyr:2036 hgt:154cm
pid:800720865 byr:2023 ecl:oth iyr:2010 hcl:z

pid:#92f6a9 iyr:2028 eyr:1943
hgt:191cm ecl:hzl hcl:z byr:2018

hcl:#c0946f
pid:419930442 hgt:167cm
byr:1969
eyr:2020 ecl:brn

pid:137802946
eyr:2020 byr:1947 ecl:grn hgt:192cm iyr:2016 hcl:#888785

ecl:#f66cce eyr:1958 iyr:1954
pid:833131572
hcl:z
cid:212
hgt:109 byr:1924

hgt:179cm ecl:gry pid:065881341 byr:1985
hcl:#fffffd cid:204 eyr:2026

hgt:167cm
iyr:2017 pid:898571403 byr:1929
ecl:blu hcl:#d506d0 eyr:2028 cid:100

byr:1991 pid:2795214253 iyr:2011
cid:152 eyr:2028
hgt:170cm hcl:#a45065 ecl:lzr

hgt:188cm eyr:2030 iyr:2010
pid:297292695 byr:1955 hcl:#fffffd
ecl:blu

hgt:170cm eyr:2029 pid:913242036 byr:1993 cid:89 hcl:#888785
iyr:2010
ecl:blu

iyr:2028 eyr:2025 hgt:150in ecl:grn
byr:1995
pid:974802728
hcl:#cfa07d

eyr:2021 byr:1989
hcl:#18171d ecl:blu hgt:168cm
pid:626530259
iyr:2020

hcl:#6b5442 hgt:158cm pid:798732187 byr:1922 eyr:2020 iyr:2011 ecl:gry

hcl:#341e13 pid:092679330 byr:1997 ecl:oth hgt:159cm iyr:2010 eyr:2026

hgt:185cm
iyr:2020 byr:1947
pid:105846744 ecl:gry cid:134 eyr:2027

pid:252016128 hcl:9016ff cid:158 hgt:161 ecl:gry
byr:1952 eyr:1955 iyr:2018

iyr:2020 hgt:154in byr:1958
eyr:2029 ecl:#2feb89 pid:99780178

hcl:z
eyr:2001 ecl:gmt
byr:2022 hgt:73in iyr:2029
pid:388744230

hgt:186cm
byr:1939 pid:622948608 ecl:oth eyr:2030
hcl:#c0946f

cid:272
eyr:2025 byr:1979 ecl:brn hgt:180cm pid:456545466
hcl:#fffffd iyr:2012

pid:946657041 byr:1999
iyr:2014 hcl:#ceb3a1 hgt:150cm
ecl:grn

byr:1957 pid:177cm ecl:blu eyr:2020 hcl:#cfa07d
iyr:2010 hgt:183cm

pid:161cm eyr:2025 hcl:#b6652a
cid:213
ecl:xry
hgt:150cm
iyr:2024 byr:2012

hcl:ea1960
ecl:grn
pid:#7127b2 iyr:2012 eyr:2011 hgt:150

pid:178699291
hgt:66in eyr:2027
byr:1985 iyr:2014 ecl:amb

iyr:2017 ecl:blu
eyr:2027 hgt:191cm byr:1990 hcl:#b6652a pid:074411798

pid:528782860
hgt:181cm hcl:#c0946f byr:1965 iyr:2012 ecl:grn eyr:2020

pid:#ba10da hgt:176in byr:2006
ecl:grt
iyr:2030 eyr:1949 hcl:d3ca76

hgt:66cm ecl:#898478 hcl:#e9f7a5 eyr:2030 iyr:2022
byr:2025
pid:159cm

byr:1994 hcl:#ceb3a1
pid:028071950 eyr:2022 ecl:gmt hgt:151in iyr:2016

byr:2001 iyr:2011
ecl:brn
pid:487702556 hcl:#602927
hgt:167cm eyr:2026

A data/day04_test.dat => data/day04_test.dat +13 -0
@@ 0,0 1,13 @@
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm

iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929

hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm

hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in

M src/days.rs => src/days.rs +1 -0
@@ 1,3 1,4 @@
pub mod day01;
pub mod day02;
pub mod day03;
pub mod day04;

A src/days/day04.rs => src/days/day04.rs +63 -0
@@ 0,0 1,63 @@
use std::fs;

// Wrapper to implement is_valid method
// Could use Option for every field instead and check if field != None
// ^ More elegant, better for further processing, but takes work to parse
struct Passport {
    info: String,
}

impl Passport {
    fn is_valid(&self) -> bool {
        let info = &self.info;
        info.contains("byr")
            && info.contains("iyr")
            && info.contains("eyr")
            && info.contains("hgt")
            && info.contains("hcl")
            && info.contains("ecl")
            && info.contains("pid")
    }
}

fn count_valid_passports(passports: &Vec<Passport>) -> i32 {
    let mut count = 0;
    for passport in passports {
        if passport.is_valid() {
            count += 1;
        }
    }
    count
}

fn parse_contents(contents: String) -> Vec<Passport> {
    let mut passports = Vec::new();
    for password_info in contents.split("\n\n") {
        let info = password_info.to_string();
        let passport = Passport { info };
        passports.push(passport);
    }
    passports
}

pub fn get_solution() {
    let contents = fs::read_to_string("data/day04.dat").expect("Could not read data");
    let passports = parse_contents(contents);
    let count1 = count_valid_passports(&passports);

    println!("Day 4, part 1: {}", count1);
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn part1() {
        let contents = fs::read_to_string("data/day04_test.dat").expect("Could not read data");
        let passports = parse_contents(contents);
        let count = count_valid_passports(&passports);

        assert_eq!(count, 2);
    }
}

M src/main.rs => src/main.rs +1 -0
@@ 4,4 4,5 @@ fn main() {
    days::day01::get_solution();
    days::day02::get_solution();
    days::day03::get_solution();
    days::day04::get_solution();
}