Специализированные структуры данных и потоковая обработка

Коллекции стандартной библиотеки: deque, Counter, defaultdict и ChainMap

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

0 / 1 баллов

Обратный индекс вызовов

Сервисы в системе постоянно обращаются к внешним ресурсам: базам данных, очередям сообщений и кэшам. Журнал вызовов хранит пары «вызывающий сервис — целевой ресурс». Чтобы оценить зависимость системы от конкретных хранилищ, нужно составить обратную карту: для каждого ресурса собрать список всех сервисов, которые к нему обращаются.

Что уже дано

Готовый скрипт считывает входную строку JSON через sys.stdin.read(), вызывает функцию build_reverse_index и выводит результат в формате JSON в sys.stdout.

Что нужно сделать

Напишите тело функции build_reverse_index(calls: list[list[str]]) -> dict[str, list[str]].

Функция принимает список calls, элементами которого являются списки из двух строк вида [service_name, target_resource], где service_name — имя вызывающего сервиса, а target_resource — имя целевого ресурса.

Правила формирования результата:

  • Ключами возвращаемого словаря должны стать все целевые ресурсы, упомянутые в calls, и только они.
  • Значением для каждого ресурса должен быть список уникальных имён сервисов, обращавшихся к нему.
  • Имена сервисов в списке для каждого ресурса должны быть отсортированы по возрастанию (лексикографически).
  • Повторные обращения одного и того же сервиса к ресурсу не должны дублироваться в итоговом списке.
  • Порядок пар во входных данных не должен влиять на состав и сортировку итогового списка сервисов.
  • Если список calls пуст, функция должна вернуть пустой словарь {}.

Ввод и вывод

Программа взаимодействует с окружением через стандартные потоки stdin и stdout.

Формат ввода

В стандартный ввод передаётся JSON-массив пар строк вида [[service, resource], ...]. Если передан пустой список, на вход поступает валидный JSON вида [].

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

В стандартный вывод выводится одна JSON-строка со словарём вида {"resource": ["caller", ...], ...}, ключи которого упорядочены по возрастанию.

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

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

Проверяется тестами (1)
  • Тест 1
    Ввод
    [["auth", "postgres-main"], ["orders", "postgres-main"], ["auth", "redis-cache"], ["orders", "kafka-events"], ["auth", "postgres-main"]]
    Ожидаемый вывод
    {"kafka-events":["orders"],"postgres-main":["auth","orders"],"redis-cache":["auth"]}
Решение
Как проверяется решение

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

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

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

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

О переписке

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

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

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