""" Solution to 2020/04 """ import re passports = [] with open('input', 'r') as f: for passportRaw in f.read().strip().split('\n\n'): passport = {} for [key, value] in re.findall(r'([\w]{3}):(\S*)', passportRaw): passport[key] = value # print(passportRaw) # print(passport) # print() passports.append(passport) print('Passports:', len(passports)) required_fields = [ 'byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid' ] def validate_int(value, min, max): try: value = int(value) if value < min or value > max: return False return True except: return False def is_valid(passport): for field in required_fields: if field not in passport: return False if not validate_int(passport['byr'], 1920, 2002): return False if not validate_int(passport['iyr'], 2010, 2020): return False if not validate_int(passport['eyr'], 2020, 2030): return False hgt_val = passport['hgt'][:-2] hgt_type = passport['hgt'][-2:] if hgt_type == 'cm': if not validate_int(hgt_val, 150, 193): return False elif hgt_type == 'in': if not validate_int(hgt_val, 59, 76): return False else: return False if not re.match('#[0-9a-f]{6}', passport['hcl']): return False if not passport['ecl'] in ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth']: return False print(passport['pid']) if not len(passport['pid']) == 9 or not validate_int(passport['pid'], 0, 999999999): return False return True print('Count:') print(len(list(x for x in passports if is_valid(x))))