1from collections import OrderedDict
2
3class RunewordsCalculator:
4 def __init__(self, runewords):
5 self.runewords = OrderedDict(runewords)
6 self.used_runewords = set()
7 self.runes = []
8
9 def add_runes(self, runes):
10 self.runes.extend(runes)
11
12 def contains_recipe(self, recipe):
13 recipe_idx = 0
14 used_indices = []
15 for i, rune in enumerate(self.runes):
16 if recipe_idx < len(recipe) and rune == recipe[recipe_idx]:
17 used_indices.append(i)
18 recipe_idx += 1
19 if recipe_idx == len(recipe):
20 return used_indices
21 return None
22
23 def __iter__(self):
24 return self
25
26 def __next__(self):
27 if self.used_runewords == set(self.runewords.keys()):
28 raise StopIteration
29 for runeword, recipe in self.runewords.items():
30 if runeword not in self.used_runewords:
31 used_indices = self.contains_recipe(recipe)
32 if used_indices is not None:
33 self.used_runewords.add(runeword)
34 for idx in reversed(used_indices):
35 self.runes.pop(idx)
36 return runeword
37 return None
38
39# calculator = RunewordsCalculator({
40# "Enigma": ("Ber", "Ith", "Eld")
41# })
42
43# print(next(iter(calculator))) # None
44# calculator.add_runes(["Ber", "Ith", "Eld"])
45# print(next(iter(calculator))) # Enigma
46# print(next(iter(calculator))) # Хвърля StopIteration
47
.....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)