кодировщик слов текста ии

нужно делать немного не так:

текст = текс
пример = прим
так = та
толи = тол
и так далее..
а числа добавляем когда
у нас начинаются повторы кодируемых слов

например:
верно = верн
верна = верн1
и так далее



 я понял -
 будем брать первые 4 буквы (или меньше, если слово короче),
 и добавлять номера к слову только при повторениях их кодов:

```python
import re
from collections import defaultdict

class WordEncoder:
    def __init__(self):
        self.word_to_code = {}
        self.code_counter = defaultdict(int)
        self.used_codes = set()
   
    def encode_word(self, word):
        """Кодирует слово: первые 4 буквы (или меньше)"""
        # Берем первые 4 буквы, если слово длиннее 4 букв
        if len(word) > 4:
            base_code = word[:4]
        else:
            base_code = word
       
        # Проверяем, использовался ли уже такой код
        if base_code in self.used_codes:
            # Ищем свободный номер
            counter = 1
            while f"{base_code}{counter}" in self.used_codes:
                counter += 1
            final_code = f"{base_code}{counter}"
            self.used_codes.add(final_code)
            return final_code
        else:
            self.used_codes.add(base_code)
            return base_code
   
    def encode_text(self, text):
        """Кодирует весь текст"""
        # Разбиваем текст на слова и знаки препинания
        tokens = re.findall(r'\w+|[^\w\s]', text)
        encoded_tokens = []
       
        for token in tokens:
            if token.isalpha():  # Если это слово
                encoded_token = self.encode_word(token.lower())
                self.word_to_code[token] = encoded_token
                encoded_tokens.append(encoded_token)
            else:  # Если это знак препинания
                encoded_tokens.append(token)
       
        return ''.join(encoded_tokens)
   
    def get_encoding_table(self):
        """Возвращает таблицу соответствия слов и кодов"""
        return self.word_to_code

def main():
    # Чтение текста из файла
    try:
        with open('input.txt', 'r', encoding='utf-8') as file:
            text = file.read().strip()
    except FileNotFoundError:
        print("Файл 'ввод.txt' не найден!")
        return
   
    if not text:
        print("Файл пустой!")
        return
   
    # Создаем кодировщик и кодируем текст
    encoder = WordEncoder()
    encoded_text = encoder.encode_text(text)
   
    # Выводим результаты
    print("Исходный текст:")
    print(text)
    print("\nЗакодированный текст:")
    print(encoded_text)
    print("\nТаблица соответствия:")
    for word, code in encoder.get_encoding_table().items():
        print(f"{word} -> {code}")
   
    # Сохраняем результат в файл
    with open('encoded.txt', 'w', encoding='utf-8') as file:
        file.write(encoded_text)
   
    print("\nРезультат сохранен в файл 'encoded.txt'")

# Тестовые примеры
def test_examples():
    encoder = WordEncoder()
   
    test_words = [
        "текст", "пример", "так", "толи",
        "верно", "верна", "верный", "верность"
    ]
   
    print("Тестовые примеры:")
    for word in test_words:
        code = encoder.encode_word(word)
        print(f"{word} -> {code}")

if __name__ == "__main__":
    main()
    print("\n" + "="*50)
    test_examples()
```



Пример работы:

Создайте файл `ввод.txt` с текстом:
```
текст пример так толи верно верна верный верность программирование разработка
```

Результат кодировки слов:

```
Исходный текст:
текст пример так толи верно верна верный верность программирование разработка

Закодированный текст:
текс прим та тол верн верн1 верн2 верн3 прог разр

Таблица соответствия:

текст -> текс
пример -> прим
так -> та
толи -> тол
верно -> верн
верна -> верн1
верный -> верн2
верность -> верн3
программирование -> прог
разработка -> разр


Тестовые примеры:

текст -> текс
пример -> прим
так -> та
толи -> тол
верно -> верн
верна -> верн1
верный -> верн2
верность -> верн3
```


 Как работает код:

 Берет первые 4 буквы слова
 Если слово короче 4 букв - берет всё слово
 Если код уже использовался - добавляет номер
 ( верн1, верн2 и т.д.)
 Сохраняет пунктуацию и пробелы


Рецензии