108 lines
2.7 KiB
Python
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()
|