
Добавил:
KaFaka
t.me
Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ЛР2 / LR2
.pyfrom 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