2015-12-16 - Aunt Sue
(original .ipynb)
Puzzle input is a set of properties that we know about ~500 aunties called Sue. Part one involves taking a set of readings and matching them against a given sue. Part two involves taking these readings and matching them in a slightly different way to find the correct Sue.
from collections import defaultdict puzzle_input_str = open("./puzzle_input/day16.txt").read() def parse_sue(line): details = dict() tokens = line.split(" ") i = 2 while i < len(tokens): details[tokens[i][:-1]] = int(tokens[i+1].rstrip(",")) i += 2 return int(tokens[1][:-1]), details readings = { "children": 3, "cats": 7, "samoyeds": 2, "pomeranians": 3, "akitas": 0, "vizslas": 0, "goldfish": 5, "trees": 3, "cars": 2, "perfumes": 1 } def approximate_match(sue): for prop in sue: if sue[prop] != readings[prop]: return False return True def part_one(input_str, match_func=approximate_match): for line in input_str.split("\n"): i, sue = parse_sue(line) if match_func(sue): return i print("part one:", part_one(puzzle_input_str))
part one: 103
default_match = lambda target, actual: target != actual decayed_match = lambda target, actual: target >= actual magnetoreluctant_match = lambda target, actual: target <= actual matches = { "cats": decayed_match, "trees": decayed_match, "pomeranians": magnetoreluctant_match, "goldfish": magnetoreluctant_match, "children": default_match, "samoyeds": default_match, "akitas": default_match, "vizslas": default_match, "cars": default_match, "perfumes": default_match } def adjusted_match(sue): for prop in sue: comp = matches[prop] if comp(readings[prop], sue[prop]): return False return True def part_two(input_str): return part_one(input_str, adjusted_match) print("part two:", part_two(puzzle_input_str))
part two: 405