Skip to content
Dmitriy Permyakov edited this page Dec 25, 2022 · 4 revisions

All tasks of the 3rd week.

Task 1.

Click to expand

Допустим, ваша компания каждый месяц выделяет некоторую сумму денег на подарки сотрудникам ко дню рождения. Каждый месяц эта сумма разная. Также у вас есть список дней рождения сотрудников. Вам нужно написать удобный инструмент для того, чтобы сотрудники могли понять, сколько денег им ждать на день рождения, если известно, какой бюджет выделяется на месяц и для какого месяца производится подсчет. Для этого напишите функцию gift_count, которая будет принимать: бюджет, который выделяется компанией на месяц номер месяца, на который нужно произвести расчет словарь, где ключи - это имена сотрудников, а значения - datetime.date с датой рождения сотрудника. Функция должна вывести на экран фразу (цифры должны быть подставлены в соответствии со значениями аргументов): Именинники в месяце 5: Иванов Иван Иванович (01.05.1989), Петров Петр Петрович (06.05.1998). При бюджете 20000 они получат по 10000 рублей. Если в ответе получается не целое число, округлите его до меньшего целого. Именинники должны быть выведены в порядке дня рождения по возрастанию (не полной даты рождения, а именно дня). Если в выбранном месяце нет именинников, должна быть выведена строка "В этом месяце нет именниннков." Формат ввода

birthdays = {"Иванов Иван Иванович": datetime.date(1989, 5, 1), "Петров Петр Петрович": datetime.date(1998, 5, 6)}
gift_count(20000, 5, birthdays)
gift_count(budget=20000, month=5, birthdays=birthdays)

Формат вывода

Именинники в месяце 5: Иванов Иван Иванович (01.05.1989), Петров Петр Петрович (06.05.1998). При бюджете 20000 они получат по 10000 рублей.

Примечания

В примере формата ввода показаны несколько вариантов вызова функции gift_count: с порядковыми аргументами и с передачей их по имени. Соответственно, аргументы функции должны называться так же, как они используются в примере.

Task 2.

Click to expand

Вам нужно написать функцию lists_sum, которая принимает произвольное количество списков чисел, и возвращает сумму всех этих чисел. Предусмотрите дополнительный аргумент unique, который по умолчанию равен False, но если в функцию подается unique=True, то функция должна вернуть сумму всех уникальных чисел из всех списков. Если поданы только пустые списки или списки чисел вообще не поданы в функцию, то считать сумму чисел нулём. Формат ввода

lists_sum([1, 1], [1], [1, 2, 3])
lists_sum([1, 1, 1], [1, 1], unique=True)
lists_sum([1, 1, 1], unique=False)

Формат вывода

lists_sum([1, 1], [1], [1, 2, 3]) == 9
lists_sum([1, 1, 1], [1, 1], unique=True) == 1
lists_sum([1, 1, 1], unique=False) == 3

Task 3.

Click to expand

Постановка задачи

Вы с друзьями периодически собираетесь на лавке у подъезда выпить чаю с баранками. Каждый раз собирается разное количество человек, которое должно скинуть по n рублей на мероприятие. Также у вас в компании есть общак, в который можно докинуть денег, а можно взять. Все транзакции в общак логируются, т.е. у вас есть информация о каждом переводе денег в/из общака для каждого из друзей. Ваша задача - посчитать, сколько денег должен каждый из собравшихся на мероприятие друзей на момент начала мероприятия. Будем считать, что все деньги проходят через общак, поэтому у каждого друга к началу мероприятия уже есть некоторый "баланс" в общаке. Формат хранения данных

Все операции с деньгами хранятся в базе данных и приходят к вам в виде списка словарей вида:
    {"name": "Василий", "amount": 500},
    {"name": "Петя", "amount": 100},
    {"name": "Василий", "amount": -300},
]

где name - имя друга (считаем, что всех зовут по-разному), amount - сумма, которая добавлена в общак. Если сумма отрицательная - это значит, что друг взял деньги из общака. Также считаем, что скидываются суммы в рублях без копеек. Вам нужно описать две функции.

get_balance(name, transactions) -> int функция, которая возвращает текущий баланс друга с именем name, исходя из списка транзакций transactions. Если имя name ни разу не встречается в списке transactions, считаем, что баланс этого друга в общаке равен 0 рублей. count_debts(names, amount, transactions) -> dict функция, которая принимает список имен присутствующих на мероприятии друзей names, стоимость баранок и чая на человека amount, а также список транзакций в общак transactions. Вернуть эта функция должна словарь вида {"имя_друга": 100}, где 100 - это количество денег, которое он должен скинуть на мероприятие. Если на балансе друга больше денег, чем требуется на мероприятие, то он должен 0 рублей. Формат ввода

transactions = [ {"name": "Василий", "amount": 500}, {"name": "Петя", "amount": 100}, {"name": "Василий", "amount": -300}, ]
get_balance("Василий", transactions)
count_debts(["Василий", "Петя", "Вова"], 150, transactions)

Формат вывода

get_balance("Василий", transactions) == 200
count_debts(["Василий", "Петя", "Вова"], 150, transactions) == {"Василий": 0, "Петя": 50, "Вова": 150}

Clone this wiki locally