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
| f | 1 | class RunewordsCalculator: | f | 1 | class 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() | ||
| 6 | 6 | ||||
| 7 | def add_runes(self, runes): | 7 | def add_runes(self, runes): | ||
| 8 | self.runes.extend(runes) | 8 | self.runes.extend(runes) | ||
| 9 | 9 | ||||
| 10 | def __iter__(self): | 10 | def __iter__(self): | ||
| 11 | return self | 11 | return self | ||
| 12 | 12 | ||||
| 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 StopIteration | 15 | raise StopIteration | ||
| 16 | 16 | ||||
| 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 | continue | 19 | continue | ||
| 20 | 20 | ||||
| 21 | if self._can_build(recipe): | 21 | if self._can_build(recipe): | ||
| 22 | self.used.add(name) | 22 | self.used.add(name) | ||
| 23 | return name | 23 | return name | ||
| 24 | 24 | ||||
| 25 | return None | 25 | return None | ||
| 26 | 26 | ||||
| 27 | def _can_build(self, recipe): | 27 | def _can_build(self, recipe): | ||
| 28 | i = 0 | 28 | 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 += 1 | 31 | i += 1 | ||
| 32 | if i == len(recipe): | 32 | if i == len(recipe): | ||
| 33 | return True | 33 | return True | ||
| 34 | return False | 34 | return False | ||
| 35 | 35 | ||||
| t | 36 | calculator = RunewordsCalculator({ | t | ||
| 37 | "Enigma": ("Ber", "Ith", "Eld") | ||||
| 38 | }) | ||||
| 39 | |||||
| 40 | |||||
| 41 | |||||
| 42 | print(next(iter(calculator))) # None | ||||
| 43 | calculator.add_runes(["Ber", "Ith", "Eld"]) | ||||
| 44 | print(next(iter(calculator))) # Enigma | ||||
| 45 | print(next(iter(calculator))) # Хвърля StopIteration |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||