Войти Регистрация
Код-ревью

39. Слоты доставки к точному времени в Яндекс Лавке

Лёгкая

Python · 29 строк

Покупатель выбирает получасовой слот доставки на сегодня: с 8:00 до 23:00 по местному времени лавки, не раньше чем через час от текущего момента. В слот курьеры успевают отвезти 12 заказов.

booked — словарь «начало слота → число заказов» из кэша, store.timezone — пояс лавки вроде Asia/Yekaterinburg. Серверы работают по Москве. Отметьте строки с ошибками.

В работе: Экран оформления заказа в Лавке: блок «Доставить к времени».

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
datetimeчасовые поясаграничные условияизменяемые значения по умолчанию

Источник: наша задача на данных Яндекс Лавки: доставка к удобному времени. Условие пересказано своими словами.

  1. from datetime import datetime, timedelta
  2. SLOT_MINUTES = 30
  3. OPEN_HOUR = 8
  4. CLOSE_HOUR = 23
  5. MAX_ORDERS_PER_SLOT = 12
  6. MIN_LEAD = timedelta(hours=1)
  7. def slot_label(start: datetime) -> str:
  8. end = start + timedelta(minutes=SLOT_MINUTES)
  9. return f"{start:%H:%M}–{end:%H:%M}"
  10. def available_slots(store, booked: dict = {}) -> list:
  11. """Слоты на сегодня с шагом 30 минут, не раньше чем через час от текущего времени."""
  12. now = datetime.now()
  13. first = now.replace(minute=0, second=0, microsecond=0) + MIN_LEAD
  14. last = now.replace(hour=CLOSE_HOUR, minute=0, second=0, microsecond=0)
  15. slots = []
  16. t = first
  17. while t < last:
  18. if t.hour >= OPEN_HOUR:
  19. key = t.strftime("%H:%M")
  20. if booked.get(key, 0) <= MAX_ORDERS_PER_SLOT:
  21. slots.append(slot_label(t))
  22. t += timedelta(minutes=SLOT_MINUTES)
  23. booked.setdefault("shown_at", now)
  24. return slots