diff --git a/04/04.py b/04/04.py new file mode 100644 index 0000000..b4af412 --- /dev/null +++ b/04/04.py @@ -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) \ No newline at end of file