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

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

1 точки общо

6 успешни теста
1 неуспешни теста
Код

 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)

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

f1class RunewordsCalculator:f1class RunewordsCalculator:
2    def __init__(self, runewords):2    def __init__(self, runewords):
3        self.runewords = runewords3        self.runewords = runewords
4        self.added_runes = []4        self.added_runes = []
5        self.returned_runes = []5        self.returned_runes = []
66
7    def __iter__(self):7    def __iter__(self):
8        return self8        return self
99
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 StopIteration12            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 name19                    return name
20        return None20        return None
2121
22    def add_runes(self, runes):22    def add_runes(self, runes):
23        self.added_runes.extend(runes)23        self.added_runes.extend(runes)
2424
25    def __use_recipe(self, wanted_recipe):25    def __use_recipe(self, wanted_recipe):
n26        used_runes_indexes = []n26        used_runes_indices = []
27        recipe_index = 027        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]:
n30                used_runes_indexes.append(rune_index)n30                used_runes_indices.append(rune_index)
31                recipe_index +=131                recipe_index +=1
t32        return used_runes_indexest32        return used_runes_indices
3333
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
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

f1class RunewordsCalculator:f1class RunewordsCalculator:
2    def __init__(self, runewords):2    def __init__(self, runewords):
3        self.runewords = runewords3        self.runewords = runewords
4        self.added_runes = []4        self.added_runes = []
5        self.returned_runes = []5        self.returned_runes = []
66
7    def __iter__(self):7    def __iter__(self):
8        return self8        return self
99
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 StopIteration12            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 name19                    return name
20        return None20        return None
2121
22    def add_runes(self, runes):22    def add_runes(self, runes):
23        self.added_runes.extend(runes)23        self.added_runes.extend(runes)
2424
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 = 027        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 +=131                recipe_index +=1
32        return used_runes_indexes32        return used_runes_indexes
3333
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]
t37 t
38 
39calculator = RunewordsCalculator({
40    "Enigma": ("Ber", "Ith"),
41    "lala": ("Ber", "Ith", "Eld"),
42    "nana": ("Ber", "Ith", "Eld, Mnt")
43})
44 
45print(next(iter(calculator)))  # None
46calculator.add_runes(["Ber", "Ith", "Eld"])
47calculator.add_runes(["Ber", "Ith", "Eld"])
48print(next(iter(calculator)))  # Enigma
49print(next(iter(calculator)))  # lala
50print(next(iter(calculator)))  # nana
51#print(next(iter(calculator)))  # Хвърля StopIteration
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op