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)
| n | 1 | from itertools import product | n | 1 | from collections import deque |
| 2 | 2 | ||||
| 3 | class Runeword: | 3 | class Runeword: | ||
| 4 | def __init__(self, name, needed_runes): | 4 | def __init__(self, name, needed_runes): | ||
| 5 | self.name = name | 5 | self.name = name | ||
| 6 | self.needed_runes = needed_runes | 6 | self.needed_runes = needed_runes | ||
| 7 | 7 | ||||
| n | n | 8 | |||
| 8 | class RunewordsCalculator: | 9 | class RunewordsCalculator: | ||
| 9 | def __init__(self, runewords): | 10 | def __init__(self, runewords): | ||
| n | 10 | self.runewords = [Runeword(runeword, list(receipt)) for runeword, receipt in runewords.items()] | n | 11 | self.runewords = [Runeword(runeword, list(receipt)) for runeword, receipt in runewords.items()] |
| 12 | self.runes = list() | ||||
| 11 | 13 | ||||
| 12 | def add_runes(self, runes): | 14 | def add_runes(self, runes): | ||
| n | 13 | for rune, runeword in product(runes, self.runewords): | n | 15 | 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:] | ||||
| 17 | 16 | ||||
| 18 | def __iter__(self): | 17 | def __iter__(self): | ||
| 19 | return self | 18 | return self | ||
| 20 | 19 | ||||
| 21 | def __next__(self): | 20 | def __next__(self): | ||
| 22 | if not self.runewords: | 21 | if not self.runewords: | ||
| 23 | raise StopIteration | 22 | raise StopIteration | ||
| 24 | 23 | ||||
| 25 | for runeword in self.runewords: | 24 | for runeword in self.runewords: | ||
| n | 26 | if not runeword.needed_runes: | n | 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 | ||||
| 27 | to_return = runeword.name | 36 | 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_return | 38 | return to_return | ||
| t | 30 | t | 39 | ||
| 31 | return None | 40 | return None |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||