56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import aoclib
|
|
|
|
DAY = 21
|
|
TEST_SOLUTION_PART1 = 5
|
|
TEST_SOLUTION_PART2 = "mxmxvkd,sqjhc,fvjkl"
|
|
|
|
|
|
def part1(test_mode=False, return_allergen_list=False):
|
|
my_input = aoclib.getInputAsArray(day=DAY, test=test_mode)
|
|
|
|
allergen_candidates = {}
|
|
all_ingredients = []
|
|
for line in my_input:
|
|
ingredient_s, allergen_s = line[:-1].split(" (contains ")
|
|
ingredient_list = ingredient_s.split(" ")
|
|
all_ingredients.extend(ingredient_list)
|
|
|
|
for allergen in allergen_s.split(", "):
|
|
if allergen not in allergen_candidates:
|
|
allergen_candidates[allergen] = ingredient_list
|
|
|
|
allergen_candidates[allergen] = list(set(allergen_candidates[allergen]) & set(ingredient_list))
|
|
|
|
ingredient_removed = set()
|
|
while 1:
|
|
repeat = False
|
|
for allergen, ingredient_list in allergen_candidates.items():
|
|
if len(ingredient_list) == 1 and ingredient_list[0] not in ingredient_removed:
|
|
for r_allergen in allergen_candidates:
|
|
if r_allergen != allergen and ingredient_list[0] in allergen_candidates[r_allergen]:
|
|
allergen_candidates[r_allergen].remove(ingredient_list[0])
|
|
ingredient_removed.add(ingredient_list[0])
|
|
elif len(ingredient_list) > 1:
|
|
repeat = True
|
|
|
|
if not repeat:
|
|
break
|
|
|
|
if return_allergen_list:
|
|
return allergen_candidates
|
|
|
|
for ingredient_list in allergen_candidates.values():
|
|
all_ingredients = list(filter(lambda a: a != ingredient_list[0], all_ingredients))
|
|
|
|
return len(all_ingredients)
|
|
|
|
|
|
def part2(test_mode=False):
|
|
allergen_dict = part1(test_mode, True)
|
|
|
|
ingredient_list = []
|
|
for allergen in sorted(allergen_dict):
|
|
ingredient_list.extend(allergen_dict[allergen])
|
|
|
|
return ",".join(ingredient_list)
|