Домашни > Функцията, която казва "Ni!" > Решения > Решението на Стивън Александров

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

9 точки общо

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

 1# ъпдейтнато решение, бях забравил да разгледам случая, при който се подават именувани аргументи в следния вид
 2# Пр. function_that_says_ni(1,2, name = "bush", cost = 1.20)
 3# В това, в което се подава няма речници, но в последствие name и cost отиват в речника kwargs
 4# и така дефакто имаме един речник, в който се описва храст, което е самия kwargs
 5# не съм поправял от нещата, които ми препоръчахте!
 6# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
 7def search_bush_in_dict(element):
 8    found_bush = False # да разберем дали вече сме намерили name храст
 9    sum_of_bush = 0 # сумата на храста в съответния dict
10    for key,value in element.items():
11        if key == "name":
12            # понеже може да е нещо, което не е str, пък аз искам да използвам upper
13            value_str = str(value)
14            # понеже може да са в комбинация от малки/главни букви, ще използвам upper
15            if(value_str.upper() == "храст".upper() or value_str.upper() == "shrub".upper() or value_str.upper() == "bush".upper()):
16                found_bush = True
17                continue
18            else:
19                 # ако не е храст, понеже не може да има два еднакви ключа
20                break
21        # приемам, че в dictionary-то първо ще има name, а след това cost, иначе рискуваме да има cost но да няма name
22        # затова е и проверката за found_bush
23        elif key == "cost" and found_bush:
24            sum_of_bush = value
25            break
26        # Вращаме лист, съставен от това дали сме намерили храст + каква е цената му
27        # защото нз как да му отразя промяната в тва sum_costs (Пр. c++ style референция)
28    return found_bush, sum_of_bush
29
30def function_that_says_ni(*args, **kwargs):
31    set_unique = set() # да бутам различните букви от имената на именуваните
32    sum_costs = 0 # за цените
33    for element in args:
34        # проверявам дали са речници, иначе не ги гледаме
35        if type(element) is dict:
36            # ще гледам в съответния dict и ще търся храсти
37            result = search_bush_in_dict(element) # примерно [True, 1.20]
38            sum_costs += result[1]
39    # updated: 20.10.24 - 18:30
40    # ако самия kwargs е във формата на речник, описващ храст
41    result = search_bush_in_dict(kwargs)
42    if result[0] == True:
43        sum_costs += result[1]
44    # край на update-a
45    # ако вътре в kwargs имаме речници, които описват храсти
46    for key, value in kwargs.items():
47        if type(value) is dict:
48            result = search_bush_in_dict(value)
49            if result[0] == True:
50                sum_costs += result[1]
51                # сега да сложим буквите в множеството
52                for i in range(len(key)):
53                    set_unique.add(key[i])
54    unique_bukvi = len(set_unique)
55    is_handsome = False
56    if not (int(sum_costs) == 0) and unique_bukvi % int(sum_costs) == 0:
57        is_handsome = True
58    if sum_costs < 42.00 and is_handsome:
59        # round не работеше, затва пробвах тоя format
60        return str(format(sum_costs,".2f")) + "лв"
61    else:
62        return "Ni!"

