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

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

11 точки общо

10 успешни теста
0 неуспешни теста
Код (здр)
Скрий всички коментари

 1from functools import reduce
 2
 3KEY_NAME = 'name'
 4KEY_COST = 'cost'
 5NO_MATCH = 'Ni!'
 6INPUT_H= 'ХРАСТ'
 7INPUT_S = 'SHRUB'
 8INPUT_B = 'BUSH'
 9VALID_INPUTS = [INPUT_H, INPUT_S, INPUT_B]
10THE_ULTIMATE_ANSWER = 42
11
12def is_too_expensive(cost):
13    return cost > THE_ULTIMATE_ANSWER
14
15def is_nice(kwargs, cost):
16    int_cost = int(cost)
17
18    if int_cost == 0:
19        return False
20
21    unique_letter_count = len(reduce(lambda acc, next: acc.union(list(next)), kwargs.keys(), set()))
22
23    return unique_letter_count % int_cost == 0
24
25def function_that_says_ni(*args, **kwargs):
26    all_dict_args = [
27        *list(filter(lambda p_arg: isinstance(p_arg, dict) , args)),
28        *list(map(lambda key: kwargs[key], filter(lambda key: isinstance(kwargs[key], dict), kwargs)))
29    ]
30    # print(all_dict_args)
31     
32    valid_dict_args = list(filter(lambda d: isinstance(d.get(KEY_NAME), str) and d.get(KEY_NAME).upper() in VALID_INPUTS , all_dict_args))
33    # print(valid_dict_args)
34
35    total_cost = reduce(lambda acc, next: acc + next.get(KEY_COST, 0), valid_dict_args, 0)
36    # print(total_cost)
37
38    if is_too_expensive(total_cost):
39        return NO_MATCH
40    elif not is_nice(kwargs, total_cost):
41        return NO_MATCH
42    else:
43        return f"{total_cost:.2f}лв"

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

OK

Дискусия
Виктор Бечев
17.10.2024 11:59

Отвъд горната дребна забележка и някои от имената из ламбдите, които могат да бъдат по-описателни - добро решение, браво. П.П. Що се отнася до енъмите - да, можеш да ползваш `enum.Enum`, но съм съгласен, че за нещо толкова дребно е overkill.
Димитър Фенерски
16.10.2024 20:49

1. много ми се щеше да ползвам структ или енум за константите, ама в пайтън май няма? в нета излиза да импортвам енум и да правя клас но ми прилича на overkill 2. надявам се е ок форматирано 3. като тествам ползвам print, затова ги оставям вътре (сега са коментирани). мога да опитам и някакъв интерактивен дебъгер да атачна 4. надявам се да съм дочел условието и да не пропускам неща ....
История
Това решение има само една версия.