def encode_word(word_to_encode: str, exchange_table: dict[str, list[str]]) -> str:
"""Превращение слова в тэг-загадку. Сначала вычисляем индекс, как остаток от деления
индекса буквы (начиная с 0) в исходном слове на 10. Букву заменяем словом из таблицы:
ключом будет исходная буква, а индексом в таблице слов - полученный ранее индекс.
По завершении "оборачиваем" загадку в тэг.
Пример:
>>> print(encode_word("мир", TABLE_RU))
:param word_to_encode: Слово для кодирования
:param exchange_table: Таблица соответствия буквы в определенной позиции и слова-замены
:return:
"""
encoded_parts = []
original_indices_mod_10 = [(i % 10) for i, _ in enumerate(word_to_encode)]
for i, char_original in enumerate(word_to_encode.lower()):
if char_original not in exchange_table:
encoded_parts.append(f"({char_original}?)") # Символ не из алфавита
continue
if code_word:
encoded_parts.append(code_word)
else:
encoded_parts.append(f"({char_original}{slot_to_use}?)") # Слово не найдено
riddle = "-".join(encoded_parts)
return f''
def decode_word(tag: str) -> str:
"""Расшифровка загадки, закодированной encode_word
Буква с индексом N в декодированном слове это буква N-го кодового слова (счет с 0).
Какая именно буква, определяется как остаток от деления (N % 10) на длину слова
Пример:
>>> decode_word('')
мир
:param tag: Тэг с загадкой (Например -> мир)
:return:
"""
riddle = tag[tag.rfind('riddle="') + len('riddle="') : tag.rfind('"')]
words = riddle.split("-")
decoded = ""
for word_num, word in enumerate(words):
index = (word_num % 10) % len(word)
decoded += word[index]
return decoded
def batch_encode(
words: list[str], exchange_table: dict[str, list[str]]
) -> dict[str, str]:
"""Массово зашифровать теги загадок
Пример:
>>> batch_encode(["мир", "труд", "май"], TABLE_RU)
{'мир': '', 'труд': '', 'май': ''}
:param words: слова для кодирования
:param exchange_table: Таблица соответствия буквы в определенной позиции и слова-замены
:return: словарь слово -> тэг с загадкой
"""
encoded = {}
for word in words:
encoded[word] = encode_word(word, exchange_table)
return encoded