.....F....
======================================================================
FAIL: test_multiple_shrubs_sumс (test.TestNi.test_multiple_shrubs_sumс)
Test with a multiple shrubs and cornercase costs.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 34, in test_multiple_shrubs_sumс
self.assertEqual(function_that_says_ni({'name': 'shrub', 'cost': 20.00},
AssertionError: 'Ni!' != '42.00лв'
- Ni!
+ 42.00лв

----------------------------------------------------------------------
Ran 10 tests in 0.001s

FAILED (failures=1)

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

nn1# ъпдейтнато решение, бях забравил да разгледам случая, при който се подават именувани аргументи в следния вид
2# Пр. function_that_says_ni(1,2, name = "bush", cost = 1.20)
3# В това, в което се подава няма речници, но в последствие name и cost отиват в речника kwargs
4# и така дефакто имаме един речник, в който се описва храст, което е самия kwargs
5# не съм поправял от нещата, които ми препоръчахте!
6# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
1def search_bush_in_dict(element):7def search_bush_in_dict(element):
2    found_bush = False # да разберем дали вече сме намерили name храст8    found_bush = False # да разберем дали вече сме намерили name храст
3    sum_of_bush = 0 # сумата на храста в съответния dict9    sum_of_bush = 0 # сумата на храста в съответния dict
4    for key,value in element.items():10    for key,value in element.items():
5        if key == "name":11        if key == "name":
6            # понеже може да е нещо, което не е str, пък аз искам да използвам upper12            # понеже може да е нещо, което не е str, пък аз искам да използвам upper
7            value_str = str(value)13            value_str = str(value)
8            # понеже може да са в комбинация от малки/главни букви, ще използвам upper14            # понеже може да са в комбинация от малки/главни букви, ще използвам upper
9            if(value_str.upper() == "храст".upper() or value_str.upper() == "shrub".upper() or value_str.upper() == "bush".upper()):15            if(value_str.upper() == "храст".upper() or value_str.upper() == "shrub".upper() or value_str.upper() == "bush".upper()):
10                found_bush = True16                found_bush = True
11                continue17                continue
12            else:18            else:
13                 # ако не е храст, понеже не може да има два еднакви ключа19                 # ако не е храст, понеже не може да има два еднакви ключа
14                break20                break
15        # приемам, че в dictionary-то първо ще има name, а след това cost, иначе рискуваме да има cost но да няма name21        # приемам, че в dictionary-то първо ще има name, а след това cost, иначе рискуваме да има cost но да няма name
16        # затова е и проверката за found_bush22        # затова е и проверката за found_bush
17        elif key == "cost" and found_bush:23        elif key == "cost" and found_bush:
18            sum_of_bush = value24            sum_of_bush = value
19            break25            break
20        # Вращаме лист, съставен от това дали сме намерили храст + каква е цената му26        # Вращаме лист, съставен от това дали сме намерили храст + каква е цената му
21        # защото нз как да му отразя промяната в тва sum_costs (Пр. c++ style референция)27        # защото нз как да му отразя промяната в тва sum_costs (Пр. c++ style референция)
n22    return [found_bush, sum_of_bush]n28    return found_bush, sum_of_bush
29 
23def function_that_says_ni(*args, **kwargs):30def function_that_says_ni(*args, **kwargs):
24    set_unique = set() # да бутам различните букви от имената на именуваните31    set_unique = set() # да бутам различните букви от имената на именуваните
25    sum_costs = 0 # за цените32    sum_costs = 0 # за цените
26    for element in args:33    for element in args:
27        # проверявам дали са речници, иначе не ги гледаме34        # проверявам дали са речници, иначе не ги гледаме
28        if type(element) is dict:35        if type(element) is dict:
29            # ще гледам в съответния dict и ще търся храсти36            # ще гледам в съответния dict и ще търся храсти
30            result = search_bush_in_dict(element) # примерно [True, 1.20]37            result = search_bush_in_dict(element) # примерно [True, 1.20]
31            sum_costs += result[1]38            sum_costs += result[1]
tt39    # updated: 20.10.24 - 18:30
40    # ако самия kwargs е във формата на речник, описващ храст
41    result = search_bush_in_dict(kwargs)
42    if result[0] == True:
43        sum_costs += result[1]
44    # край на update-a
45    # ако вътре в kwargs имаме речници, които описват храсти
32    for key, value in kwargs.items():46    for key, value in kwargs.items():
33        if type(value) is dict:47        if type(value) is dict:
34            result = search_bush_in_dict(value)48            result = search_bush_in_dict(value)
35            if result[0] == True:49            if result[0] == True:
36                sum_costs += result[1]50                sum_costs += result[1]
37                # сега да сложим буквите в множеството51                # сега да сложим буквите в множеството
38                for i in range(len(key)):52                for i in range(len(key)):
39                    set_unique.add(key[i])53                    set_unique.add(key[i])
40    unique_bukvi = len(set_unique)54    unique_bukvi = len(set_unique)
41    is_handsome = False55    is_handsome = False
42    if not (int(sum_costs) == 0) and unique_bukvi % int(sum_costs) == 0:56    if not (int(sum_costs) == 0) and unique_bukvi % int(sum_costs) == 0:
43        is_handsome = True57        is_handsome = True
44    if sum_costs < 42.00 and is_handsome:58    if sum_costs < 42.00 and is_handsome:
45        # round не работеше, затва пробвах тоя format59        # round не работеше, затва пробвах тоя format
46        return str(format(sum_costs,".2f")) + "лв"60        return str(format(sum_costs,".2f")) + "лв"
47    else:61    else:
48        return "Ni!"62        return "Ni!"
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op