This commit is contained in:
Ben Charlton 2020-12-04 09:25:41 +00:00
parent b5822a9a9d
commit b4774135a4

106
04/04.py Normal file
View file

@ -0,0 +1,106 @@
#!/usr/bin/python3
import sys
import re
def process1(passport):
if len(passport) == 8 or (len(passport) == 7 and 'cid' not in passport):
print ('valid', len(passport))
return 1
return 0
def check_match(passport, k, m):
if k in passport:
n = re.match(m, passport[k])
if n is not None:
return n.group(0)
else:
return None
else:
return None
def check_between(n, min, max):
if n is None:
return False
i = int(n)
if i < min:
return False
if i > max:
return False
return True
def process2(passport):
print(passport)
# byr (Birth Year) - four digits; at least 1920 and at most 2002.
v = check_match(passport, 'byr', r'^\d+$')
if not check_between(v, 1920,2020):
return 0
# iyr (Issue Year) - four digits; at least 2010 and at most 2020.
v = check_match(passport, 'iyr', r'^\d+$')
if not check_between(v, 2010,2020):
return 0
# eyr (Expiration Year) - four digits; at least 2020 and at most 2030.
v = check_match(passport, 'eyr', r'^\d+$')
if not check_between(v, 2020,2030):
return 0
# 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.
if 'hgt' in passport:
m = re.match(r'^(\d+)(cm|in)$', passport['hgt'])
if m is None:
return 0
vh = 0
if m.group(2) == 'cm':
vh = 1
if not check_between(m.group(1), 150,193):
return 0
if m.group(2) == 'in':
vh = 1
if not check_between(m.group(1), 59,76):
return 0
if vh == 0:
return 0
else:
return 0
# hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f.
v = check_match(passport, 'hcl', r'^#[0-9a-f]{6}$')
if v is None:
return 0
# ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth.
v = check_match(passport, 'ecl', r'^(amb|blu|brn|gry|grn|hzl|oth)$')
if v is None:
return 0
# pid (Passport ID) - a nine-digit number, including leading zeroes.
v = check_match(passport, 'pid', r'^\d{9}$')
if v is None:
return 0
# cid (Country ID) - ignored, missing or not.
return 1
validcount1 = 0
validcount2 = 0
passport = {}
for line in sys.stdin:
if line == "\n":
validcount1 = validcount1 + process1(passport)
validcount2 = validcount2 + process2(passport)
passport = {}
continue
items = line.rstrip().split(' ')
for item in items:
(tag, data) = item.split(':')
passport[tag] = data
validcount1 = validcount1 + process1(passport)
validcount2 = validcount2 + process2(passport)
print(1, validcount1)
print(2, validcount2)