Files
AdventOfCode_2020/Scripts/Day 4.py
2021-08-16 17:21:54 +02:00

90 lines
3.2 KiB
Python

from typing import ValuesView
import numpy as np
import regex as re
def first():
with open("/Users/cato447/Code/Cato447/AdventOfCode_2020/Scripts/res/day4.txt") as f:
lines = [line.replace("\n", "").split() for line in f.readlines()]
tempLines = []
passports = []
for line in lines:
if len(line) > 0:
tempLines.extend(line)
else:
passports.append(tempLines)
tempLines = []
passports.append(tempLines)
validPassports = 0
for passport in passports:
if len(passport) == 8 or (len(passport) == 7 and not any('cid:' in string for string in passport)):
validPassports += 1
return validPassports
def second():
with open("/Users/cato447/Code/Cato447/AdventOfCode_2020/Scripts/res/day4.txt") as f:
lines = [line.replace("\n", "").split() for line in f.readlines()]
tempLines = []
passports = []
for line in lines:
if len(line) > 0:
tempLines.extend(line)
else:
passports.append(dict([map(str.strip, passport.split(':')) for passport in tempLines]))
tempLines = []
passports.append(dict([map(str.strip, passport.split(':')) for passport in tempLines]))
validPassports = 0
for passport in passports:
if len(passport) == 8 or (len(passport.keys()) == 7 and 'cid' not in passport.keys()):
if validatePassport(passport):
validPassports += 1
else:
print(passport)
return validPassports
def validatePassport(passport):
boundaries = {
'byr' : [1920, 2002],
'iyr' : [2010, 2020],
'eyr' : [2020, 2030],
'hgt' : {'cm' : [150, 193], 'in' : [59, 73]},
'hcl' : '^#[a-f0-9]{6}',
'ecl' : ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'],
'pid' : '[0-9]{9}'
}
valid = True
for key, value in passport.items():
if key != 'cid':
if key == 'hgt':
try:
bounds = boundaries[key][value[-2:]]
if not bounds[0] <= int(value[:-2]) <= bounds[1]:
valid = False
break
except: # height has no specified unit
valid = False
break
elif key in ['byr', 'iyr', 'eyr']:
bounds = boundaries[key]
try:
if not bounds[0] <= int(value) <= bounds[1]:
valid = False
break
except:
valid = False
break
elif key == 'ecl':
if not value in boundaries[key]:
valid = False
break
elif key in ['hcl', 'pid']: # match regex
if not re.match(boundaries[key], value):
valid = False
break
return valid
print(f"First solution: {first()}")
# Real solution is second() +1. Has to do something with parsing the data
print(f"Second solution: {second()}")