Day 4
This commit is contained in:
parent
2275a65df5
commit
0a91abc59b
5 changed files with 1255 additions and 0 deletions
1136
2020/4/data.txt
Normal file
1136
2020/4/data.txt
Normal file
File diff suppressed because it is too large
Load diff
13
2020/4/invalid.txt
Normal file
13
2020/4/invalid.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
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
|
81
2020/4/main.py
Normal file
81
2020/4/main.py
Normal file
|
@ -0,0 +1,81 @@
|
|||
import re
|
||||
|
||||
re_hgt = re.compile(r"(?P<no>\d+)(?P<type>cm|in)")
|
||||
re_hcl = re.compile(r"#[\da-f]{6}")
|
||||
re_pid = re.compile(r"^\d{9}$")
|
||||
|
||||
def parse(data):
|
||||
rec = {}
|
||||
for line in data.split("\n"):
|
||||
if not line:
|
||||
yield rec
|
||||
rec = {}
|
||||
continue
|
||||
|
||||
pairs = line.split(" ")
|
||||
for pair in pairs:
|
||||
k, v = pair.split(":", 1)
|
||||
rec[k] = v
|
||||
|
||||
|
||||
def load(filename):
|
||||
with open(filename, "r", encoding="utf-8") as f:
|
||||
s = f.read()
|
||||
return parse(s)
|
||||
|
||||
|
||||
def is_valid_1(rec):
|
||||
required_fields = set(("byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"))
|
||||
fields = set(rec.keys())
|
||||
return not (required_fields - fields)
|
||||
|
||||
|
||||
def is_valid_2(rec):
|
||||
if not is_valid_1(rec):
|
||||
return False
|
||||
|
||||
if not 1920 <= int(rec["byr"]) <= 2002:
|
||||
return False
|
||||
|
||||
if not 2010 <= int(rec["iyr"]) <= 2020:
|
||||
return False
|
||||
|
||||
if not 2020 <= int(rec["eyr"]) <= 2030:
|
||||
return False
|
||||
|
||||
m = re_hgt.match(rec["hgt"])
|
||||
if not m:
|
||||
return False
|
||||
|
||||
if m.group("type") == "cm":
|
||||
if not 150 <= int(m.group("no")) <= 193:
|
||||
return False
|
||||
elif m.group("type") == "in":
|
||||
if not 59 <= int(m.group("no")) <= 76:
|
||||
return False
|
||||
|
||||
m = re_hcl.match(rec["hcl"])
|
||||
if not m:
|
||||
return False
|
||||
|
||||
if rec["ecl"] not in ("amb", "blu", "brn", "gry", "grn", "hzl", "oth"):
|
||||
return False
|
||||
|
||||
if not re_pid.match(rec["pid"]):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = load("data.txt")
|
||||
n_valid_1 = n_valid_2 = 0
|
||||
for x in data:
|
||||
if is_valid_1(x):
|
||||
n_valid_1 += 1
|
||||
|
||||
if is_valid_2(x):
|
||||
n_valid_2 += 1
|
||||
|
||||
print(f"Task 1: There are {n_valid_1} valid passports.")
|
||||
print(f"Task 2: There are {n_valid_2} valid passports.")
|
13
2020/4/test.txt
Normal file
13
2020/4/test.txt
Normal file
|
@ -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
|
12
2020/4/valid.txt
Normal file
12
2020/4/valid.txt
Normal file
|
@ -0,0 +1,12 @@
|
|||
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
|
Loading…
Reference in a new issue