1class Runeword:
2 def __init__(self, name: str, recipe: tuple[str, ...]):
3 self.name = name
4 self.recipe = recipe
5
6 def can_build_from(self, available_runes: list[str]) -> bool:
7 if not self.recipe:
8 return True
9
10 recipe_index = 0
11 for rune in available_runes:
12 if rune == self.recipe[recipe_index]:
13 recipe_index += 1
14 if recipe_index == len(self.recipe):
15 return True
16
17 return False
18
19class RunewordsCalculator:
20 def __init__(self, runewords: dict[str, tuple[str, ...]]):
21 self.runewords = [
22 Runeword(name, recipe)
23 for name, recipe in runewords.items()
24 ]
25 self.available_runes = []
26 self.returned_runewords = set()
27
28 def add_runes(self, runes: list[str]):
29 self.available_runes.extend(runes)
30
31 def __iter__(self):
32 return self
33
34 def __next__(self):
35 if len(self.returned_runewords) == len(self.runewords):
36 raise StopIteration
37
38 for runeword in self.runewords:
39 if runeword.name in self.returned_runewords:
40 continue
41
42 if runeword.can_build_from(self.available_runes):
43 self.returned_runewords.add(runeword.name)
44 return runeword.name
45
46 return None
47
.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s
OK