Skip to content

Instantly share code, notes, and snippets.

@rendyanthony
Last active December 21, 2020 10:29
Show Gist options
  • Save rendyanthony/a9a755a2db75801d33d65f0f847ffac3 to your computer and use it in GitHub Desktop.
Save rendyanthony/a9a755a2db75801d33d65f0f847ffac3 to your computer and use it in GitHub Desktop.
Advent of Code 2020 Day 21
from functools import reduce
import re
def get_allergens(input):
ingredient_list = []
allergen_map = {}
for line in input:
m = re.match("^([\w\s]+) \(contains ([\w\s,]+)\)$", line).groups()
ingredients = m[0].split(" ")
allergens = m[1].split(", ")
for allergen in allergens:
if allergen not in allergen_map:
allergen_map[allergen] = set(ingredients)
else:
allergen_map[allergen] &= set(ingredients)
ingredient_list.extend(ingredients)
safe_ingredients = set(ingredient_list) - reduce(lambda a, b: a.union(b), allergen_map.values())
result_p1 = sum([ingredient_list.count(i) for i in safe_ingredients])
unique_allergen_map = {}
while max([len(v) for v in allergen_map.values()]) > 0:
for k, v in allergen_map.items():
if len(v) == 1:
unique_allergen_map[k] = v.pop()
for k in allergen_map:
allergen_map[k] -= set(unique_allergen_map.values())
result_p2 = ','.join([v for k, v in
sorted([(k, v) for k, v in
unique_allergen_map.items()])])
return result_p1, result_p2
with open("input_21") as fp:
print(get_allergens(fp))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment