parent
95fc3cc4fc
commit
5f0328e302
@ -0,0 +1,171 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
from aoc import get_input |
||||
|
||||
import re |
||||
|
||||
inp = get_input(4) |
||||
|
||||
newPort = "\n\n" |
||||
|
||||
validPara = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid", "cid"] # NOTE excluade cid later |
||||
|
||||
|
||||
ports = inp.split(newPort) |
||||
|
||||
def getPorts(port): |
||||
port = port.replace("\n", " ") |
||||
|
||||
paras = port.split(" ") |
||||
out = [] |
||||
#print("####", paras) |
||||
|
||||
for p in paras: |
||||
#print("#",p) |
||||
if( p != "" ): |
||||
para = re.match("(\w+):", p).groups()[0] |
||||
out.append(para) |
||||
|
||||
return out |
||||
|
||||
def checkPorts(ports, valids, ignore:list = ["cid"]): |
||||
paras = [] |
||||
for p in ports: |
||||
paras.append(getPorts(p)) |
||||
|
||||
count = 0 |
||||
|
||||
for para in paras: |
||||
check = all(p in para for p in valids) |
||||
print(check, para, valids) |
||||
if(check): |
||||
count += 1 |
||||
|
||||
return count |
||||
|
||||
|
||||
|
||||
specialPara = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] |
||||
# pcheck = checkPorts(ports, specialPara) |
||||
|
||||
|
||||
# print(pcheck) |
||||
|
||||
def getPortsYes(port): |
||||
port = port.replace("\n", " ") |
||||
|
||||
paras = port.split(" ") |
||||
out = [] |
||||
|
||||
for p in paras: |
||||
if( p != "" ): |
||||
val = re.split(":", p)[1] |
||||
para = re.match("(\w+)\:", p).groups()[0] |
||||
out.append([para, val]) |
||||
|
||||
return out |
||||
|
||||
|
||||
eyecolors = "amb blu brn gry grn hzl oth".split(" ") |
||||
|
||||
def checkVal(par, val): |
||||
valid = True |
||||
if( par == "byr" ): |
||||
valid = int(val) <= 2002 and int(val) >= 1920 |
||||
print("byr", int(val), valid) |
||||
|
||||
elif( par == "iyr" ): |
||||
valid = int(val) <= 2020 and int(val) >= 2010 |
||||
print("iyr", int(val), valid) |
||||
|
||||
elif( par == "eyr" ): |
||||
valid = int(val) <= 2030 and int(val) >= 2020 |
||||
print("eyr", int(val), valid) |
||||
|
||||
elif( par == "hgt" ): |
||||
num, typ = re.match("(\d+)(\w+)", val).groups() |
||||
if( typ == "cm" ): |
||||
valid = int(num) <= 193 and int(num) >= 150 |
||||
print("hgt cm", int(num), valid) |
||||
elif( typ == "in" ): |
||||
valid = int(num) <= 76 and int(num) >= 59 |
||||
print("hgt in", int(num), valid) |
||||
else: |
||||
valid = False |
||||
|
||||
elif( par == "hcl" ): |
||||
try: |
||||
string = val.split("#")[1] |
||||
check1 = len(string) == 6 |
||||
validhex = re.search("^([a-fa-f0-9]{6})$", string) |
||||
print("hcl", val, len(string), check1, validhex) |
||||
if( not validhex ): |
||||
valid = False |
||||
except: |
||||
valid = False |
||||
|
||||
elif( par == "ecl" ): |
||||
valid = val in eyecolors |
||||
print( "ecl", val, eyecolors, valid ) |
||||
|
||||
elif( par == "pid" ): |
||||
try: |
||||
num = int(val) |
||||
check = len(val) == 9 |
||||
valid = check |
||||
print("pid", num, len(val), val, check) |
||||
except: |
||||
valid = False |
||||
elif( par == "cid" ): |
||||
valid = True |
||||
|
||||
else: |
||||
valid = False |
||||
|
||||
|
||||
|
||||
return valid |
||||
|
||||
def checkPortsVALID( ports, paras ): |
||||
count = 0 |
||||
|
||||
|
||||
for port in ports: |
||||
ps = getPortsYes(port) |
||||
parasPort = getPorts(port) |
||||
portsValid = True |
||||
portsValid2 = True |
||||
|
||||
#for para in ps2: |
||||
|
||||
check2 = all(p in parasPort for p in paras) |
||||
if( not check2 ): |
||||
print("FALSE:", parasPort, "####", paras ) |
||||
portsValid2 = False |
||||
|
||||
for p in ps: |
||||
if(p != ""): |
||||
param = p[0] |
||||
val = p[1] |
||||
#print("|<", param, val) |
||||
|
||||
check1 = checkVal(param, val) |
||||
|
||||
|
||||
#print(check2) |
||||
|
||||
if(check1 == False): |
||||
portsValid = False |
||||
|
||||
|
||||
if( portsValid == True and portsValid2 == True ): |
||||
count += 1 |
||||
|
||||
print("\nnewport") |
||||
|
||||
return count |
||||
|
||||
check1 = checkPorts(ports, specialPara) |
||||
pcheck2 = checkPortsVALID( ports, specialPara ) |
||||
|
||||
print("Part2:", check1, pcheck2) |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue