-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path21.py
40 lines (30 loc) · 1.11 KB
/
21.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import re
from itertools import chain
def parse_dish(line):
dish, allergens = re.match('(.+?) \(contains (.+?)\)', line).groups()
return dish.split(), allergens.split(', ')
def find_allergens(dishes):
allergens = dict()
tmp = dict()
for dish_ing, dish_allerg in dishes:
for a in dish_allerg:
tmp.setdefault(a, set(dish_ing)).intersection_update(dish_ing)
while tmp:
allergen, ingredient = next((a, ing) for a, ing in tmp.items() if len(ing) == 1)
allergens[next(iter(ingredient))] = allergen
del tmp[allergen]
for v in tmp.values():
v -= ingredient
return allergens
def star1():
dishes = [parse_dish(line.strip()) for line in open('input.txt')]
allergens = find_allergens(dishes)
print(sum(1 for ingridient in chain.from_iterable(d[0] for d in dishes) if ingridient not in allergens))
def star2():
dishes = [parse_dish(line.strip()) for line in open('input.txt')]
allergens = find_allergens(dishes)
print(','.join(sorted(allergens.keys(), key=allergens.get)))
print('Star 1:')
star1()
print('Star 2:')
star2()