Roderic Day pirms 4 gadiem
vecāks
revīzija
03310a06ff
1 mainītis faili ar 54 papildinājumiem un 0 dzēšanām
  1. +54
    -0
      y2020/p21.py

+ 54
- 0
y2020/p21.py Parādīt failu

@@ -0,0 +1,54 @@
import sys


text = sys.stdin.read()
test = '''mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
trh fvjkl sbzzf mxmxvkd (contains dairy)
sqjhc fvjkl (contains soy)
sqjhc mxmxvkd sbzzf (contains fish)'''


contains = {}
for line in text.splitlines():
food, allergens = line[:-1].split(' (contains ')
food = frozenset(s.strip() for s in food.split(' '))
allergens = frozenset(s.strip() for s in allergens.split(','))
contains[food] = allergens

all_allergens = {a for b in contains.values() for a in b}
all_foods = {a for b in contains.keys() for a in b}

reverse = {}
for food in all_foods:
reverse[food] = set(all_allergens)

for food, allergens in contains.items():
for f2 in reverse:
if f2 not in food:
reverse[f2] -= allergens

clean = {k for k, v in reverse.items() if not v}
ans = 0
for v in contains.keys():
ans += len(v & clean)
print(ans)


final = {v: k - clean for k, v in contains.items()}


def recurse(ings, known=tuple()):
if not ings:
yield known
else:
key, = min(ings, key=lambda k: len(k))
for val in sorted(ings.pop(frozenset({key}))):
expa = known + ((key, val),)
lob = {k - {key}: v - {val} for k, v in ings.items()}
yield from recurse(lob, expa)


for out in recurse(dict(final)):
d = dict(out)
if all(({d[e] for e in k} <= set(v)) for k, v in final.items()):
print(','.join(v for _, v in sorted(out)))

Notiek ielāde…
Atcelt
Saglabāt