Генератор с 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 жя
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Send() до первого next(): ошибка запуска генератора Python
- Генератор с send() на Python: накопление порций и смена лимита
- Учёт трафика через генератор Python: сумма и динамический лимит
- Генератор Python: фильтрация выбросов с изменяемым порогом
- Генератор Python: центрирование данных в скользящем окне
- Генератор с состоянием Python: реализуйте переключатель с гистерезисом
