Генератор с send() в Python: потоковая замена символов

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Генератор send в Python: задачи на состояние и управление потоком.

Потоковый транслитератор

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

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

Реализуйте сопрограмму транслитератора, которая возвращает обработанный текст при получении строки и размер новой таблицы при динамическом обновлении правил подстановки.

Что уже дано

В редакторе представлена заготовка функции-генератора transliterator(table) с кодом заглушки. Вспомогательные классы и функции для проверки работы сопрограммы уже доступны в окружении при тестировании, реализовывать их заново не требуется.

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

Реализуйте функцию-генератор transliterator(table).

Параметр table принимает словарь или объект подкласса dict (от 0 до 1000 записей), где ключи — одиночные символы Unicode, а значения — строки длиной от 0 до 20 символов (поддерживаются и подклассы str). После передачи таблица вызывающей стороной не модифицируется.

Генератор возвращается неинициализированным и работает по следующим правилам:

  • Первый шаг активации (вызов next() или .send(None)) выполняет прайминг и возвращает None.
  • После прайминга сопрограмма готова принимать сообщения через .send() (от 0 до 1000 сообщений на один генератор).
  • Если через .send(word) передана строка (длиной от 0 до 10 000 символов):
  • Сопрограмма применяет активную таблицу подстановок к исходным символам строки ровно один раз.
  • Символы, отсутствующие в текущей таблице, остаются без изменений.
  • Подстановки могут быть пустыми или содержать несколько символов; получившийся замещающий текст повторной транслитерации не подвергается.
  • Регистр и кодовые точки Unicode сохраняются, если для них нет явного правила в таблице (нормализация или приведение регистра не выполняются).
  • Результатом шага должна быть строка (str или совместимый строковый объект).
  • Если через .send(new_table) передан словарь (по тем же правилам, что и начальный table):
  • Текущая таблица замен полностью замещается новой.
  • На этом шаге транслитерация текста не производится.
  • Сопрограмма возвращает точное количество записей в новой таблице в виде целого числа (int, включая 0).
  • Если передан пустой словарь, все последующие слова вплоть до следующей замены таблицы возвращаются без изменений.
  • Генератор поддерживает стандартный жизненный цикл нативных генераторов Python: корректную обработку вызовов .close() и .throw().
  • Несколько созданных экземпляров генератора (от 1 до 3) должны работать полностью независимо друг от друга при чередовании вызовов.

Ввод и вывод

Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля функцию верхнего уровня transliterator и вызывает её с проверочными аргументами.

Пример использования

converter = transliterator({'ж': 'zh', 'я': 'ya'})
print(next(converter))
print(converter.send('жук!'))
print(converter.send({'ж': 'J'}))
print(converter.send('жя'))
print(converter.send({}))
print(converter.send('жя'))
converter.close()

Вывод:

None
zhук!
1
Jя
0
жя
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

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

Связанные задачи