Добавил:
t.me Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР2 / LR2

.py
Скачиваний:
2
Добавлен:
18.06.2024
Размер:
5.62 Кб
Скачать
from collections import Counter
import string
import random

def generate_russian_lowercase():
    return [chr(code) for code in range(ord('а'), ord('я')+1) if chr(code) not in ['ё', 'й', 'ъ']]

def generate_additional_symbols():
    # Генерация дополнительных символов до достижения примерно 650 символов
    additional_symbols = "!@#$%^&*()_+-=[]{};':\",.<>/?|`~" + \
                         "".join(generate_russian_lowercase()) + \
                         "".join(chr(code) for code in range(128, 1024))
    # Преобразование строки в список для корректной конкатенации
    additional_symbols_list = list(additional_symbols)[:650 - len(string.ascii_letters + string.digits)]
    return additional_symbols_list

# Функция для подсчета частоты появления каждой буквы в тексте и создания маппинга
def generate_mapping(text):
    # Очистка текста от небуквенных символов и приведение к верхнему регистру
    text = ''.join(filter(str.isalpha, text.upper()))
    letter_counts = Counter(text)
    total_letters = sum(letter_counts.values())

    # Создание маппинга: количество замен равно половине количества вхождений буквы в тексте
    mapping = {}
    base_symbols = list(string.ascii_letters + string.digits)  # Базовые символы для замены
    additional_symbols = generate_additional_symbols()  # Дополнительные символы в виде списка
    symbols = base_symbols + additional_symbols  # Корректное объединение списков
    random.shuffle(symbols)

    for letter, count in letter_counts.items():
        num_subs = count // 2  # Используем целочисленное деление для получения половины количества вхождений
        if num_subs < 1:
            num_subs = 1  # Гарантируем, что у каждой буквы будет хотя бы один символ замены

        if len(symbols) < num_subs:
            raise ValueError("Недостаточно символов для замены. Расширьте список доступных символов.")

        # Выбор символов для замены и удаление их из списка доступных символов
        mapping[letter] = [symbols.pop() for _ in range(num_subs)]

    print(f"Всего символов в тексте: {total_letters}")
    return mapping

# Пример использования
text = "ЕСЛИВАМНАСАМОМДЕЛЕХОЧЕТСЯУСЛЫШАТЬЭТУИСТОРИЮВЫНАВЕРНОПРЕЖДЕВСЕГОЗАХОТИТЕУЗНАТЬГДЕЯРОДИЛСЯКАКПРОВЕЛСВОЕДУРАЦКОЕДЕТСТВОЧТОДЕЛАЛИМОИРОДИТЕЛИДОМОЕГОРОЖДЕНИЯСЛОВОМВСЮЭТУДАВИДКОППЕРФИЛДОВСКУЮМУТЬНОПОПРАВДЕГОВОРЯМНЕНЕОХОТАВЭТОМКОПАТЬСЯВОПЕРВЫХСКУЧНОАВОВТОРЫХУМОИХПРЕДКОВНАВЕРНОСЛУЧИЛОСЬБЫПОДВАИНФАРКТАНАБРАТАЕСЛИБЯСТАЛБОЛТАТЬПРОИХЛИЧНЫЕДЕЛАОНИЭТОГОТЕРПЕТЬНЕМОГУТОСОБЕННООТЕЦВООБЩЕТООНИЛЮДИСЛАВНЫЕЯНИЧЕГОНЕГОВОРЮНООБИДЧИВЫЕДОЧЕРТИКОВДАЯИНЕСОБИРАЮСЬРАССКАЗЫВАТЬСВОЮАВТОБИОГРАФИЮИВСЯКУЮТАКУЮЧУШЬПРОСТОРАССКАЖУТУСУМАСШЕДШУЮИСТОРИЮКОТОРАЯСЛУЧИЛАСЬПРОШЛЫМРОЖДЕСТВОМАПОТОМЯЧУТЬНЕОТДАЛКОНЦЫИМЕНЯОТПРАВИЛИСЮДАОТДЫХАТЬИЛЕЧИТЬСЯЯИЕМУДБТОЛЬКОПРОЭТОИРАССКАЗЫВАЛАВЕДЬОНМНЕКАКНИКАКРОДНОИБРАТОНЖИВЕТВГОЛЛИВУДЕЭТОНЕОЧЕНЬДАЛЕКООТСЮДАОТЭТОГОТРЕКЛЯТОГОСАНАТОРИЯОНЧАСТОКОМНЕЕЗДИТПОЧТИКАЖДУЮНЕДЕЛЮИДОМОИОНМЕНЯСАМОТВЕЗЕТМОЖЕТБЫТЬДАЖЕВБУДУЩЕММЕСЯЦЕКУПИЛСЕБЕНЕДАВНОЯГУАРАНГЛИИСКАЯШТУЧКАМОЖЕТДЕЛАТЬДВЕСТИМИЛЬВЧАСВЫЛОЖИЛЗАНЕЕЧУТЬЛИНЕЧЕТЫРЕТЫСЯЧИДЕНЕГУНЕГОТЕПЕРЬКУЧАНЕТОЧТОРАНЬШЕРАНЬШЕКОГДАОНЖИЛДОМАОНБЫЛНАСТОЯЩИМПИСАТЕЛЕММОЖЕТСЛЫХАЛИЭТООННАПИСАЛМИРОВУЮКНИЖКУРАССКАЗОВСПРЯТАННАЯРЫБКАСАМЫИЛУЧШИИРАССКАЗТАКИНАЗЫВАЛСЯСПРЯТАННАЯРЫБКАТАМПРООДНОГОМАЛЬЧИШКУКОТОРЫИНИКОМУНЕПОЗВОЛЯЛСМОТРЕТЬНАСВОЮЗОЛОТУЮРЫБКУПОТОМУЧТОКУПИЛЕЕНАСОБСТВЕННЫЕДЕНЬГИСУМАСОИТИКАКОИРАССКАЗАТЕПЕРЬМОИБРАТВГОЛЛИВУДЕСОВСЕМСКУРВИЛСЯЕСЛИЯЧТОНЕНАВИЖУТАКЭТОКИНОТЕРПЕТЬНЕМОГУ"
mapping = generate_mapping(text)

# Печать маппинга для проверки
for letter, symbols in mapping.items():
    print(f"{letter}: {symbols}")
Соседние файлы в папке ЛР2