aoc2020/day21.py
Stefan Harmuth 6291148c24 day21
2020-12-21 06:57:49 +01:00

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)