day 4
This commit is contained in:
parent
a3d2b5140f
commit
a70f2daf7f
@ -23,6 +23,27 @@ def getInputAsArray(day, return_type=None, test=False):
|
|||||||
return input_array
|
return input_array
|
||||||
|
|
||||||
|
|
||||||
|
def getMultiLineInputAsArray(day, return_type=None, test=False):
|
||||||
|
"""
|
||||||
|
get input for day x as array, but all lines are concatenated,
|
||||||
|
except if split by an empty line
|
||||||
|
"""
|
||||||
|
lines = getInputAsArray(day=day, test=test)
|
||||||
|
|
||||||
|
return_array = []
|
||||||
|
input_line = ''
|
||||||
|
for line in lines:
|
||||||
|
if not line:
|
||||||
|
return_array.append(input_line)
|
||||||
|
input_line = ''
|
||||||
|
continue
|
||||||
|
|
||||||
|
input_line = (input_line + " " + line).strip()
|
||||||
|
|
||||||
|
return_array.append(input_line)
|
||||||
|
return return_array
|
||||||
|
|
||||||
|
|
||||||
def getInputAs2DArray(day, return_type=None, test=False):
|
def getInputAs2DArray(day, return_type=None, test=False):
|
||||||
"""
|
"""
|
||||||
get input for day x as 2d-array (a[line][pos])
|
get input for day x as 2d-array (a[line][pos])
|
||||||
|
|||||||
97
day04.py
Normal file
97
day04.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import aoclib
|
||||||
|
import re
|
||||||
|
|
||||||
|
DAY = 4
|
||||||
|
|
||||||
|
required_fields = ['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid'] # 'cid' possible, but ignored
|
||||||
|
re_color_match = re.compile(r'#[a-z0-9]{6}')
|
||||||
|
|
||||||
|
|
||||||
|
def getPassportData(passport_line):
|
||||||
|
data = {}
|
||||||
|
pairs = passport_line.split()
|
||||||
|
for pair in pairs:
|
||||||
|
key, value = pair.split(':')
|
||||||
|
data[key] = value
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def verifyPassportData(passport_data, verify_data=False):
|
||||||
|
for field in required_fields:
|
||||||
|
if field not in passport_data:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not verify_data:
|
||||||
|
return True
|
||||||
|
|
||||||
|
try:
|
||||||
|
birth_year = int(passport_data['byr'])
|
||||||
|
issue_year = int(passport_data['iyr'])
|
||||||
|
expire_year = int(passport_data['eyr'])
|
||||||
|
height = int(passport_data['hgt'][:-2])
|
||||||
|
int(passport_data['pid'])
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# BYR
|
||||||
|
if len(passport_data['byr']) != 4 or birth_year < 1920 or birth_year > 2002:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# IYR
|
||||||
|
if len(passport_data['iyr']) != 4 or issue_year < 2010 or issue_year > 2020:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# EYR
|
||||||
|
if len(passport_data['eyr']) != 4 or expire_year < 2020 or expire_year > 2030:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# HGT
|
||||||
|
if passport_data['hgt'][-2:] not in ['cm', 'in']:
|
||||||
|
return False
|
||||||
|
elif passport_data['hgt'].endswith('cm') and (height < 150 or height > 193):
|
||||||
|
return False
|
||||||
|
elif passport_data['hgt'].endswith('in') and (height < 59 or height > 76):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# HCL
|
||||||
|
if not re.match(re_color_match, passport_data['hcl']):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# ECL
|
||||||
|
if passport_data['ecl'] not in ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth']:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# PID
|
||||||
|
if len(passport_data['pid']) != 9:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def part1(test_mode=False):
|
||||||
|
valid = 0
|
||||||
|
for passport_line in aoclib.getMultiLineInputAsArray(day=4, test=test_mode):
|
||||||
|
passport_data = getPassportData(passport_line)
|
||||||
|
if verifyPassportData(passport_data):
|
||||||
|
valid = valid + 1
|
||||||
|
|
||||||
|
return valid
|
||||||
|
|
||||||
|
|
||||||
|
def part2(test_mode=False):
|
||||||
|
valid = 0
|
||||||
|
for passport_line in aoclib.getMultiLineInputAsArray(day=4, test=test_mode):
|
||||||
|
passport_data = getPassportData(passport_line)
|
||||||
|
if verifyPassportData(passport_data, True):
|
||||||
|
valid = valid + 1
|
||||||
|
|
||||||
|
return valid
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
assert part1(test_mode=True) == 10, "Part 1 TEST FAILED"
|
||||||
|
aoclib.printSolution(DAY, 1, part1())
|
||||||
|
assert part2(test_mode=True) == 6, "Part 2 TEST FAILED"
|
||||||
|
aoclib.printSolution(DAY, 2, part2())
|
||||||
40
inputs/4_test
Normal file
40
inputs/4_test
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
|
||||||
|
byr:1937 iyr:2017 cid:147 hgt:183cm
|
||||||
|
|
||||||
|
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
|
||||||
|
hcl:#cfa07d byr:1929
|
||||||
|
|
||||||
|
hcl:#ae17e1 iyr:2013
|
||||||
|
eyr:2024
|
||||||
|
ecl:brn pid:760753108 byr:1931
|
||||||
|
hgt:179cm
|
||||||
|
|
||||||
|
hcl:#cfa07d eyr:2025 pid:166559648
|
||||||
|
iyr:2011 ecl:brn hgt:59in
|
||||||
|
|
||||||
|
eyr:1972 cid:100
|
||||||
|
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
|
||||||
|
|
||||||
|
iyr:2019
|
||||||
|
hcl:#602927 eyr:1967 hgt:170cm
|
||||||
|
ecl:grn pid:012533040 byr:1946
|
||||||
|
|
||||||
|
hcl:dab227 iyr:2012
|
||||||
|
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
|
||||||
|
|
||||||
|
hgt:59cm ecl:zzz
|
||||||
|
eyr:2038 hcl:74454a iyr:2023
|
||||||
|
pid:3556412378 byr:2007
|
||||||
|
|
||||||
|
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
|
||||||
|
hcl:#623a2f
|
||||||
|
|
||||||
|
eyr:2029 ecl:blu cid:129 byr:1989
|
||||||
|
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
|
||||||
|
|
||||||
|
hcl:#888785
|
||||||
|
hgt:164cm byr:2001 iyr:2015 cid:88
|
||||||
|
pid:545766238 ecl:hzl
|
||||||
|
eyr:2022
|
||||||
|
|
||||||
|
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
|
||||||
Loading…
Reference in New Issue
Block a user