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)