Предизвикателства > Runewords Calculator > Решения > Решението на Нора Кирилова

Резултати
1 точки от тестове
0 точки от учител

1 точки общо

7 успешни теста
0 неуспешни теста
Код

 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

Дискусия
История
Това решение има само една версия.