import re lines = [] def load(): global lines file = open("input_test.txt") lines = file.readlines() def resetCheck(): return { 'byr': False, 'iyr': False, 'eyr': False, 'hgt': False, 'hcl': False, 'ecl': False, 'pid': False, 'cid': False } def valid(password): if not password['byr']: return False if not password['iyr']: return False if not password['eyr']: return False if not password['hgt']: return False if not password['hcl']: return False if not password['ecl']: return False if not password['pid']: return False return True def validate_field(field, value): if field == 'byr': return 1920 <= int(value) <= 2002 elif field == 'iyr': return 2010 <= int(value) <= 2020 elif field == 'eyr': return 2020 <= int(value) <= 2030 elif field == 'hgt': height = re.split('([0-9]+)([a-z]+)', value) if len(height) != 4: return False if height[2] == 'cm': return 150 <= int(height[1]) <= 193 elif height[2] == 'in': return 59 <= int(height[1]) <= 76 elif field == 'hcl': if re.match('#([0-9a-f]{6})', value): return True elif field == 'ecl': if value == "amb" or value == "blu" or value == "brn" or value == "gry" or value == "grn" or value == "hzl" or value == "oth": return True elif field == 'pid': if re.match('^[0-9]{9}$', value): return True else: return False return False def part1(): file = open("input.txt") count = 0 passport = resetCheck() for line in file: if line == "\n": if valid(passport): count += 1 passport = resetCheck() passport_line = line.split(" ") for field in passport_line: field = field.strip("\n").split(':')[0] passport[field] = True if valid(passport): count += 1 print("Part 1: %d valid" % count) def part2(): file = open("input.txt") count = 0 passport = resetCheck() for line in file: if line == "\n": if valid(passport): count += 1 passport = resetCheck() else: passport_line = line.strip().split(" ") for field in passport_line: field = field.split(':') passport[field[0]] = validate_field(field[0], field[1]) if valid(passport): count += 1 print("Part 2: %d valid" % count) if __name__ == "__main__": load() part1() part2()