aoc/04/04_refactored.py

33 lines
1.2 KiB
Python
Raw Normal View History

2020-12-05 04:29:28 +00:00
import re
def read_file():
passports = []
with open("input.txt","r") as f:
raw_passports = f.read().strip().split('\n\n')
for passport in raw_passports:
parts = re.split('\s', passport)
passport_dict = dict(part.split(':') for part in parts) # use dictionary comprehension
passports.append(passport_dict)
return passports
validators = {
'byr': lambda x: len(x) == 4 and 2002 >= int(x) >= 1920,
'iyr': lambda x: len(x) == 4 and 2020 >= int(x) >= 2010,
'eyr': lambda x: len(x) == 4 and 2030 >= int(x) >= 2020,
'hgt': lambda x: (x[-2:] == 'cm' and 150 <= int(x[:-2]) <= 193) or (x[-2:] == 'in' and 59 <= int(x[:-2]) <= 76),
'hcl': lambda x: re.match('^#[\da-f]{6}$', x) != None,
'ecl': lambda x: x in ['amb','blu','brn','gry','grn','hzl','oth'],
'pid': lambda x: len(x) == 9 and x.isdigit(),
}
def main():
part1 = part2 = 0
passports = read_file()
for passport in passports:
if all(key in passport for key in validators): # TIL all() checks for iterable conditions
part1 += 1
if all(validators[key](passport[key]) for key in validators): # apply validators as function
part2 += 1
print(f'{part1=} {part2=}')
if __name__ == "__main__":
main()