python(day21): Day 21 woo
This commit is contained in:
parent
fe44ae5068
commit
cc5bbc7260
|
@ -0,0 +1,43 @@
|
||||||
|
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))
|
Loading…
Reference in New Issue