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

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

1 точки общо

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

 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)

Дискусия
История
Това решение има само една версия.