Введение в AI-агентов и продакшн-подход

Что такое AI-агент и чем он отличается от чат-бота

Содержание курса

0 / 1 баллов

Порядок вызовов с зависимостями

Модель вернула сразу несколько заявок на вызов инструментов, и часть из них зависит друг от друга: письмо нельзя отправить, пока не посчитано число, а число не посчитать, пока не выяснена структура таблицы. Порядок исполнения придётся выстраивать вашему коду.

Это топологическая сортировка, а конкретно — алгоритм Кана. Идея простая: держим счётчик невыполненных зависимостей у каждого вызова, берём любой вызов с нулевым счётчиком, исполняем и уменьшаем счётчики у тех, кто его ждал. Если в какой-то момент готовых нет, а вызовы остались, значит зависимости замкнулись в кольцо и порядка не существует.

Задание

Реализуйте функцию plan_calls(count, deps). Вызовы пронумерованы от 1 до count. Список deps состоит из пар (u, v), каждая означает: вызов u должен быть исполнен раньше вызова v.

Верните список номеров в допустимом порядке исполнения. Порядок должен быть единственным, поэтому зафиксируем правило выбора: если готовых к исполнению вызовов несколько, всегда берите тот, у которого меньше номер. Если зависимости образуют цикл и порядка не существует, верните None.

Пример

plan_calls(4, [(1, 2), (1, 3), (2, 4), (3, 4)])  # [1, 2, 3, 4]
plan_calls(3, [(3, 1)])                          # [2, 3, 1]
plan_calls(2, [(1, 2), (2, 1)])                  # None

Во втором примере вызов 2 идёт первым: он готов сразу, а его номер меньше, чем у тройки, которая тоже готова.

Примечание

Зависимостей может не быть вовсе — тогда ответ это просто номера по возрастанию. Повторяющиеся пары в deps возможны, и каждую нужно учитывать отдельно: две одинаковые пары дают счётчику значение два. Петля вида (u, u) — это цикл, ответ None.

Разрешена только стандартная библиотека Python 3.12; для выбора наименьшего готового номера удобен модуль heapq. Вызовов может быть до 200 000, поэтому решение должно быть линейным по размеру входа.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (1)
  • Примеры из условия
    assert plan_calls(4, [(1, 2), (1, 3), (2, 4), (3, 4)]) == [1, 2, 3, 4], \
        "пример из условия: ромб с единственным порядком по правилу минимума"
    assert plan_calls(3, [(3, 1)]) == [2, 3, 1], \
        "пример из условия: двойка готова сразу и имеет меньший номер"
    assert plan_calls(2, [(1, 2), (2, 1)]) is None, \
        "пример из условия: цикл из двух вызовов"
РешениеPython · Python 3.12 (basic)
Как проверяется решение

Проверяются функции и их результаты. Собственный запуск выполняет ваш код без авторских тестов. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

Отправьте решение, чтобы увидеть результаты тестов.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.