passports = [] with open("4.input") as f: passport = {} for line in f.readlines(): if line.strip() == "": passports.append(passport) passport = {} else: pairs = line.strip().split(" ") for pair in pairs: [key, value] = pair.strip().split(":") passport[key] = value passports.append(passport) def passport_valid(passport): required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] for key in required_fields: if key not in passport.keys(): return False return True def passport_valid_extended(passport): if not passport_valid(passport): return False byr = int(passport["byr"]) if byr not in range(1920, 2003): return False iyr = int(passport["iyr"]) if iyr not in range(2010, 2021): return False eyr = int(passport["eyr"]) if eyr not in range(2020, 2031): return False hgt = passport["hgt"] if "cm" in hgt: if int(hgt[0:-2]) not in range(150, 194): return False elif "in" in hgt: if int(hgt[0:-2]) not in range(59, 77): return False else: return False hcl = passport["hcl"] if hcl[0] != '#': return False if len(hcl) != 7: return False for c in hcl[1:6]: if c not in "0123456789abcdef": return False if passport["ecl"] not in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]: return False pid = passport["pid"] if len(pid) != 9: return False for c in pid: if c not in "0123456789": return False return True valid = filter(passport_valid, passports) print(sum(1 for _ in valid)) valid = filter(passport_valid_extended, passports) print(sum(1 for _ in valid))