import re # Valid Passport if all fields on it def valid_passport(line): # Must contain "byr:", "pid:", "iyr:". "eyr:", "hgt:" "hcl:" und "ecl:" contains = ["byr:", "pid:", "iyr:", "eyr:", "hgt:", "hcl:", "ecl:"] return all(i in line for i in contains) # Bene's function for height def valid_height(height): match = re.compile(r"(\d+)(cm|in)").search(height) if match is None: return False num, unit = match.groups() if unit == 'cm': return 150 <= int(num) <= 193 if unit == 'in': return 59 <= int(num) <= 76 return False # Valid passport if fields also contain fitting values def valid_passport2(line): # Must contain "byr:", "pid:", "iyr:". "eyr:", "hgt:" "hcl:" und "ecl:" contains = ["byr:", "pid:", "iyr:", "eyr:", "hgt:", "hcl:", "ecl:"] if all(i in line for i in contains): groups = re.compile(r"(?P\w+):(?P\S+)") for (key, value) in groups.findall(line): if key == "byr": if not (len(value) == 4 and (1920 <= int(value) <= 2002)): return False elif key == "iyr": if not (len(value) == 4 and (2010 <= int(value) <= 2020)): return False elif key == "eyr": if not (len(value) == 4 and (2020 <= int(value) <= 2030)): return False elif key == "hgt": pattern1 = re.compile(r"(1[5-8][0-9]|19[0-3])cm") pattern2 = re.compile(r"(59|6[0-9]|7[0-6])in") if not valid_height(value): return False elif key == "hcl": pattern = re.compile(r"#([0-9]|[a-f]){6}") if not pattern.match(value): return False elif key == "ecl": if value not in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]: return False elif key == "pid": pattern = re.compile(r"\d{9}") if not (pattern.match(value) and len(value) == 9): return False else: if not key == "cid": return False return True return False with open(r"C:\Users\Maya\Desktop\Uni\WS_2021\AoC\input04") as f: lines = f.read() lines = lines.replace("\n\n", '\t').replace("\n", " ").split("\t") sum(valid_passport(p) for p in lines) # count for challenge 1 count = 0 for l in lines: if valid_passport(l): count += 1 print(count) # count for challenge 2 count2 = 0 for l in lines: if valid_passport2(l): count2 += 1 print(count2)