77 lines
1.9 KiB
Python
77 lines
1.9 KiB
Python
import re
|
|
|
|
|
|
def checkDate(min, max, val):
|
|
return min <= int(val) <= max and len(val) == 4
|
|
|
|
|
|
def checkHeight(height):
|
|
unit = height[-2:]
|
|
rv = False
|
|
if unit == "cm" or unit == "in":
|
|
num = height.strip(unit)
|
|
|
|
if unit == "cm" and 150 <= int(num) <= 193:
|
|
rv = True
|
|
elif unit == "in" and 59 <= int(num) <= 76:
|
|
rv = True
|
|
return rv
|
|
|
|
|
|
def checkHair(color):
|
|
return re.match(r'#[a-f0-9]{6}', color)
|
|
|
|
|
|
def checkAll():
|
|
rv = 0
|
|
for val in keys:
|
|
for j in range(0, len(keyval)):
|
|
if val == keyval[j][0]:
|
|
rv += 1
|
|
break
|
|
return rv == 7
|
|
|
|
|
|
if __name__ == '__main__':
|
|
with open("input.txt", "r") as f:
|
|
raw = f.read().split("\n\n")
|
|
|
|
keys = ['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid']
|
|
eclValids = ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth']
|
|
|
|
pp = []
|
|
|
|
for i in raw:
|
|
pp.append(i.replace("\n", " ").split(" "))
|
|
|
|
valid = 0
|
|
|
|
for passport in pp:
|
|
keyval = []
|
|
counter = 0
|
|
for i in passport:
|
|
keyval.append(i.split(":"))
|
|
|
|
if checkAll():
|
|
for i in keyval:
|
|
key = i[0]
|
|
val = i[1]
|
|
if key == "byr" and checkDate(1920, 2002, val):
|
|
counter += 1
|
|
elif key == "iyr" and checkDate(2010, 2020, val):
|
|
counter += 1
|
|
elif key == "eyr" and checkDate(2020, 2030, val):
|
|
counter += 1
|
|
elif key == "hgt" and checkHeight(val):
|
|
counter += 1
|
|
elif key == "hcl" and checkHair(val):
|
|
counter += 1
|
|
elif key == "ecl" and val in eclValids:
|
|
counter += 1
|
|
elif key == "pid" and len(val) == 9 and val.isdigit():
|
|
counter += 1
|
|
|
|
if counter == 7:
|
|
valid += 1
|
|
|
|
print(valid)
|