2015 day 16.
This commit is contained in:
		
							
								
								
									
										51
									
								
								src/holt59/aoc/2015/day16.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/holt59/aoc/2015/day16.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| 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}") | ||||
		Reference in New Issue
	
	Block a user