Files
aocpy/2020/d4.py
2024-08-29 06:10:05 -04:00

108 lines
2.7 KiB
Python

from lib import get_data
required = [
"byr",
"iyr",
"eyr",
"hgt",
"hcl",
"ecl",
"pid",
]
# hgt (Height) - a number followed by either cm or in:
#
# If cm, the number must be at least 150 and at most 193.
# If in, the number must be at least 59 and at most 76.
def part_1(data):
passwords = [""]
for line in data.splitlines():
if line.strip() == "":
passwords.append("")
else:
passwords[-1] = passwords[-1] + " " + line.strip()
valid = 0
for pw in passwords:
for r in required:
if r not in pw:
break
else:
valid += 1
print(valid)
kws = []
for pw in passwords:
d = {}
for word in pw.split():
key, value = word.split(":")
d[key] = value
kws.append(d)
valid = 0
for kw in kws:
for r in required:
if r not in kw:
break
match r:
case "hgt":
v = int(kw[r][:-2])
if kw[r].endswith("cm"):
if v < 150 or v > 193:
break
elif kw[r].endswith("in"):
if v < 59 or v > 76:
break
else:
break
case "byr":
v = int(kw[r])
if v < 1920 or v > 2002:
break
case "iyr":
v = int(kw[r])
if v < 2010 or v > 2020:
break
case "eyr":
v = int(kw[r])
if v < 2020 or v > 2030:
break
case "hcl":
v = kw[r]
if len(v) != 7 or not v.startswith("#"):
break
try:
int(v.replace("#", ""), 16)
except ValueError:
break
case "pid":
v = kw[r]
if len(v) != 9:
break
try:
int(v, 10)
except ValueError:
break
case "ecl":
v = kw[r]
if not v in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]:
break
case _:
assert False
else:
valid += 1
print(valid)
def main():
data = get_data(__file__)
part_1(data)
if __name__ == "__main__":
main()