1class RunewordsCalculator:
2 def __init__(self, runewords):
3 self.runewords = runewords
4 self.added_runes = []
5 self.returned_runes = []
6
7 def __iter__(self):
8 return self
9
10 def __next__(self):
11 if len(self.runewords) == len(self.returned_runes):
12 raise StopIteration
13 for name, recipe in self.runewords.items():
14 if name not in self.returned_runes:
15 current_indices_in_recipe = self.__use_recipe(recipe)
16 if len(current_indices_in_recipe) == len(recipe):
17 self.returned_runes.append(name)
18 self.__remove_spent_runes(current_indices_in_recipe)
19 return name
20 return None
21
22 def add_runes(self, runes):
23 self.added_runes.extend(runes)
24
25 def __use_recipe(self, wanted_recipe):
26 used_runes_indices = []
27 recipe_index = 0
28 for rune_index, rune in enumerate(self.added_runes):
29 if recipe_index < len(wanted_recipe) and rune == wanted_recipe[recipe_index]:
30 used_runes_indices.append(rune_index)
31 recipe_index +=1
32 return used_runes_indices
33
34 def __remove_spent_runes(self, used_runes):
35 for rune_index in reversed(used_runes):
36 del self.added_runes[rune_index]
.....F.
======================================================================
FAIL: test_returns_runewords_in_runeword_order (test.TestRunewordsCalculator.test_returns_runewords_in_runeword_order)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 55, in test_returns_runewords_in_runeword_order
self.assertEqual(next(iterator), "First")
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: None != 'First'
----------------------------------------------------------------------
Ran 7 tests in 0.001s
FAILED (failures=1)
| f | 1 | class RunewordsCalculator: | f | 1 | class RunewordsCalculator: |
| 2 | def __init__(self, runewords): | 2 | def __init__(self, runewords): | ||
| 3 | self.runewords = runewords | 3 | self.runewords = runewords | ||
| 4 | self.added_runes = [] | 4 | self.added_runes = [] | ||
| 5 | self.returned_runes = [] | 5 | self.returned_runes = [] | ||
| 6 | 6 | ||||
| 7 | def __iter__(self): | 7 | def __iter__(self): | ||
| 8 | return self | 8 | return self | ||
| 9 | 9 | ||||
| 10 | def __next__(self): | 10 | def __next__(self): | ||
| 11 | if len(self.runewords) == len(self.returned_runes): | 11 | if len(self.runewords) == len(self.returned_runes): | ||
| 12 | raise StopIteration | 12 | raise StopIteration | ||
| 13 | for name, recipe in self.runewords.items(): | 13 | for name, recipe in self.runewords.items(): | ||
| 14 | if name not in self.returned_runes: | 14 | if name not in self.returned_runes: | ||
| 15 | current_indices_in_recipe = self.__use_recipe(recipe) | 15 | current_indices_in_recipe = self.__use_recipe(recipe) | ||
| 16 | if len(current_indices_in_recipe) == len(recipe): | 16 | if len(current_indices_in_recipe) == len(recipe): | ||
| 17 | self.returned_runes.append(name) | 17 | self.returned_runes.append(name) | ||
| 18 | self.__remove_spent_runes(current_indices_in_recipe) | 18 | self.__remove_spent_runes(current_indices_in_recipe) | ||
| 19 | return name | 19 | return name | ||
| 20 | return None | 20 | return None | ||
| 21 | 21 | ||||
| 22 | def add_runes(self, runes): | 22 | def add_runes(self, runes): | ||
| 23 | self.added_runes.extend(runes) | 23 | self.added_runes.extend(runes) | ||
| 24 | 24 | ||||
| 25 | def __use_recipe(self, wanted_recipe): | 25 | def __use_recipe(self, wanted_recipe): | ||
| n | 26 | used_runes_indexes = [] | n | 26 | used_runes_indices = [] |
| 27 | recipe_index = 0 | 27 | recipe_index = 0 | ||
| 28 | for rune_index, rune in enumerate(self.added_runes): | 28 | for rune_index, rune in enumerate(self.added_runes): | ||
| 29 | if recipe_index < len(wanted_recipe) and rune == wanted_recipe[recipe_index]: | 29 | if recipe_index < len(wanted_recipe) and rune == wanted_recipe[recipe_index]: | ||
| n | 30 | used_runes_indexes.append(rune_index) | n | 30 | used_runes_indices.append(rune_index) |
| 31 | recipe_index +=1 | 31 | recipe_index +=1 | ||
| t | 32 | return used_runes_indexes | t | 32 | return used_runes_indices |
| 33 | 33 | ||||
| 34 | def __remove_spent_runes(self, used_runes): | 34 | def __remove_spent_runes(self, used_runes): | ||
| 35 | for rune_index in reversed(used_runes): | 35 | for rune_index in reversed(used_runes): | ||
| 36 | del self.added_runes[rune_index] | 36 | del self.added_runes[rune_index] |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||
| f | 1 | class RunewordsCalculator: | f | 1 | class RunewordsCalculator: |
| 2 | def __init__(self, runewords): | 2 | def __init__(self, runewords): | ||
| 3 | self.runewords = runewords | 3 | self.runewords = runewords | ||
| 4 | self.added_runes = [] | 4 | self.added_runes = [] | ||
| 5 | self.returned_runes = [] | 5 | self.returned_runes = [] | ||
| 6 | 6 | ||||
| 7 | def __iter__(self): | 7 | def __iter__(self): | ||
| 8 | return self | 8 | return self | ||
| 9 | 9 | ||||
| 10 | def __next__(self): | 10 | def __next__(self): | ||
| 11 | if len(self.runewords) == len(self.returned_runes): | 11 | if len(self.runewords) == len(self.returned_runes): | ||
| 12 | raise StopIteration | 12 | raise StopIteration | ||
| 13 | for name, recipe in self.runewords.items(): | 13 | for name, recipe in self.runewords.items(): | ||
| 14 | if name not in self.returned_runes: | 14 | if name not in self.returned_runes: | ||
| 15 | current_indices_in_recipe = self.__use_recipe(recipe) | 15 | current_indices_in_recipe = self.__use_recipe(recipe) | ||
| 16 | if len(current_indices_in_recipe) == len(recipe): | 16 | if len(current_indices_in_recipe) == len(recipe): | ||
| 17 | self.returned_runes.append(name) | 17 | self.returned_runes.append(name) | ||
| 18 | self.__remove_spent_runes(current_indices_in_recipe) | 18 | self.__remove_spent_runes(current_indices_in_recipe) | ||
| 19 | return name | 19 | return name | ||
| 20 | return None | 20 | return None | ||
| 21 | 21 | ||||
| 22 | def add_runes(self, runes): | 22 | def add_runes(self, runes): | ||
| 23 | self.added_runes.extend(runes) | 23 | self.added_runes.extend(runes) | ||
| 24 | 24 | ||||
| 25 | def __use_recipe(self, wanted_recipe): | 25 | def __use_recipe(self, wanted_recipe): | ||
| 26 | used_runes_indexes = [] | 26 | used_runes_indexes = [] | ||
| 27 | recipe_index = 0 | 27 | recipe_index = 0 | ||
| 28 | for rune_index, rune in enumerate(self.added_runes): | 28 | for rune_index, rune in enumerate(self.added_runes): | ||
| 29 | if recipe_index < len(wanted_recipe) and rune == wanted_recipe[recipe_index]: | 29 | if recipe_index < len(wanted_recipe) and rune == wanted_recipe[recipe_index]: | ||
| 30 | used_runes_indexes.append(rune_index) | 30 | used_runes_indexes.append(rune_index) | ||
| 31 | recipe_index +=1 | 31 | recipe_index +=1 | ||
| 32 | return used_runes_indexes | 32 | return used_runes_indexes | ||
| 33 | 33 | ||||
| 34 | def __remove_spent_runes(self, used_runes): | 34 | def __remove_spent_runes(self, used_runes): | ||
| 35 | for rune_index in reversed(used_runes): | 35 | for rune_index in reversed(used_runes): | ||
| 36 | del self.added_runes[rune_index] | 36 | del self.added_runes[rune_index] | ||
| t | 37 | t | |||
| 38 | |||||
| 39 | calculator = RunewordsCalculator({ | ||||
| 40 | "Enigma": ("Ber", "Ith"), | ||||
| 41 | "lala": ("Ber", "Ith", "Eld"), | ||||
| 42 | "nana": ("Ber", "Ith", "Eld, Mnt") | ||||
| 43 | }) | ||||
| 44 | |||||
| 45 | print(next(iter(calculator))) # None | ||||
| 46 | calculator.add_runes(["Ber", "Ith", "Eld"]) | ||||
| 47 | calculator.add_runes(["Ber", "Ith", "Eld"]) | ||||
| 48 | print(next(iter(calculator))) # Enigma | ||||
| 49 | print(next(iter(calculator))) # lala | ||||
| 50 | print(next(iter(calculator))) # nana | ||||
| 51 | #print(next(iter(calculator))) # Хвърля StopIteration |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||