Files
AoC-2020/day4/day4.py

124 lines
2.7 KiB
Python

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()