This commit is contained in:
Søren Rasmussen 2020-12-04 10:15:02 +01:00
parent 2275a65df5
commit 0a91abc59b
5 changed files with 1255 additions and 0 deletions

1136
2020/4/data.txt Normal file

File diff suppressed because it is too large Load diff

13
2020/4/invalid.txt Normal file
View 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
View 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
View 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
View 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