Day 4
authorBrett Parker <iDunno@sommitrealweird.co.uk>
Fri, 4 Dec 2020 09:39:46 +0000 (09:39 +0000)
committerBrett Parker <iDunno@sommitrealweird.co.uk>
Fri, 4 Dec 2020 09:39:46 +0000 (09:39 +0000)
day4/count_valid_passports.py [new file with mode: 0644]
day4/count_valid_passports_2.py [new file with mode: 0644]
day4/input.txt [new file with mode: 0644]
day4/summary.txt [new file with mode: 0644]
day4/test.txt [new file with mode: 0644]

diff --git a/day4/count_valid_passports.py b/day4/count_valid_passports.py
new file mode 100644 (file)
index 0000000..3ea48a8
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/python3
+
+REQUIRED_FIELDS=(('byr', "Birth Year"),('iyr', "Issue Year"),('eyr', "Expiration Year"),('hgt', "Height"),('hcl', "Hair Colour"),('ecl', "Eye Colour"),('pid',"Passport ID"))
+OPTIONAL_FIELDS=(('cid', "Country ID"))
+
+def check_passport(passport_data):
+    print(passport_data)
+    for field in REQUIRED_FIELDS:
+        if field[0] not in passport_data:
+            return False
+    return True
+
+def main():
+    new_passport=False
+    passport_data=dict()
+    valid_passports=0
+    for line in open("input.txt"):
+        if new_passport:
+            if check_passport(passport_data):
+                valid_passports += 1
+            passport_data.clear()
+        line=line.rstrip()
+        if line == '':
+            new_passport=True
+            continue
+        new_passport=False
+        parts=line.split(" ")
+        for part in parts:
+            (key, value) = part.split(":")
+            passport_data[key] = value
+    if not new_passport:
+        if check_passport(passport_data):
+            valid_passports += 1
+    print("Found", valid_passports, "valid passports")
+
+main()
diff --git a/day4/count_valid_passports_2.py b/day4/count_valid_passports_2.py
new file mode 100644 (file)
index 0000000..e8a0d34
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/python3
+
+REQUIRED_FIELDS=(('byr', "Birth Year"),('iyr', "Issue Year"),('eyr', "Expiration Year"),('hgt', "Height"),('hcl', "Hair Colour"),('ecl', "Eye Colour"),('pid',"Passport ID"))
+OPTIONAL_FIELDS=(('cid', "Country ID"))
+VALID_EYE_COLOURS=('amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth')
+
+def check_passport(passport_data):
+    print(passport_data)
+    for field in REQUIRED_FIELDS:
+        if field[0] not in passport_data:
+            return False
+        # check the field data
+        if field[0] == 'byr':
+            if not check_year(passport_data[field[0]], 1920, 2002):
+                return False
+        elif field[0] == 'iyr':
+            if not check_year(passport_data[field[0]], 2010, 2020):
+                return False
+        elif field[0] == 'eyr':
+            if not check_year(passport_data[field[0]], 2020, 2030):
+                return False
+        elif field[0] == 'hgt':
+            if not check_height(passport_data[field[0]]):
+                return False
+        elif field[0] == 'hcl':
+            if not check_hair_colour(passport_data[field[0]]):
+                return False
+        elif field[0] == 'ecl':
+            if not passport_data[field[0]] in VALID_EYE_COLOURS:
+                return False
+        elif field[0] == 'pid':
+            if not check_pid(passport_data[field[0]]):
+                return False
+    return True
+
+def check_year(data, min_year, max_year):
+    try:
+        year = int(data)
+        if year >= min_year and year <= max_year:
+            return True
+        return False
+    except:
+        return False
+
+def check_height(data):
+    try:
+        unit = data[-2:]
+        value = int(data[:-2])
+
+        if unit == "cm":
+            if value >= 150 and value <= 193:
+                return True
+        elif unit == "in":
+            if value >= 59 and value <= 76:
+                return True
+        return False
+    except:
+        return False
+
+def check_hair_colour(data):
+    if data[0] != "#":
+        return False
+    if len(data) != 7:
+        return False
+    if data != data.lower():
+        return False
+    try:
+        value = int(data[1:], 16)
+        return True
+    except:
+        return False
+    return False
+
+def check_pid(data):
+    # first check that the string length is correct
+    if len(data) != 9:
+        return False
+
+    # now check that it's a number
+    try:
+        int(data, 10)
+        return True
+    except:
+        return False
+
+def main():
+    new_passport=False
+    passport_data=dict()
+    valid_passports=0
+    for line in open("input.txt"):
+        if new_passport:
+            if check_passport(passport_data):
+                valid_passports += 1
+            passport_data.clear()
+        line=line.rstrip()
+        if line == '':
+            new_passport=True
+            continue
+        new_passport=False
+        parts=line.split(" ")
+        for part in parts:
+            (key, value) = part.split(":")
+            passport_data[key] = value
+    if not new_passport:
+        if check_passport(passport_data):
+            valid_passports += 1
+    print("Found", valid_passports, "valid passports")
+
+main()
diff --git a/day4/input.txt b/day4/input.txt
new file mode 100644 (file)
index 0000000..54db857
--- /dev/null
@@ -0,0 +1,1159 @@
+iyr:2010 ecl:gry hgt:181cm
+pid:591597745 byr:1920 hcl:#6b5442 eyr:2029 cid:123
+
+cid:223 byr:1927
+hgt:177cm hcl:#602927 iyr:2016 pid:404183620
+ecl:amb
+eyr:2020
+
+byr:1998
+ecl:hzl
+cid:178 hcl:#a97842 iyr:2014 hgt:166cm pid:594143498 eyr:2030
+
+ecl:hzl
+pid:795349208 iyr:2018
+eyr:2024 hcl:#de745c hgt:157cm
+
+hgt:159cm pid:364060467 eyr:2025 byr:1978 iyr:2018 cid:117
+ecl:hzl
+hcl:#18171d
+
+hcl:#cfa07d
+ecl:amb iyr:2012
+hgt:182cm cid:338
+eyr:2020
+pid:374679609 byr:1925
+
+eyr:2021 byr:1981
+hcl:#623a2f cid:195 iyr:2010
+pid:579769934 ecl:grn hgt:192cm
+
+byr:1970
+ecl:oth
+eyr:2025
+pid:409994798 iyr:2018 hgt:189cm
+
+hgt:153cm pid:817651329 iyr:2019
+eyr:2029
+hcl:#623a2f byr:1920
+ecl:gry
+
+iyr:2011 ecl:amb hcl:#a97842 byr:1965 pid:648375525 eyr:2028 hgt:177cm cid:287
+
+iyr:2012 pid:369979235 hcl:#c0946f
+ecl:amb hgt:178cm
+
+byr:1927 ecl:brn hgt:178cm eyr:2026 hcl:#efcc98
+iyr:2011 pid:770851101
+
+eyr:2028
+ecl:oth cid:298
+byr:1943
+hgt:168cm iyr:2018 hcl:#ceb3a1 pid:116783406
+
+eyr:2027 hgt:175cm hcl:#733820
+ecl:gry cid:349 iyr:2017 byr:1960
+pid:257797292
+
+cid:66 ecl:amb
+eyr:2030
+iyr:2026 byr:2024
+hcl:a22966 hgt:179cm pid:155cm
+
+eyr:2023 hcl:#c0946f pid:081232570 ecl:hzl
+iyr:2010 hgt:158cm byr:1969
+
+byr:1958
+ecl:grn hcl:#ceb3a1
+hgt:173cm
+pid:600039004
+cid:107 iyr:2012 eyr:2027
+
+ecl:amb pid:021066381
+hcl:#ceb3a1 byr:1982 iyr:2017
+hgt:167cm eyr:2025 cid:61
+
+hcl:#341e13
+cid:268
+pid:358390884 hgt:188cm byr:1961 iyr:2014 eyr:2027 ecl:blu
+
+ecl:brn eyr:2020
+pid:607203641
+hcl:#fffffd iyr:2011
+byr:1962
+hgt:156cm
+
+iyr:2018
+hcl:#b6652a
+byr:1942 ecl:blu eyr:2029 hgt:154cm pid:649263319
+
+ecl:oth hgt:73in iyr:2012 hcl:#888785 eyr:2020
+pid:147939289
+byr:1961
+
+ecl:oth iyr:2015
+hgt:189cm hcl:#341e13 pid:686943691 eyr:2023 byr:1987
+
+pid:568844323
+eyr:2023 byr:1921 hgt:167cm cid:154 hcl:#b6652a
+ecl:gry iyr:2020
+
+eyr:2023 byr:1994
+iyr:1937 hgt:177cm hcl:#c0946f pid:686240814 cid:231 ecl:#a8ba32
+
+hcl:#b6652a
+byr:1946 pid:543383899 iyr:2013 hgt:153cm ecl:hzl cid:238 eyr:2023
+
+eyr:2028 ecl:blu
+hgt:154cm cid:252
+pid:196374590
+byr:1987 iyr:2011
+hcl:#7d3b0c
+
+iyr:2013
+ecl:amb cid:187
+hgt:187cm pid:593027548 byr:1963
+eyr:2024 hcl:#fffffd
+
+pid:588211492 hgt:156cm
+iyr:2021 eyr:2021 ecl:gry hcl:z byr:1928
+
+ecl:amb hcl:#888785 hgt:180cm eyr:2022 byr:1923 pid:490291639 cid:173 iyr:2015
+
+iyr:2014 cid:211 pid:404157420 hcl:#602927
+ecl:oth byr:1946 eyr:2030 hgt:175cm
+
+hcl:z byr:2026
+pid:61805448
+hgt:125 iyr:2025
+
+eyr:2028
+hgt:156cm
+hcl:#341e13 cid:103 ecl:amb iyr:2017 byr:1937 pid:320691739
+
+hgt:185cm
+pid:440489464 byr:1929 ecl:amb iyr:2011 eyr:2021 cid:327 hcl:#341e13
+
+byr:1988 ecl:grn
+pid:062728732 iyr:2013
+hgt:181cm
+hcl:#18171d
+eyr:2026
+
+pid:000647617
+eyr:2029 byr:1937
+ecl:gry hcl:#e8eff3 hgt:164cm cid:151
+iyr:2016
+
+hgt:179cm
+byr:1949
+eyr:2029 pid:459190453
+ecl:grn iyr:2020 hcl:#c0946f
+
+hgt:160cm pid:476613532 cid:190 iyr:2016 hcl:#4657e5
+byr:1929
+eyr:2028
+
+ecl:grn
+eyr:2027 byr:1982
+hcl:#18171d
+pid:630408328
+cid:65 iyr:2020
+hgt:161cm
+
+pid:752776254
+hcl:#888785
+hgt:189cm
+eyr:2027 iyr:2020 ecl:hzl
+cid:194 byr:1934
+
+iyr:2015 hgt:167cm byr:1977
+eyr:2021 hcl:#14564f pid:504471386 ecl:oth
+
+hgt:84 pid:168cm
+hcl:8532fb eyr:2023
+iyr:2012 ecl:xry byr:2008 cid:288
+
+cid:323 eyr:2024
+iyr:2019
+pid:495737304 byr:1966 hcl:#7d3b0c ecl:hzl
+hgt:73in
+
+iyr:2020 byr:1953 ecl:hzl hcl:#efcc98 hgt:174cm eyr:2026 pid:546906638
+
+pid:839249028
+hcl:z byr:2024
+hgt:145 eyr:2034 iyr:2021 ecl:#891c47
+
+eyr:2036
+ecl:#89d2ae
+cid:183 byr:2014
+hcl:b3af0f
+pid:12086913 iyr:1981
+hgt:61cm
+
+ecl:brn eyr:2030 pid:083487445 byr:1929 hcl:z iyr:2021
+hgt:182 cid:318
+
+eyr:2020
+pid:188609216 hcl:#341e13
+iyr:2012 hgt:179cm
+
+eyr:2029
+hcl:#888785 pid:704026565 hgt:173cm iyr:2020 ecl:blu byr:1950 cid:237
+
+ecl:grn
+eyr:2030
+byr:1961 pid:695808266
+iyr:2012 cid:56
+hgt:155cm
+
+iyr:2011 ecl:amb
+byr:1986 pid:243061330 hgt:163cm eyr:2021
+
+eyr:2030 hcl:#623a2f hgt:170cm ecl:hzl
+pid:694575319 iyr:2011
+byr:1939
+
+iyr:2014 pid:184152121
+hcl:#c0946f hgt:163cm
+eyr:2028 byr:1992 cid:114
+
+ecl:hzl
+hgt:75in cid:233
+hcl:#866857 pid:269157261 iyr:2020
+byr:1973 eyr:2029
+
+hgt:174cm
+hcl:#f86751 iyr:2016
+pid:904779190
+ecl:brn eyr:2024 byr:1950
+
+cid:123 iyr:2019
+eyr:2030 pid:402585706
+ecl:brn byr:1995 hcl:#4ff7fa
+hgt:65in
+
+ecl:grn eyr:2029
+pid:083364259 iyr:2013 cid:50 byr:1938 hgt:187cm
+hcl:#a97842
+
+hcl:#6b5442 cid:101 iyr:2011
+ecl:amb eyr:2029 byr:1963 pid:664573740
+
+eyr:2025 hcl:#602927
+hgt:188cm
+iyr:2019
+pid:521514539 byr:1940 ecl:gry
+
+hcl:dc0449 eyr:1981 pid:188cm
+cid:151 iyr:1979 hgt:61cm ecl:dne
+byr:2028
+
+iyr:2017 byr:1924
+hgt:163cm eyr:2024 hcl:#ceb3a1 pid:424127124
+ecl:amb
+
+eyr:2039 pid:7837217107 hcl:z byr:2005
+iyr:1989 ecl:#d95f4d hgt:190in
+
+ecl:#329eb1 cid:178 hgt:192
+eyr:2020 iyr:2012
+hcl:#602927
+byr:2028 pid:7175349420
+
+ecl:gry byr:1931
+hgt:162cm iyr:2014
+eyr:2030 cid:50
+hcl:#cfa07d pid:653585396
+
+eyr:2025 hgt:177cm
+ecl:gry hcl:#efcc98
+iyr:2015
+byr:1942
+pid:388475446
+
+hcl:#efcc98 ecl:grn
+hgt:185cm
+byr:1921 pid:253592171
+eyr:2031 cid:220 iyr:2024
+
+byr:1950
+hgt:158cm ecl:gry iyr:2015 hcl:#18171d
+eyr:2023
+pid:151cm
+
+byr:1957
+hcl:z
+eyr:2026
+ecl:grn
+iyr:1971 hgt:192in pid:5479810865
+
+hgt:161cm pid:473851111 iyr:2018
+ecl:brn byr:1982
+eyr:2029
+
+pid:136216608 byr:1958
+cid:226 eyr:2023 hcl:#866857 iyr:2017 ecl:hzl hgt:159cm
+
+byr:1993 hcl:#866857 hgt:169cm pid:488392920
+cid:109 iyr:2017 ecl:oth eyr:2029
+
+cid:248 ecl:amb eyr:2025 iyr:2017 byr:1951 hcl:#ceb3a1 pid:731763175 hgt:162cm
+
+hcl:#835e79
+eyr:2021
+ecl:oth pid:617055193 byr:1997 iyr:2010
+hgt:173cm
+
+eyr:2024 pid:257895944
+hcl:#ceb3a1
+hgt:165cm
+ecl:oth iyr:2020
+byr:1958
+
+pid:438580092
+ecl:grt byr:2025
+hcl:z iyr:2000 eyr:1952
+cid:271 hgt:170in
+
+iyr:2010 hcl:#6b5442 hgt:156cm
+eyr:2026 ecl:grn pid:409793041 byr:1941
+
+pid:076486440
+hgt:177cm hcl:#888785 ecl:blu iyr:2017 eyr:2029
+
+eyr:2028 ecl:amb hgt:186cm hcl:#1d5836 pid:563307670 iyr:2019 byr:1950
+
+byr:1939 ecl:hzl hgt:193cm pid:329759796
+hcl:#cfa07d eyr:2025 iyr:2011 cid:73
+
+byr:1995
+hgt:188cm eyr:2028
+ecl:blu
+iyr:2016 hcl:#888785 pid:459613739 cid:115
+
+hcl:#623a2f
+eyr:2021 cid:197 hgt:187cm ecl:oth
+byr:1969
+iyr:2010 pid:385660251
+
+hgt:192cm cid:143 byr:1995 hcl:#fffffd
+iyr:2017 ecl:oth
+eyr:2020 pid:087661720
+
+ecl:oth
+byr:1994 hgt:183cm
+eyr:2020 iyr:2020 pid:448389966 cid:92 hcl:#866857
+
+pid:088166852 hgt:155cm cid:307 byr:1940
+hcl:#7d3b0c
+ecl:#af542f eyr:2023 iyr:2014
+
+byr:2026 eyr:2039 hcl:5449b3
+ecl:hzl hgt:176in
+iyr:1962 pid:177cm
+
+iyr:2020 ecl:amb hgt:164cm hcl:#c0946f
+pid:931543453 eyr:2024 byr:2001
+
+iyr:2010 eyr:2023 hgt:188cm
+hcl:#866857 ecl:hzl pid:866631112 byr:1997
+
+byr:1958 hgt:184cm
+cid:117 hcl:#7d3b0c iyr:2019 pid:615734013 eyr:2028 ecl:gry
+
+hgt:86 iyr:1935 ecl:grt pid:#af8e67 eyr:2031
+byr:2018 hcl:6a2940
+
+hgt:73in eyr:2022 pid:580461358 byr:1962
+cid:129 iyr:2015 hcl:#7d3b0c
+
+iyr:2019 hcl:#b6652a hgt:172cm ecl:blu pid:077121198 eyr:2021
+byr:1995
+
+hcl:#ceb3a1 cid:253
+iyr:2015 hgt:177cm byr:1973
+ecl:hzl pid:311289324 eyr:2025
+
+iyr:2017 hcl:#efcc98
+cid:57 byr:1940 ecl:blu
+eyr:2025 hgt:157cm pid:827480048
+
+eyr:2028 hgt:189cm
+iyr:2016 byr:1978 ecl:hzl pid:127497651 cid:87
+hcl:#623a2f
+
+hcl:#341e13 byr:2015
+ecl:brn hgt:187in
+pid:82075551
+eyr:1936
+cid:200
+iyr:1939
+
+ecl:grn byr:1962
+iyr:2011 hgt:169cm
+pid:661559147
+hcl:#623a2f eyr:2023
+
+ecl:gry
+hcl:#efcc98 eyr:2009 byr:2028
+hgt:170in
+cid:129 pid:161cm iyr:2018
+
+pid:098090405 hcl:#623a2f byr:1943 ecl:hzl
+hgt:152cm iyr:2013 eyr:2029
+
+pid:495271053 iyr:2011 ecl:gry hcl:#623a2f cid:285
+byr:1925 eyr:2024 hgt:187cm
+
+cid:306
+hgt:73in
+iyr:2010 hcl:#448fd7
+byr:1946
+ecl:grn pid:137146932 eyr:2021
+
+eyr:2020 hgt:159cm cid:90 iyr:2010 ecl:brn hcl:#341e13 byr:1955
+
+hcl:#18171d iyr:2017 ecl:amb
+pid:168517472
+eyr:2021 hgt:181cm byr:1942
+
+cid:325 eyr:2022 pid:947158470 byr:1994 iyr:2019 ecl:grn hgt:172cm hcl:#ec63ce
+
+iyr:2011
+pid:243339529
+ecl:amb
+hgt:169cm
+byr:1967
+eyr:2025 hcl:#b6652a
+
+pid:664966826 eyr:2036 iyr:2015 byr:1972 hgt:68in
+hcl:z
+ecl:#038105
+
+eyr:2021 pid:236054221
+hgt:179cm
+hcl:#b6652a iyr:2020 ecl:blu
+
+ecl:grn
+iyr:2010
+pid:870519416 byr:1945 hcl:#a97842
+hgt:176cm eyr:2030
+
+hcl:#3318db eyr:2022
+byr:1966
+ecl:grn iyr:2013
+cid:349
+hgt:168cm pid:827688488
+
+pid:124116963
+hcl:#866857 eyr:2026
+iyr:2013 ecl:grn byr:1983 hgt:183cm
+
+iyr:2017 byr:1993
+hcl:#18171d ecl:utc hgt:68in cid:168 eyr:2030 pid:#2fd9f2
+
+ecl:blu cid:134 eyr:2025 pid:588957573
+iyr:2017
+hgt:151cm byr:1942 hcl:#4280c1
+
+hcl:#51b593
+iyr:2013
+ecl:amb pid:668244584
+cid:282
+byr:1936
+eyr:1985 hgt:161cm
+
+pid:494051052
+hgt:185cm byr:1996 eyr:2028 iyr:2018
+ecl:amb
+hcl:#efcc98
+
+ecl:brn
+eyr:2025
+iyr:2011
+hgt:163cm hcl:#a97842
+byr:1989 pid:557549000
+
+pid:828235468 cid:55
+iyr:2010 byr:1926 eyr:2029 hgt:153cm hcl:#cfa07d
+ecl:blu
+
+hgt:158cm iyr:2015 pid:957913612 ecl:grn eyr:2020 byr:1984 cid:76 hcl:#6b5442
+
+ecl:amb eyr:2020 pid:596116320
+byr:1936
+hcl:#cfa07d
+hgt:165cm cid:86 iyr:2014
+
+iyr:2012
+cid:278 hcl:#602927
+eyr:2020 ecl:hzl
+hgt:176cm byr:1987 pid:594817909
+
+iyr:2011 byr:1929 pid:073211525 eyr:2022
+hgt:188cm
+ecl:blu
+hcl:#733820
+
+hcl:#602927 hgt:187cm
+pid:706155322 cid:203
+ecl:brn byr:1952 iyr:2017 eyr:2020
+
+hcl:bcb5f7
+byr:2002 eyr:2029 pid:850069752 iyr:2019 ecl:hzl
+hgt:167cm
+
+hcl:#b6652a hgt:72in iyr:2013
+ecl:grn eyr:2024 byr:1920 cid:114
+pid:983486664
+
+byr:1931 iyr:2020 pid:182737852 hgt:162cm
+ecl:grn hcl:#888785 eyr:2028
+
+eyr:2035
+byr:1962 iyr:2012 cid:120
+ecl:xry
+hgt:61cm hcl:ce89a8 pid:335540582
+
+pid:#05153d iyr:1990
+eyr:1927 hgt:71cm
+byr:2019 cid:346 ecl:#e38688
+hcl:c6abd9
+
+ecl:#cd58d8 pid:166cm iyr:2012
+hcl:0d1b02 hgt:68
+eyr:1958
+
+pid:976419172 byr:1922 cid:345 hcl:#6b5442 iyr:2010 eyr:2026
+ecl:grn hgt:155cm
+
+ecl:gry hcl:#1bbadc hgt:168cm
+eyr:2028
+byr:1984 cid:179 iyr:2013 pid:706186218
+
+ecl:blu hgt:188cm
+pid:764775319 byr:1936 hcl:#7d3b0c iyr:2020
+
+hcl:#623a2f
+iyr:2012
+pid:382832140 ecl:gry
+eyr:2026
+cid:350
+hgt:165cm byr:1968
+
+hcl:0b87a1 byr:2020 pid:4365879329
+cid:110 ecl:grn
+eyr:2032 hgt:155cm
+iyr:2018
+
+hgt:193cm eyr:2029 hcl:#733820 pid:081071142 byr:1929 ecl:oth
+
+ecl:brn
+eyr:2023 pid:876924536 cid:165
+hcl:#efcc98 hgt:151cm byr:1972
+iyr:2020
+
+hgt:186cm eyr:2022
+ecl:grn
+byr:1972 pid:997639611 hcl:#ceb3a1 iyr:2013
+
+byr:1926
+pid:808460262
+iyr:2012 eyr:2031 hcl:#a97842 ecl:amb
+hgt:190cm
+
+hgt:163cm
+hcl:#ceb3a1 eyr:2028
+ecl:grn
+byr:1944 pid:381144425 iyr:2012
+
+hcl:#95a232 pid:015229624 byr:1947 iyr:2013 hgt:66cm ecl:gry eyr:2027
+
+hcl:z byr:1965 iyr:2013 hgt:157cm ecl:#8b12fb cid:246 pid:283039791 eyr:2023
+
+ecl:gry byr:1950
+hcl:#623a2f cid:276 iyr:2013 eyr:2030 pid:798610943 hgt:189in
+
+eyr:2030 cid:52 hcl:#fffffd pid:041625574 ecl:amb iyr:2016 byr:1944
+hgt:191cm
+
+byr:1995
+iyr:2015 cid:221 pid:279080024
+eyr:2022
+hgt:181cm ecl:brn hcl:#888785
+
+hcl:z
+ecl:blu
+iyr:1970
+eyr:2022
+hgt:193cm pid:#540e31 cid:95 byr:1952
+
+hcl:z eyr:2024 ecl:hzl
+byr:2028
+cid:323 pid:1949331457
+hgt:69
+
+eyr:2030 hcl:#866857
+cid:173 iyr:2017
+hgt:190cm byr:1941
+ecl:blu
+pid:269015932
+
+hcl:#b6652a
+iyr:2018
+eyr:2022 ecl:brn hgt:185cm pid:456195468
+
+hcl:#6b5442 hgt:188cm
+iyr:2019 byr:1966 cid:298
+pid:050653473
+ecl:gry eyr:2028
+
+cid:208
+ecl:amb eyr:2023 hgt:176cm byr:1971 hcl:#7d3b0c pid:650190272 iyr:2018
+
+hgt:68in pid:615309584
+iyr:2011 byr:1950
+hcl:#efcc98 ecl:oth
+eyr:2024
+
+eyr:2022 iyr:2011 hcl:#623a2f ecl:amb byr:1955
+hgt:190cm
+pid:244918527
+
+iyr:2013 hcl:#ceb3a1 eyr:2029 hgt:164cm
+ecl:oth
+byr:1928 pid:337615663
+
+hcl:#ceb3a1 pid:#ae7eea byr:2027
+cid:254
+hgt:125
+iyr:1940
+ecl:zzz
+
+pid:033663619 iyr:2012 byr:1989 eyr:2030 ecl:hzl
+hcl:#b6652a hgt:154cm
+
+hgt:175cm byr:1929 pid:100788192
+ecl:#92b14c
+iyr:1940 hcl:#ceb3a1 eyr:2033
+
+eyr:2029
+pid:357835141 ecl:oth iyr:2019 hcl:#866857 hgt:154cm byr:1954
+
+pid:895992818 byr:1965 iyr:2017 hcl:#efcc98 ecl:amb hgt:153cm eyr:2025
+
+byr:1928 ecl:amb hgt:168cm pid:346938111 eyr:2025 iyr:2014
+hcl:#cfa07d
+
+hcl:#b6652a pid:825661608 eyr:2020 iyr:2019 byr:1974
+hgt:180cm ecl:amb
+
+byr:1970 hgt:159cm hcl:#733820 pid:101838832 iyr:2015 eyr:2027 ecl:blu
+
+byr:1941 ecl:amb
+eyr:2024 pid:015890498
+hgt:175cm
+iyr:2018 hcl:#cfa07d
+
+hgt:67in
+pid:404983369 eyr:2023 iyr:2018 byr:1974 hcl:#602927
+ecl:blu
+
+byr:1957
+hcl:#fcc940 pid:615831236
+iyr:2018 eyr:2020 ecl:brn hgt:181cm cid:218
+
+hcl:#fffffd ecl:grn pid:271614109
+eyr:2028 hgt:184cm byr:1974 iyr:2015
+
+ecl:#e45ee0 pid:151cm cid:127 iyr:2014 byr:2022 hcl:973bc1 eyr:2033 hgt:181in
+
+hcl:#6b5442 pid:502739402 eyr:2020 byr:1926 ecl:brn
+iyr:2010
+
+ecl:xry hgt:169cm byr:2023
+iyr:1973 pid:4137668
+eyr:2037 hcl:z
+
+ecl:#3a8c46 hcl:43730a pid:57210146 eyr:2031 cid:117 iyr:2013 byr:2010
+
+hcl:#341e13 cid:237 hgt:150cm iyr:2016 byr:1967 ecl:blu
+pid:674080319 eyr:2024
+
+iyr:2011 hcl:#866857 pid:111247018
+byr:1920 hgt:192in ecl:#8bf268 eyr:2021
+
+iyr:2022 hcl:z ecl:gry
+hgt:159cm
+pid:#88e8df
+byr:2026 eyr:2032 cid:221
+
+hgt:156cm eyr:2026
+ecl:blu
+hcl:#192dea cid:280 pid:788808021 byr:1980
+iyr:2013
+
+hgt:156in
+byr:2024 hcl:4e4dd6
+eyr:2030
+iyr:2028 pid:35683378
+ecl:#3a9fba
+
+pid:081236370 cid:150 hcl:d15b43 byr:2029 hgt:118 iyr:2026 eyr:2038
+ecl:grt
+
+eyr:2034 pid:186cm
+ecl:utc cid:300 iyr:2009 byr:2018 hcl:163913 hgt:74cm
+
+ecl:hzl
+pid:249858519 byr:1936 hgt:182cm
+cid:343 iyr:2013 eyr:2030 hcl:#7d3b0c
+
+cid:168
+ecl:hzl
+hgt:174cm iyr:2020
+pid:446135799 hcl:#888785
+eyr:2024 byr:1998
+
+pid:545342162
+hcl:#5cd3bd cid:126
+eyr:2024
+iyr:2012 ecl:grn
+
+pid:104835585
+byr:1989 hcl:#733820 ecl:oth eyr:2024 iyr:2017
+hgt:180cm
+
+hgt:184cm byr:2001 pid:199216567 ecl:gry
+eyr:2022
+cid:185 hcl:#7d3b0c
+iyr:2019
+
+byr:1996 eyr:2022 pid:503963080 ecl:grn iyr:2010 hcl:#fffffd
+
+eyr:2030 iyr:2017
+pid:472300557 hcl:#a97842
+ecl:grn hgt:190cm
+byr:1994
+
+ecl:#2a8a59
+eyr:2027
+iyr:2015 byr:2021 hgt:158cm pid:365979521 hcl:z cid:242
+
+ecl:gry
+iyr:2020 hcl:#866857
+pid:363851353 cid:319 hgt:154cm eyr:2027
+byr:1953
+
+ecl:grn hgt:165cm eyr:2026
+pid:443722683 hcl:#341e13
+iyr:2018 byr:1923
+
+byr:1920 ecl:blu
+cid:193 hgt:153cm hcl:#341e13 iyr:2010 pid:934896568
+eyr:2021
+
+eyr:2025
+pid:524699651 cid:92
+hcl:#602927 byr:1999
+iyr:2011 ecl:brn hgt:164cm
+
+eyr:2030 pid:739947771 iyr:2018
+byr:1990
+hgt:185cm hcl:#602927 ecl:gry
+
+byr:1967 ecl:amb iyr:2020 hcl:#341e13
+hgt:165cm
+pid:681478012 eyr:2028
+
+pid:807715479 ecl:blu byr:1955 eyr:1972 iyr:2018 hcl:#a97842 hgt:151
+
+pid:635008585 cid:97
+hgt:186cm hcl:#b6652a iyr:2015 eyr:2020 ecl:gry byr:1959
+
+iyr:2017
+cid:155 byr:1999 pid:550276277
+hcl:#18171d
+eyr:2020 hgt:164cm ecl:amb
+
+byr:1977 hcl:#6b5442 ecl:grn iyr:2012 hgt:156cm
+eyr:2028 pid:125635376
+
+hgt:65in pid:042700658 byr:1962 iyr:2020
+hcl:#888785 eyr:2021 ecl:gry
+
+ecl:blu iyr:2017 hcl:#efcc98 pid:447451869 hgt:176cm
+byr:1958
+eyr:2024
+
+ecl:amb hgt:155cm eyr:2022 hcl:#efcc98
+pid:614496034 byr:1957
+iyr:2016
+
+cid:99
+eyr:2020
+ecl:amb iyr:2017
+hgt:163cm pid:128207503 byr:1977
+hcl:#866857
+
+ecl:amb cid:342 eyr:2026 hgt:172cm pid:317675262
+byr:1942 hcl:#a97842 iyr:2010
+
+ecl:grn pid:077163993
+hgt:187cm hcl:#341e13 iyr:2012 byr:1934 eyr:2024
+
+pid:423538706 hgt:156cm
+ecl:oth hcl:#341e13 iyr:2016 eyr:2028
+
+iyr:2030 ecl:#faff64
+byr:2012
+pid:734434105 hgt:164in hcl:z eyr:2023
+
+hgt:150in iyr:2016 pid:173cm hcl:db675a cid:219 eyr:2032 byr:1958
+ecl:xry
+
+pid:087437383
+eyr:2025 hgt:178cm ecl:gry byr:1954
+cid:227 hcl:#fffffd
+iyr:2018
+
+pid:152cm
+iyr:2030 eyr:2030
+byr:2010 hcl:z
+hgt:155cm
+ecl:amb
+
+byr:1934
+hcl:#341e13 hgt:167cm
+pid:#7356dd ecl:amb
+iyr:2011
+eyr:2030
+cid:123
+
+eyr:2027
+byr:2005
+hgt:173cm cid:174 hcl:#ceb3a1 iyr:2018 ecl:amb pid:179cm
+
+iyr:2019 ecl:grn eyr:2023
+hgt:162cm
+pid:649681621 hcl:#4ee6d2 byr:1955
+
+hgt:165cm byr:1929 ecl:blu pid:839016251 iyr:2017 hcl:#c0946f
+eyr:2020
+
+eyr:2020
+iyr:2017 hcl:#c7ed42 ecl:blu byr:1928
+hgt:74in pid:112604496
+
+eyr:2026 hgt:184 cid:113
+byr:1933
+pid:952646285
+iyr:2019 hcl:#fffffd ecl:gry
+
+pid:455008820 byr:1982 eyr:2030 ecl:gry iyr:2020 cid:103 hcl:#733820 hgt:184cm
+
+hcl:#733820 iyr:2020 hgt:182cm ecl:grn
+cid:226 pid:081011361 eyr:2022 byr:1995
+
+iyr:1999
+hcl:#18171d pid:9252198900
+ecl:amb byr:1999 hgt:175cm eyr:2021
+
+iyr:2020 hgt:165cm
+ecl:blu
+eyr:2023 pid:760213482
+byr:1968
+hcl:#c0946f
+
+pid:242381670 ecl:amb
+hgt:172cm byr:1980 eyr:2020 iyr:2014 hcl:#866857
+
+byr:2021 pid:#a94a22 hcl:#cfa07d iyr:1969 eyr:2030 ecl:zzz
+hgt:76cm
+
+ecl:oth cid:168
+byr:1954 pid:079481919 eyr:2025 hcl:#c0946f hgt:172cm
+
+hgt:171cm
+eyr:2030
+byr:1969 cid:170
+pid:164128658 ecl:amb
+hcl:#c2265e iyr:2019
+
+byr:1983
+cid:163
+eyr:2020 pid:232659795 iyr:2013 hcl:#888785 hgt:162cm
+ecl:blu
+
+ecl:gry hcl:#7d3b0c
+pid:001171231 eyr:2020
+byr:1935 hgt:160cm
+iyr:2011
+
+iyr:2012 hcl:#a97842
+eyr:2029 pid:809880438 hgt:164cm cid:83 byr:1961 ecl:hzl
+
+cid:288 eyr:2027
+hgt:181cm byr:1955
+iyr:2020
+ecl:oth pid:754135833 hcl:#c0946f
+
+iyr:2012 pid:053980893
+cid:54 byr:1961 ecl:gry hcl:#602927 eyr:2020 hgt:167cm
+
+iyr:2013
+eyr:2025
+hgt:176cm pid:169006156 cid:270 ecl:oth byr:2001
+
+cid:244 pid:914067457
+iyr:2017 byr:1926 hcl:#733820 ecl:brn hgt:187cm
+eyr:2030
+
+ecl:oth byr:1942
+hgt:176cm iyr:2020 eyr:2027
+hcl:#efcc98
+pid:688816242
+
+hgt:177cm hcl:#efcc98 eyr:2030 pid:888703414
+iyr:2010 byr:1973 ecl:gry
+
+cid:257 eyr:2030
+ecl:brn
+pid:359774824
+byr:1988 hcl:#6b5442 iyr:2013 hgt:187cm
+
+iyr:2011 hgt:173cm cid:290 byr:2000 ecl:gry
+hcl:#7d3b0c
+pid:743371399 eyr:2029
+
+cid:162
+eyr:1920 byr:2010 pid:#69d6ba hgt:74 hcl:z ecl:#d256f3 iyr:1933
+
+pid:435518624 byr:1938 eyr:2027 iyr:2016 hcl:#18171d
+hgt:161cm
+ecl:gry
+
+ecl:gry eyr:2027 hcl:#7d3b0c hgt:170cm
+pid:928345976 iyr:2020
+
+hcl:#5f4023 ecl:blu
+pid:024527693
+eyr:1932 iyr:2023 hgt:154cm byr:1948
+
+cid:284 iyr:2011 byr:1920 eyr:2024 ecl:blu hgt:153cm
+hcl:#602927 pid:005741906
+
+iyr:2029 hgt:108 byr:2029 hcl:c8b25d
+pid:522512400 eyr:2038 ecl:zzz cid:163
+
+pid:371295649
+eyr:2022 ecl:hzl
+iyr:2019 hgt:153cm byr:1961
+hcl:z
+
+eyr:2027 iyr:2020 pid:619653661 byr:1968 hcl:#b6652a cid:62 ecl:hzl
+hgt:186cm
+
+iyr:1931
+pid:565552342 ecl:#af97bb hcl:c92cd6 eyr:1931 byr:2025 hgt:184in
+
+hgt:187cm
+ecl:grn
+byr:1954 cid:145
+iyr:2016
+hcl:#efcc98 eyr:2030 pid:202254357
+
+cid:177
+iyr:2013 byr:1926 hcl:#efcc98
+pid:298693475 hgt:181cm eyr:2023 ecl:dne
+
+byr:2014
+cid:255
+iyr:1951 hgt:72in
+hcl:#efcc98 eyr:2039 pid:135688013
+ecl:grn
+
+byr:2019 eyr:1971 pid:#a95cb4
+hcl:#ceb3a1 ecl:#6f919c
+hgt:193cm iyr:2012
+
+pid:497726268
+ecl:grn
+eyr:2025 hcl:#efcc98 iyr:2019 hgt:170cm byr:1970
+
+byr:1939 hcl:#18171d cid:250
+iyr:2011 ecl:blu pid:216607711
+hgt:158cm eyr:2029
+
+byr:1937
+eyr:1931
+hcl:#5ee898
+pid:#876b1a hgt:190cm
+cid:277 ecl:#5f0f80 iyr:2013
+
+ecl:oth hgt:191cm eyr:2025 byr:1978 pid:271136754 hcl:#888785
+iyr:2012
+
+hcl:#6b5442
+iyr:2015 byr:1958 pid:510020331 hgt:158cm eyr:2024 ecl:blu
+
+byr:1998 cid:142 eyr:2026 iyr:2015 hcl:#733820
+pid:671943334 hgt:186cm ecl:oth
+
+eyr:2025 ecl:brn hcl:#7d3b0c pid:000803215
+byr:1947
+iyr:2017 hgt:168cm cid:230
+
+pid:612432109 hgt:186cm byr:1963 ecl:hzl iyr:2019 eyr:2027
+hcl:#efcc98
+cid:148
+
+hcl:#c0946f pid:846986027 eyr:2025 byr:1941
+cid:154 hgt:158cm iyr:2012
+ecl:brn
+
+ecl:gry hgt:186cm
+iyr:2015 hcl:#602927 byr:1923 eyr:2023
+pid:48544569
+
+pid:857428120 hgt:158cm hcl:#e4a267 iyr:2014 eyr:2020 byr:1975 ecl:blu
+
+ecl:blu pid:559783197 byr:1935 cid:119 iyr:2017 hgt:157cm hcl:#6b5442 eyr:2020
+
+ecl:oth pid:724332293 hcl:#602927
+cid:77 iyr:2019
+byr:2001 hgt:192cm eyr:2024
+
+ecl:hzl eyr:2031
+hcl:#efcc98 byr:2011 cid:280 iyr:2017
+pid:377875085
+hgt:172cm
+
+byr:1947 hgt:174cm ecl:amb iyr:2018 cid:94 hcl:#a97842 eyr:2026 pid:286225332
+
+hgt:85 ecl:xry eyr:2033 iyr:1952 pid:92902290
+hcl:a6f86d
+byr:2013
+
+byr:1935 hcl:#c0946f pid:368741489 ecl:blu
+eyr:2020 hgt:164cm
+iyr:2018
+cid:196
+
+pid:718568707
+ecl:oth byr:2003 hcl:#a97842 iyr:2010 hgt:168cm eyr:2025 cid:261
+
+hcl:#6b5442
+pid:675429853
+hgt:62in ecl:grn iyr:2016
+eyr:2027 byr:1932
+
+byr:1978
+pid:080846464 hcl:#ceb3a1 ecl:gry iyr:2015 hgt:190cm eyr:2029
+
+pid:1756319674
+iyr:2010 byr:1998 hcl:#866857 cid:259
+eyr:2025 hgt:73in ecl:hzl
+
+eyr:2035
+hcl:z hgt:61cm
+pid:3267812127
+cid:230
+byr:2029 iyr:2028 ecl:lzr
+
+hgt:161cm ecl:hzl byr:1934 iyr:2011 eyr:2025 hcl:#cfa07d pid:354474868
+
+pid:727482965
+hcl:#623a2f iyr:2010 hgt:156cm eyr:2020 cid:68 ecl:grn byr:1950
+
+pid:040800697 hgt:186cm
+hcl:#341e13 iyr:2030 ecl:hzl
+byr:1937 eyr:2020
+
+iyr:2013 byr:1928 pid:752644096 eyr:2030 hgt:191cm ecl:hzl
+cid:93 hcl:#a97842
+
+pid:022267155 hcl:#cfa07d eyr:2026
+ecl:hzl
+hgt:187cm iyr:2014 cid:347
+
+hgt:73in
+eyr:2021 pid:054367702 ecl:amb hcl:#18171d byr:1965
+iyr:2020 cid:267
+
+eyr:2022
+cid:140 pid:189859171 byr:1984 iyr:2020 ecl:brn hgt:166cm hcl:#623a2f
+
+byr:1971 iyr:2015
+hgt:168cm
+eyr:2020 pid:650970816 hcl:#341e13
+ecl:grn
+cid:168
+
+hcl:#c0946f byr:1948 hgt:189cm
+pid:868785851
+cid:194 ecl:amb eyr:2024 iyr:2011
+
+eyr:2040
+byr:2030 hcl:afde59
+hgt:172cm pid:72468598 iyr:1990 cid:165 ecl:#896a8e
+
+iyr:2009 hcl:#6b5442
+eyr:2028
+cid:53 ecl:hzl
+hgt:165cm byr:1999 pid:844037301
+
+cid:281 eyr:2022
+iyr:2020 byr:1976 hgt:176cm hcl:#6b5442 ecl:amb pid:755280305
+
+hgt:154cm iyr:2013
+pid:059284139 byr:1992
+cid:215 ecl:blu eyr:2025 hcl:#b6652a
+
+ecl:grn
+cid:308
+hgt:187cm pid:009080324 eyr:2027
+iyr:2012 byr:1955
+
+pid:083241291 hcl:#7c1810 eyr:2030 iyr:2019 byr:1950 ecl:brn hgt:72in
+
+cid:148 byr:1953 hcl:#623a2f
+pid:076848285 hgt:175cm iyr:2017
+eyr:2022
+ecl:oth
+
+iyr:2020
+hgt:160cm
+eyr:2028 cid:312 ecl:brn hcl:#888785 pid:681067688 byr:1986
+
+iyr:1972 cid:170 eyr:2023
+pid:21811501 ecl:#17c6e8
+hgt:158in byr:2015 hcl:5b7956
+
+pid:720571739 cid:304 byr:1951 hgt:191cm
+eyr:2025 hcl:#341e13
+iyr:2011
+
+eyr:2020 ecl:blu hcl:#cfa07d pid:097863725
+hgt:150cm
+byr:1951
+cid:143 iyr:2013
+
+eyr:2027 iyr:2019 ecl:#a0eeca hcl:#c0946f pid:724783488 byr:1943 cid:282 hgt:124
+
+byr:2012
+iyr:2013 eyr:2036 hcl:z hgt:97
+pid:#677847 ecl:dne
+
+pid:341708492 hgt:190cm
+byr:1988 hcl:#888785
+ecl:hzl
+iyr:2015 eyr:2029
+
+iyr:2020 byr:1968
+ecl:gry
+eyr:2030 hcl:#1976b0
+cid:127 pid:701862616
+hgt:161cm
diff --git a/day4/summary.txt b/day4/summary.txt
new file mode 100644 (file)
index 0000000..795c8f8
--- /dev/null
@@ -0,0 +1,120 @@
+--- Day 4: Passport Processing ---
+You arrive at the airport only to realize that you grabbed your North Pole Credentials instead of your passport. While these documents are extremely similar, North Pole Credentials aren't issued by a country and therefore aren't actually valid documentation for travel in most of the world.
+
+It seems like you're not the only one having problems, though; a very long line has formed for the automatic passport scanners, and the delay could upset your travel itinerary.
+
+Due to some questionable network security, you realize you might be able to solve both of these problems at the same time.
+
+The automatic passport scanners are slow because they're having trouble detecting which passports have all required fields. The expected fields are as follows:
+
+byr (Birth Year)
+iyr (Issue Year)
+eyr (Expiration Year)
+hgt (Height)
+hcl (Hair Color)
+ecl (Eye Color)
+pid (Passport ID)
+cid (Country ID)
+Passport data is validated in batch files (your puzzle input). Each passport is represented as a sequence of key:value pairs separated by spaces or newlines. Passports are separated by blank lines.
+
+Here is an example batch file containing four passports:
+
+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
+The first passport is valid - all eight fields are present. The second passport is invalid - it is missing hgt (the Height field).
+
+The third passport is interesting; the only missing field is cid, so it looks like data from North Pole Credentials, not a passport at all! Surely, nobody would mind if you made the system temporarily ignore missing cid fields. Treat this "passport" as valid.
+
+The fourth passport is missing two fields, cid and byr. Missing cid is fine, but missing any other field is not, so this passport is invalid.
+
+According to the above rules, your improved system would report 2 valid passports.
+
+Count the number of valid passports - those that have all required fields. Treat cid as optional. In your batch file, how many passports are valid?
+
+Your puzzle answer was 254.
+
+--- 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?
+
+Your puzzle answer was 184.
+
+Both parts of this puzzle are complete! They provide two gold stars: **
+
+At this point, you should return to your Advent calendar and try another puzzle.
+
+If you still want to see it, you can get your puzzle input.
+
+You can also [Share] this puzzle.
diff --git a/day4/test.txt b/day4/test.txt
new file mode 100644 (file)
index 0000000..0ff208e
--- /dev/null
@@ -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