feat(users/Profpatsch/advent-of-code): 2020 day 04
Change-Id: I422e43f33737ef4d8e250634fa68926ae340206a Reviewed-on: https://cl.tvl.fyi/c/depot/+/2580 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
4effd421cd
commit
851e32cfe7
1 changed files with 104 additions and 0 deletions
104
users/Profpatsch/advent-of-code/2020/04/main.py
Normal file
104
users/Profpatsch/advent-of-code/2020/04/main.py
Normal file
|
@ -0,0 +1,104 @@
|
|||
import sys
|
||||
import itertools
|
||||
import re
|
||||
import pprint
|
||||
|
||||
def get_entry(fd):
|
||||
def to_dict(keyval):
|
||||
res = {}
|
||||
for (k, v) in keyval:
|
||||
assert k not in res
|
||||
res[k] = v
|
||||
return res
|
||||
|
||||
res = []
|
||||
for line in fd:
|
||||
if line == "\n":
|
||||
yield to_dict(res)
|
||||
res = []
|
||||
else:
|
||||
line = line.rstrip()
|
||||
items = line.split(" ")
|
||||
for i in items:
|
||||
res.append(i.split(":", maxsplit=2))
|
||||
|
||||
def val_hgt(hgt):
|
||||
m = re.fullmatch(r'([0-9]+)(cm|in)', hgt)
|
||||
if m:
|
||||
(i, what) = m.group(1,2)
|
||||
i = int(i)
|
||||
if what == "cm":
|
||||
return i >= 150 and i <= 193
|
||||
elif what == "in":
|
||||
return i >= 59 and i <= 76
|
||||
else:
|
||||
return False
|
||||
|
||||
required_fields = [
|
||||
{ "name": "byr",
|
||||
"check": lambda s: int(s) >= 1920 and int(s) <= 2002
|
||||
},
|
||||
{ "name": "iyr",
|
||||
"check": lambda s: int(s) >= 2010 and int(s) <= 2020
|
||||
},
|
||||
{ "name": "eyr",
|
||||
"check": lambda s: int(s) >= 2020 and int(s) <= 2030,
|
||||
},
|
||||
{ "name": "hgt",
|
||||
"check": lambda s: val_hgt(s)
|
||||
},
|
||||
{ "name": "hcl",
|
||||
"check": lambda s: re.fullmatch(r'#[0-9a-f]{6}', s)
|
||||
},
|
||||
{ "name": "ecl",
|
||||
"check": lambda s: re.fullmatch(r'amb|blu|brn|gry|grn|hzl|oth', s)
|
||||
},
|
||||
{ "name": "pid",
|
||||
"check": lambda s: re.fullmatch(r'[0-9]{9}', s)
|
||||
},
|
||||
# we should treat it as not required
|
||||
# "cid"
|
||||
]
|
||||
|
||||
required_dict = {}
|
||||
for f in required_fields:
|
||||
required_dict[f["name"]] = f
|
||||
|
||||
def validate(keyval):
|
||||
if keyval[0] not in required_dict:
|
||||
return { "ok": keyval }
|
||||
if required_dict[keyval[0]]["check"](keyval[1]):
|
||||
return { "ok": keyval }
|
||||
else:
|
||||
return { "validation": keyval }
|
||||
|
||||
def all_fields(entry):
|
||||
missing = []
|
||||
for r in required_dict:
|
||||
if r not in e:
|
||||
missing.append(r)
|
||||
if missing == []:
|
||||
return { "ok": entry }
|
||||
else:
|
||||
return { "missing": missing }
|
||||
|
||||
count=0
|
||||
for e in get_entry(sys.stdin):
|
||||
a = all_fields(e)
|
||||
if a.get("ok", False):
|
||||
res = {}
|
||||
bad = False
|
||||
for keyval in e.items():
|
||||
r = validate(keyval)
|
||||
if r.get("validation", False):
|
||||
bad = True
|
||||
res[keyval[0]] = r
|
||||
if bad:
|
||||
pprint.pprint({ "validation": res })
|
||||
else:
|
||||
pprint.pprint({ "ok": e })
|
||||
count = count+1
|
||||
else:
|
||||
pprint.pprint(a)
|
||||
|
||||
print(count)
|
Loading…
Reference in a new issue