Руководство местной кофейни для программистов под названием Java-0x00
решило модернизировать систему заказа кофе.
Для этого им требуется реализовать функцию order
, которая принимает список предпочтений посетителя в порядке «убывания желания».
Согласно положению, каждый напиток в кофейне строго определён рецептом:
- Эспрессо готовится из: 1 порции кофейных зерен.
- Капучино готовится из: 1 порции кофейных зерен и 3 порций молока.
- Макиато готовится из: 2 порций кофейных зерен и 1 порции молока.
- Кофе по-венски готовится из: 1 порции кофейных зерен и 2 порций взбитых сливок.
- Латте Макиато готовится из: 1 порции кофейных зерен, 2 порций молока и 1 порции взбитых сливок.
- Кон Панна готовится из: 1 порции кофейных зерен и 1 порции взбитых сливок.
В глобальной переменной in_stock
содержится словарь, описывающий ингредиенты в наличии. Ключи словаря: coffee
, cream
, milk
.
Функция должна вернуть:
- название напитка, который будет приготовлен;
- сообщение «К сожалению, не можем предложить Вам напиток», если ни одно из предпочтений не может быть приготовлено.
Если заказ, может быть совершён, количество доступных ингредиентов должно соответствующим образом уменьшиться.
Примечание
В решении не должно быть вызовов требуемых функций.
Пример
Ввод
in_stock = {"coffee": 1, "milk": 2, "cream": 3}
print(order("Эспрессо", "Капучино", "Макиато", "Кофе по-венски", "Латте Макиато", "Кон Панна"))
print(order("Эспрессо", "Капучино", "Макиато", "Кофе по-венски", "Латте Макиато", "Кон Панна"))
Вывод
Эспрессо
К сожалению, не можем предложить Вам напиток
Ввод
in_stock = {"coffee": 4, "milk": 4, "cream": 0}
print(order("Капучино", "Макиато", "Эспрессо"))
print(order("Капучино", "Макиато", "Эспрессо"))
print(order("Капучино", "Макиато", "Эспрессо"))
Вывод
Капучино
Макиато
Эспрессо
Решение
Очень хорошая задача на применение словарей. Применение глобальных переменных не так оправдано, но мы в этом разделе изучаем именно их, а значит, пусть будут глобальные переменные.
Формируем словарь рецептов. Будьте на этом этапе особенно внимательны. 90% вопросов о неработоспособностью программы связаны именно с ошибками в словаре.
Каждый вызов запускаем проверку – всех ли ингредиентов хватает, чтобы приготовить напиток. Если да, то возвращаем название напитка, если нет, то сообщение с извинениями.
Для того, чтобы проверить хватает ли нам ингредиентов, достаточно СНАЧАЛА проверить все ключи словаря рецепта, а потом, и только в случае успеха уменьшить значения соответствующих ингредиентов на складе.
На этом можно было бы и закончить, но представленный алгоритм не учитывает одну простую вещь – а что, если в рецептах есть ингредиент, которого нет в списке ингредиентов на складе? Первые три решения выдадут ошибку, что конечно де, неправильно. Решить проблему может простая проверка – прежде чем проверять хватает ли данного ингредиента на складе, можно проверить есть ли он там вообще в списке ингредиентов. Сделать это можно прямо в конструкции которая проверяет достаточность ингредиентов.
Посмотреть код
Решение
RECIPES = {
"Эспрессо": {"coffee": 1},
"Капучино": {"coffee": 1, "milk": 3},
"Макиато": {"coffee": 2, "milk": 1},
"Кофе по-венски": {"coffee": 1, "cream": 2},
"Латте Макиато": {"coffee": 1, "milk": 2, "cream": 1},
"Кон Панна": {"coffee": 1, "cream": 1},
}
in_stock = {}
def order(*drinks):
global in_stock
temp = in_stock
for drink in drinks:
for ingredient in RECIPES[drink]:
if RECIPES[drink].get(ingredient, 0) > in_stock[ingredient]:
break
else:
for ingredient in RECIPES[drink]:
in_stock[ingredient] -= RECIPES[drink][ingredient]
return drink
if in_stock == temp:
return "К сожалению, не можем предложить Вам напиток"
Решение
RECIPES = {
'Эспрессо': {'coffee': 1},
'Капучино': {"coffee": 1, "milk": 3},
'Макиато': {"coffee": 2, "milk": 1},
'Кофе по-венски': {"coffee": 1, "cream": 2},
'Латте Макиато': {"coffee": 1, "milk": 2, "cream": 1},
'Кон Панна': {"coffee": 1, "cream": 1}
}
in_stock = {}
def is_enough_ingredients(drink):
global RECIPES, in_stock
return all(RECIPES[drink][ingredient] <= in_stock[ingredient] for ingredient in RECIPES[drink])
def order(*drinks):
global RECIPES, in_stock
for drink in drinks:
if is_enough_ingredients(drink):
for ingredient, amount in RECIPES[drink].items():
in_stock[ingredient] -= amount
return drink
return 'К сожалению, не можем предложить Вам напиток'
Решение
RECIPES = {
'Эспрессо': {'coffee': 1},
'Капучино': {"coffee": 1, "milk": 3},
'Макиато': {"coffee": 2, "milk": 1},
'Кофе по-венски': {"coffee": 1, "cream": 2},
'Латте Макиато': {"coffee": 1, "milk": 2, "cream": 1},
'Кон Панна': {"coffee": 1, "cream": 1}
}
in_stock = {}
def order(*drinks):
global in_stock, RECIPES
for drink in drinks:
if all(RECIPES[drink][ingredient] <= in_stock[ingredient] for ingredient in RECIPES[drink]):
for ingredient, amount in RECIPES[drink].items():
in_stock[ingredient] -= amount
return drink
return "К сожалению, не можем предложить Вам напиток"
Решение
# Полное с точки зрения логики, но избыточное с точки зрения тестов Яндекса решение
RECIPES = {
'Эспрессо': {'coffee': 1},
'Капучино': {"coffee": 1, "milk": 3},
'Макиато': {"coffee": 2, "milk": 1},
'Кофе по-венски': {"coffee": 1, "cream": 2},
'Латте Макиато': {"coffee": 1, "milk": 2, "cream": 1},
'Кон Панна': {"coffee": 1, "cream": 1}
}
in_stock = {}
def order(*drinks):
global in_stock, RECIPES
for drink in drinks:
if all(ingredient in in_stock and RECIPES[drink][ingredient] <= in_stock[ingredient] for ingredient in RECIPES[drink]): # noqa
for ingredient, amount in RECIPES[drink].items():
in_stock[ingredient] -= amount
return drink
return "К сожалению, не можем предложить Вам напиток"