import re passports = [] with open('day4/input') as reader: cur = '' for line in reader.read().splitlines(): if line != '': if cur == '': cur += line else: cur += ' ' + line else: passports.append(cur) cur = '' if cur != '': passports.append(cur) def byr(s): return re.match('^\d{4}$', s) is not None and (1920 <= int(s) <= 2002) def iyr(s): return re.match('^\d{4}$', s) is not None and (2010 <= int(s) <= 2020) def eyr(s): return re.match('^\d{4}$', s) is not None and (2020 <= int(s) <= 2030) def hgt(s): return (re.match('^\d+cm$', s) is not None and (150 <= int(s[:-2]) <= 193)) \ or (re.match('^\d+in$', s) is not None and (59 <= int(s[:-2]) <= 76)) def hcl(s): return re.match('^#[0-9a-f]{6}$', s) is not None def ecl(s): return s in {'amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'} def pid(s): return re.match('^[0-9]{9}$', s) is not None verify = {'byr': byr, 'iyr': iyr, 'eyr': eyr, 'hgt': hgt, 'hcl': hcl, 'ecl': ecl, 'pid': pid, 'cid': lambda s: True } valid = set(verify.keys()) count_valids = 0 for p in passports: props = set() failed = False for prop in p.split(' '): key, value = prop.split(':') props.add(key) if not verify[key](value): failed = True break if failed: continue missing = valid.difference(props) if missing == set() or missing == {'cid'}: count_valids += 1 print(count_valids)