Предизвикателства > Runewords Calculator > Решения > Решението на Михаил Георгиев

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

1 точки общо

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

 1class RunewordsCalculator:
 2    def __init__(self, runewords):
 3        self.runewords = list(runewords.items())
 4        self.runes = []
 5        self.used = set()
 6
 7    def add_runes(self, runes):
 8        self.runes.extend(runes)
 9
10    def __iter__(self):
11        return self
12
13    def __next__(self):
14        if len(self.used) == len(self.runewords):
15            raise StopIteration
16
17        for name, recipe in self.runewords:
18            if name in self.used:
19                continue
20
21            if self._can_build(recipe):
22                self.used.add(name)
23                return name
24
25        return None
26
27    def _can_build(self, recipe):
28        i = 0
29        for rune in self.runes:
30            if rune == recipe[i]:
31                i += 1
32                if i == len(recipe):
33                    return True
34        return False

.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s

OK

Дискусия
История

f1class RunewordsCalculator:f1class RunewordsCalculator:
2    def __init__(self, runewords):2    def __init__(self, runewords):
3        self.runewords = list(runewords.items())3        self.runewords = list(runewords.items())
4        self.runes = []4        self.runes = []
5        self.used = set()5        self.used = set()
66
7    def add_runes(self, runes):7    def add_runes(self, runes):
8        self.runes.extend(runes)8        self.runes.extend(runes)
99
10    def __iter__(self):10    def __iter__(self):
11        return self11        return self
1212
13    def __next__(self):13    def __next__(self):
14        if len(self.used) == len(self.runewords):14        if len(self.used) == len(self.runewords):
15            raise StopIteration15            raise StopIteration
1616
17        for name, recipe in self.runewords:17        for name, recipe in self.runewords:
18            if name in self.used:18            if name in self.used:
19                continue19                continue
2020
21            if self._can_build(recipe):21            if self._can_build(recipe):
22                self.used.add(name)22                self.used.add(name)
23                return name23                return name
2424
25        return None25        return None
2626
27    def _can_build(self, recipe):27    def _can_build(self, recipe):
28        i = 028        i = 0
29        for rune in self.runes:29        for rune in self.runes:
30            if rune == recipe[i]:30            if rune == recipe[i]:
31                i += 131                i += 1
32                if i == len(recipe):32                if i == len(recipe):
33                    return True33                    return True
34        return False34        return False
3535
t36calculator = RunewordsCalculator({t
37    "Enigma": ("Ber", "Ith", "Eld")
38})
39 
40 
41 
42print(next(iter(calculator)))  # None
43calculator.add_runes(["Ber", "Ith", "Eld"])
44print(next(iter(calculator)))  # Enigma
45print(next(iter(calculator)))  # Хвърля StopIteration
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op