67 lines
1.5 KiB
Plaintext
67 lines
1.5 KiB
Plaintext
|
#!/usr/bin/python3
|
||
|
import re
|
||
|
|
||
|
def byr_valid(s):
|
||
|
try:
|
||
|
yr = int(s)
|
||
|
return 1920 <= yr <= 2002
|
||
|
except:
|
||
|
return False
|
||
|
|
||
|
def iyr_valid(s):
|
||
|
try:
|
||
|
yr = int(s)
|
||
|
return 2010 <= yr <= 2020
|
||
|
except:
|
||
|
return False
|
||
|
|
||
|
def eyr_valid(s):
|
||
|
try:
|
||
|
yr = int(s)
|
||
|
return 2020 <= yr <= 2030
|
||
|
except:
|
||
|
return False
|
||
|
|
||
|
def hgt_valid(s):
|
||
|
try:
|
||
|
m = re.fullmatch(r"(\d+)(cm|in)", s)
|
||
|
if m.group(2) == "cm":
|
||
|
return 150 <= int(m.group(1)) <= 193
|
||
|
elif m.group(2) == "in":
|
||
|
return 59 <= int(m.group(1)) <= 76
|
||
|
else:
|
||
|
return False
|
||
|
except:
|
||
|
return False
|
||
|
|
||
|
def hcl_valid(s):
|
||
|
return bool(re.fullmatch(r"#[0-9a-f]{6}", s))
|
||
|
|
||
|
def ecl_valid(s):
|
||
|
return s in ("amb", "blu", "brn", "gry", "grn", "hzl", "oth")
|
||
|
|
||
|
def pid_valid(s):
|
||
|
return bool(re.fullmatch(r"[0-9]{9}", s))
|
||
|
|
||
|
checks = {
|
||
|
"byr": byr_valid, "iyr": iyr_valid, "eyr": eyr_valid,
|
||
|
"hgt": hgt_valid, "hcl": hcl_valid, "ecl": ecl_valid,
|
||
|
"pid": pid_valid,}
|
||
|
|
||
|
valid_count = 0
|
||
|
with open("input") as fh:
|
||
|
all_data = fh.read()
|
||
|
passport_strings = all_data.split("\n\n")
|
||
|
for ps in passport_strings:
|
||
|
fields = ps.split()
|
||
|
passport = {}
|
||
|
for f in fields:
|
||
|
k, v = f.split(":")
|
||
|
passport[k] = v
|
||
|
is_valid = True
|
||
|
for f, c in checks.items():
|
||
|
is_valid = is_valid and f in passport and c(passport[f])
|
||
|
valid_count += is_valid
|
||
|
print(valid_count)
|
||
|
|