43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
import fileinput
|
|
from pprint import pprint
|
|
|
|
# Parse the input
|
|
foods = []
|
|
all_allergens = set()
|
|
all_ingredients = set()
|
|
for line in fileinput.input():
|
|
line = line.strip().rstrip(")")
|
|
|
|
s = line.split(" (contains ")
|
|
ingredients = frozenset(s[0].split())
|
|
allergens = frozenset(s[1].split(", "))
|
|
all_allergens.update(allergens)
|
|
all_ingredients.update(ingredients)
|
|
foods.append((ingredients, allergens))
|
|
|
|
allergen_ingredients = {allergen: set(all_ingredients) for allergen in all_allergens}
|
|
|
|
for ingredients, allergens in foods:
|
|
for allergen in allergens:
|
|
allergen_ingredients[allergen] &= ingredients
|
|
|
|
visited_ingredients = set()
|
|
for allergen, ingredients in sorted(
|
|
allergen_ingredients.items(), key=lambda x: len(x[1])
|
|
):
|
|
ingredients -= visited_ingredients
|
|
visited_ingredients |= ingredients
|
|
|
|
safe_ingredients = set(all_ingredients)
|
|
for _, ingredients in allergen_ingredients.items():
|
|
safe_ingredients -= ingredients
|
|
|
|
part1 = 0
|
|
for ingredient in safe_ingredients:
|
|
part1 += sum((ingredient in ingredients) for ingredients, _ in foods)
|
|
print("part 1:", part1)
|
|
|
|
dangerous_ingredients = []
|
|
for allergen, ingredients in sorted(allergen_ingredients.items(), key=lambda x: x[0]):
|
|
dangerous_ingredients.extend(ingredients)
|
|
print("part 2:", ",".join(dangerous_ingredients))
|