Предизвикателства > Runewords Calculator > Решения > Решението на Ариф Мехмедали

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

1 точки общо

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

 1from collections import deque
 2
 3class Runeword:
 4    def __init__(self, name, needed_runes):
 5        self.name = name
 6        self.needed_runes = needed_runes
 7
 8
 9class RunewordsCalculator:
10    def __init__(self, runewords):
11        self.runewords = [Runeword(runeword, list(receipt)) for runeword, receipt in runewords.items()]
12        self.runes = list()
13
14    def add_runes(self, runes):
15        self.runes.extend(runes)
16
17    def __iter__(self):
18        return self
19    
20    def __next__(self):
21        if not self.runewords:
22            raise StopIteration
23 
24        for runeword in self.runewords:
25            current_receipt = deque(runeword.needed_runes)
26            updated_runes = []
27
28            for rune in self.runes:
29                if current_receipt and rune == current_receipt[0]:
30                    current_receipt.popleft()
31                else:
32                    updated_runes.append(rune)
33
34            if not current_receipt:
35                self.runes = updated_runes
36                to_return = runeword.name
37                self.runewords = [runeword for runeword in self.runewords if runeword.name != to_return]
38                return to_return
39
40        return None

.....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)

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

n1from itertools import productn1from collections import deque
22
3class Runeword:3class Runeword:
4    def __init__(self, name, needed_runes):4    def __init__(self, name, needed_runes):
5        self.name = name5        self.name = name
6        self.needed_runes = needed_runes6        self.needed_runes = needed_runes
77
nn8 
8class RunewordsCalculator:9class RunewordsCalculator:
9    def __init__(self, runewords):10    def __init__(self, runewords):
n10        self.runewords  = [Runeword(runeword, list(receipt)) for runeword, receipt in runewords.items()]n11        self.runewords = [Runeword(runeword, list(receipt)) for runeword, receipt in runewords.items()]
12        self.runes = list()
1113
12    def add_runes(self, runes):14    def add_runes(self, runes):
n13        for rune, runeword in product(runes, self.runewords):n15        self.runes.extend(runes)
14            first_needed = runeword.needed_runes[0] if runeword.needed_runes else None
15            if first_needed and rune == first_needed:
16                runeword.needed_runes = runeword.needed_runes[1:]
1716
18    def __iter__(self):17    def __iter__(self):
19        return self18        return self
20    19    
21    def __next__(self):20    def __next__(self):
22        if not self.runewords:21        if not self.runewords:
23            raise StopIteration22            raise StopIteration
24 23 
25        for runeword in self.runewords:24        for runeword in self.runewords:
n26            if not runeword.needed_runes:n25            current_receipt = deque(runeword.needed_runes)
26            updated_runes = []
27 
28            for rune in self.runes:
29                if current_receipt and rune == current_receipt[0]:
30                    current_receipt.popleft()
31                else:
32                    updated_runes.append(rune)
33 
34            if not current_receipt:
35                self.runes = updated_runes
27                to_return = runeword.name36                to_return = runeword.name
28                self.runewords = [runeword for runeword in self.runewords if runeword.name != to_return]37                self.runewords = [runeword for runeword in self.runewords if runeword.name != to_return]
29                return to_return38                return to_return
t30            t39 
31        return None40        return None
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op