You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.7 KiB
Python
73 lines
1.7 KiB
Python
"""
|
|
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))))
|