52 lines
1020 B
Python
52 lines
1020 B
Python
|
import operator as op
|
||
|
import re
|
||
|
import sys
|
||
|
from collections import defaultdict
|
||
|
from typing import Callable
|
||
|
|
||
|
MFCSAM: dict[str, int] = {
|
||
|
"children": 3,
|
||
|
"cats": 7,
|
||
|
"samoyeds": 2,
|
||
|
"pomeranians": 3,
|
||
|
"akitas": 0,
|
||
|
"vizslas": 0,
|
||
|
"goldfish": 5,
|
||
|
"trees": 3,
|
||
|
"cars": 2,
|
||
|
"perfumes": 1,
|
||
|
}
|
||
|
|
||
|
lines = sys.stdin.readlines()
|
||
|
|
||
|
aunts: list[dict[str, int]] = [
|
||
|
{
|
||
|
match[1]: int(match[2])
|
||
|
for match in re.findall(R"((?P<compound>[^:, ]+): (?P<quantity>\d+))", line)
|
||
|
}
|
||
|
for line in lines
|
||
|
]
|
||
|
|
||
|
|
||
|
def match(operators: dict[str, Callable[[int, int], bool]]) -> int:
|
||
|
return next(
|
||
|
i
|
||
|
for i, aunt in enumerate(aunts, start=1)
|
||
|
if all(operators[k](aunt[k], MFCSAM[k]) for k in aunt)
|
||
|
)
|
||
|
|
||
|
|
||
|
answer_1 = match(defaultdict(lambda: op.eq))
|
||
|
print(f"answer 1 is {answer_1}")
|
||
|
|
||
|
answer_2 = match(
|
||
|
defaultdict(
|
||
|
lambda: op.eq,
|
||
|
trees=op.gt,
|
||
|
cats=op.gt,
|
||
|
pomeranians=op.lt,
|
||
|
goldfish=op.lt,
|
||
|
)
|
||
|
)
|
||
|
print(f"answer 2 is {answer_2}")
|