1memory = []
2seen_phrases = set()
3
4
5def prettify_name(name):
6 return " ".join(word.capitalize() for word in name.split("_"))
7
8
9def normalize_address(address):
10 return " ".join(word.capitalize() for word in address.strip().split())
11
12
13def memnick(*funcs):
14 if not funcs:
15 def decorator(func):
16 def wrapper(*args, **kwargs):
17 phrase = func(*args, **kwargs)
18
19 if phrase not in seen_phrases:
20 seen_phrases.add(phrase)
21
22 address, _ = phrase.split(",", 1)
23 memory.append((normalize_address(address), phrase, prettify_name(func.__name__)))
24 return phrase
25 wrapper.__name__ = func.__name__
26 return wrapper
27 return decorator
28
29 wanted_names = set()
30 for func in funcs:
31 wanted_names.add(prettify_name(func.__name__))
32
33 result = []
34 for address, phrase, speaker in memory:
35 if address in wanted_names:
36 result.append(f"С гласа на {speaker}: {phrase}")
37
38 return result
..F..
======================================================================
FAIL: test_memnick_memorizes (test.TestMemnick.test_memnick_memorizes)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 51, in test_memnick_memorizes
self.assertEqual(
~~~~~~~~~~~~~~~~^
[
^
...<5 lines>...
solution.memnick(божана, емил),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
AssertionError: Lists differ: ['С гласа на Лазар: Божана, може би ще те любя.', 'С г[166 chars]ах!'] != ['С гласа на Бай Венци: Емил, айде да играем шах!', 'С[166 chars]бя.']
First differing element 0:
'С гласа на Лазар: Божана, може би ще те любя.'
'С гласа на Бай Венци: Емил, айде да играем шах!'
+ ['С гласа на Бай Венци: Емил, айде да играем шах!',
- ['С гласа на Лазар: Божана, може би ще те любя.',
? ^
+ 'С гласа на Лазар: Божана, може би ще те любя.',
? ^
'С гласа на Митака: Божана, на този етап не съм сигурен дали искам да те '
'любя.',
- 'С гласа на Почекаин: Божана, ще те любя.',
? ^
+ 'С гласа на Почекаин: Божана, ще те любя.']
? ^
- 'С гласа на Бай Венци: Емил, айде да играем шах!']
----------------------------------------------------------------------
Ran 5 tests in 0.002s
FAILED (failures=1)
| f | 1 | memory = [] | f | 1 | memory = [] |
| 2 | seen_phrases = set() | 2 | seen_phrases = set() | ||
| 3 | 3 | ||||
| 4 | 4 | ||||
| 5 | def prettify_name(name): | 5 | def prettify_name(name): | ||
| 6 | return " ".join(word.capitalize() for word in name.split("_")) | 6 | return " ".join(word.capitalize() for word in name.split("_")) | ||
| 7 | 7 | ||||
| 8 | 8 | ||||
| 9 | def normalize_address(address): | 9 | def normalize_address(address): | ||
| 10 | return " ".join(word.capitalize() for word in address.strip().split()) | 10 | return " ".join(word.capitalize() for word in address.strip().split()) | ||
| 11 | 11 | ||||
| 12 | 12 | ||||
| 13 | def memnick(*funcs): | 13 | def memnick(*funcs): | ||
| 14 | if not funcs: | 14 | if not funcs: | ||
| 15 | def decorator(func): | 15 | def decorator(func): | ||
| 16 | def wrapper(*args, **kwargs): | 16 | def wrapper(*args, **kwargs): | ||
| 17 | phrase = func(*args, **kwargs) | 17 | phrase = func(*args, **kwargs) | ||
| 18 | 18 | ||||
| 19 | if phrase not in seen_phrases: | 19 | if phrase not in seen_phrases: | ||
| 20 | seen_phrases.add(phrase) | 20 | seen_phrases.add(phrase) | ||
| 21 | 21 | ||||
| 22 | address, _ = phrase.split(",", 1) | 22 | address, _ = phrase.split(",", 1) | ||
| 23 | memory.append((normalize_address(address), phrase, prettify_name(func.__name__))) | 23 | memory.append((normalize_address(address), phrase, prettify_name(func.__name__))) | ||
| 24 | return phrase | 24 | return phrase | ||
| 25 | wrapper.__name__ = func.__name__ | 25 | wrapper.__name__ = func.__name__ | ||
| 26 | return wrapper | 26 | return wrapper | ||
| 27 | return decorator | 27 | return decorator | ||
| 28 | 28 | ||||
| 29 | wanted_names = set() | 29 | wanted_names = set() | ||
| 30 | for func in funcs: | 30 | for func in funcs: | ||
| 31 | wanted_names.add(prettify_name(func.__name__)) | 31 | wanted_names.add(prettify_name(func.__name__)) | ||
| 32 | 32 | ||||
| 33 | result = [] | 33 | result = [] | ||
| 34 | for address, phrase, speaker in memory: | 34 | for address, phrase, speaker in memory: | ||
| 35 | if address in wanted_names: | 35 | if address in wanted_names: | ||
| 36 | result.append(f"С гласа на {speaker}: {phrase}") | 36 | result.append(f"С гласа на {speaker}: {phrase}") | ||
| 37 | 37 | ||||
| 38 | return result | 38 | return result | ||
| t | 39 | t | |||
| 40 | @memnick() | ||||
| 41 | def божана(): | ||||
| 42 | return "Почекаин, ти си луд!" | ||||
| 43 | |||||
| 44 | |||||
| 45 | @memnick() | ||||
| 46 | def бай_венци(): | ||||
| 47 | return "Емил, айде да играем шах!" | ||||
| 48 | |||||
| 49 | |||||
| 50 | @memnick() | ||||
| 51 | def бай_венци_2(): | ||||
| 52 | return "Емил, гладен съм!" | ||||
| 53 | |||||
| 54 | |||||
| 55 | бай_венци_2.__name__ = "бай_венци" | ||||
| 56 | |||||
| 57 | |||||
| 58 | @memnick() | ||||
| 59 | def емил(): | ||||
| 60 | return "Божана, намери сина ми." | ||||
| 61 | |||||
| 62 | |||||
| 63 | @memnick() | ||||
| 64 | def емил_2(): | ||||
| 65 | return "Почекаин, нищо не става от тебе." | ||||
| 66 | |||||
| 67 | |||||
| 68 | емил_2.__name__ = "емил" | ||||
| 69 | |||||
| 70 | |||||
| 71 | @memnick() | ||||
| 72 | def почекаин(): | ||||
| 73 | return "Божана, ще те любя." | ||||
| 74 | |||||
| 75 | |||||
| 76 | print(божана()) | ||||
| 77 | print(бай_венци()) | ||||
| 78 | print(бай_венци_2()) | ||||
| 79 | print(емил()) | ||||
| 80 | print(емил_2()) | ||||
| 81 | print(почекаин()) | ||||
| 82 | |||||
| 83 | print(memnick(емил, божана)) | ||||
| 84 | print(memnick(бай_венци)) | ||||
| 85 | print(memnick(почекаин)) |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||
15.03.2026 14:07