1import re
2
3class Santa():
4 gifts_list = []
5 gifts_count = {}
6 santas_dict = {}
7 order = []
8
9 def common_gift(self):
10 for gift in self.gifts_list:
11 self.gifts_count[gift] += 1
12
13 max = 0
14 present = ''
15
16 for gift in self.gifts_count:
17 if self.gifts_count[gift] > max:
18 max = self.gifts_count[gift]
19 present = gift
20
21 return present
22
23 def __new__(cls):
24 if not hasattr(cls, 'instance'):
25 cls.instance = super(Santa, cls).__new__(cls)
26 return cls.instance
27
28 def __call__(self, kid, zhelanie):
29 gift = re.search(r'[\'\"]+?([0-9a-zA-Z]+\s+)*[0-9a-zA-Z]+[\'\"]+?', zhelanie).group()
30 gift = re.sub('"', '', gift, count = 0)
31 gift = re.sub("'", '', gift, count = 0)
32
33 if id(kid) not in self.order:
34 self.order.append(id(kid))
35
36 for idexes in Santa.santas_dict:
37 if idexes is kid:
38 Santa.santas_dict[idexes] = gift
39
40 def __matmul__(self, pismo):
41 gift = re.search(r'[\'\"]+?([0-9a-zA-Z]+\s+)*[0-9a-zA-Z]+[\'\"]+?', pismo).group()
42 gift = re.sub('"', '', gift, count = 0)
43 gift = re.sub("'", '', gift, count = 0)
44 _id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
45 _id = re.sub(r'[(^\s+)(\s+$)]', '', _id)
46
47 if _id not in self.order:
48 self.order.append(_id)
49
50 for idexes in Santa.santas_dict:
51 if str(id(idexes)) == _id:
52 Santa.santas_dict[idexes] = gift
53
54 def xmas(self):
55 common = self.common_gift()
56
57 for indexes in self.order:
58 for kids in self.santas_dict:
59 if str(id(kids)) == str(indexes):
60 if kids.age < 6:
61 kids.age += 1
62 if not kids.bad_kid and self.santas_dict[kids]:
63 kids.__call__(kids, self.santas_dict[kids])
64
65 elif kids.bad_kid:
66 kids.__call__('coal')
67
68 else:
69 kids.__call__(common)
70
71 self.gifts_list.clear()
72 self.santas_dict.clear()
73 self.gifts_count.clear()
74
75 def __iter__(self):
76 self.cur = 0
77 self.end = len(self.gifts_list)
78 return self
79
80 def __next__(self):
81 if self.cur < self.end:
82 res = self.gifts_list[self.cur]
83 self.cur += 1
84 return res
85 else:
86 raise StopIteration
87
88class Kid(type):
89 def __new__(cls, name, bases, attr_dict ):
90
91 if '__call__' not in attr_dict:
92 raise NotImplementedError(f'много ви обичамe (или не :P)')
93
94 attr_dict['age'] = 0
95 attr_dict['bad_kid'] = False
96
97 def n(self):
98 Santa.santas_dict[self] = ''
99
100 for attributes in attr_dict:
101 if callable(attributes):
102 try:
103 return attributes(self)
104 except:
105 attr_dict['bad_kid'] = True
106
107 return self
108
109 attr_dict['__new__'] = n
110 instance = super().__new__(cls, name, bases, attr_dict )
111
112 return instance
..FEFEEEF.E.EEEE.EEF
======================================================================
ERROR: test_call_and_mail_same_kid (test.TestSanta.test_call_and_mail_same_kid)
Test that calls and mails work for the same kid.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 70, in test_call_and_mail_same_kid
self.santa @ f"'toy1'\n{id(kid1)}"
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
File "/tmp/solution.py", line 44, in __matmul__
_id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_mail (test.TestSanta.test_mail)
Test sending message via email.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 62, in test_mail
self.santa @ f"'toy1'\n{id(kid1)}"
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
File "/tmp/solution.py", line 44, in __matmul__
_id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_present_matching (test.TestSanta.test_present_matching)
Test matching signature in the letter.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 87, in test_present_matching
self.santa @ f"""
File "/tmp/solution.py", line 41, in __matmul__
gift = re.search(r'[\'\"]+?([0-9a-zA-Z]+\s+)*[0-9a-zA-Z]+[\'\"]+?', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_santa_gift_order (test.TestSanta.test_santa_gift_order)
Test ordering of the Santa iterator.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 256, in test_santa_gift_order
self.santa @ f"'toy3'\n{id(kid3)}"
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
File "/tmp/solution.py", line 44, in __matmul__
_id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_xmass (test.TestSanta.test_xmass)
Test a simple Christmas case.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 139, in test_xmass
self.santa @ f"'toy3'\n{id(kid3)}"
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
File "/tmp/solution.py", line 44, in __matmul__
_id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_xmass_kid_without_a_wish (test.TestSanta.test_xmass_kid_without_a_wish)
Test a Christmas with a kids that hasn't sent a wish.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 173, in test_xmass_kid_without_a_wish
self.santa @ f"'toy2'\n{id(kid3)}"
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
File "/tmp/solution.py", line 44, in __matmul__
_id = re.search(r'[\n^]\s*\d+\s*[\n$]', pismo).group()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
======================================================================
ERROR: test_xmass_naughty (test.TestSanta.test_xmass_naughty)
Test a Christmas with naughty kids.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 223, in test_xmass_naughty
kid1.public_with_error()
TypeError: TestSanta.<lambda>() missing 1 required positional argument: 'self'
======================================================================
ERROR: test_xmass_no_wishes (test.TestSanta.test_xmass_no_wishes)
Test a Christmas with no wishes.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 151, in test_xmass_no_wishes
self.assertEqual(kid1.SECRET_PRESENT, None)
^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'KidClass1' has no attribute 'SECRET_PRESENT'
======================================================================
ERROR: test_xmass_no_wishes_but_naughty_kids (test.TestSanta.test_xmass_no_wishes_but_naughty_kids)
Test a Christmas with no wishes, but naughty kids present.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 163, in test_xmass_no_wishes_but_naughty_kids
self.assertEqual(kid1.SECRET_PRESENT, None)
^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'KidClass1' has no attribute 'SECRET_PRESENT'
======================================================================
ERROR: test_xmass_public_with_no_error (test.TestSanta.test_xmass_public_with_no_error)
Test a Christmas with not-so-naughty kids.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 246, in test_xmass_public_with_no_error
self.assertEqual(kid1.public_without_error(), 42)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: TestSanta.<lambda>() missing 1 required positional argument: 'self'
======================================================================
ERROR: test_xmass_years_5_and_over (test.TestSanta.test_xmass_years_5_and_over)
Test with passing years with kid aged 5 and over.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 213, in test_xmass_years_5_and_over
self.assertEqual(kid1.SECRET_PRESENT, None)
^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'KidClass1' has no attribute 'SECRET_PRESENT'
======================================================================
FAIL: test_call (test.TestSanta.test_call)
Test sending message via calling.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 56, in test_call
self.assertEqual(list(self.santa), ['toy1', 'toy2'])
AssertionError: Lists differ: [] != ['toy1', 'toy2']
Second list contains 2 additional elements.
First extra element 0:
'toy1'
- []
+ ['toy1', 'toy2']
======================================================================
FAIL: test_iterable (test.TestSanta.test_iterable)
Ensure Santa can be iterated multiple times including overwriting presents.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 129, in test_iterable
self.assertEqual(list(self.santa), ['something', 'something else'])
AssertionError: Lists differ: [] != ['something', 'something else']
Second list contains 2 additional elements.
First extra element 0:
'something'
- []
+ ['something', 'something else']
======================================================================
FAIL: test_signature_matching (test.TestSanta.test_signature_matching)
Test matching present in the letter / call.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 118, in test_signature_matching
self.assertEqual(kid1.SECRET_PRESENT, 'toy1')
AssertionError: 'toy3' != 'toy1'
- toy3
? ^
+ toy1
? ^
======================================================================
FAIL: test_xmass_years_under_5 (test.TestSanta.test_xmass_years_under_5)
Test with passing years with a kid under 5 years old.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 201, in test_xmass_years_under_5
self.assertEqual(kid1.SECRET_PRESENT, 'toy2')
AssertionError: None != 'toy2'
----------------------------------------------------------------------
Ran 20 tests in 0.024s
FAILED (failures=4, errors=11)
19.12.2024 12:47
19.12.2024 12:48
19.12.2024 12:50
19.12.2024 12:51
19.12.2024 12:50
19.12.2024 12:53
19.12.2024 12:52
19.12.2024 12:54
19.12.2024 12:53
19.12.2024 12:54
19.12.2024 12:56
19.12.2024 12:55
19.12.2024 12:48
19.12.2024 12:55
19.12.2024 12:55
19.12.2024 12:56