Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.04.2024
Сообщений: 5

Задача 3.3 (Дешифратор II)

30.04.2024, 21:11. Показов 1215. Ответов 9

Студворк — интернет-сервис помощи студентам
Код и условия задачи представлены ниже. Проблема: код ничего не выводит. В чём ошибка?

Задача 3.3 (Дешифратор II) PC/UVa IDs: 110304/850
Распространенный, но ненадежный метод шифровки текста состоит в перемене букв алфавита. Другими словами, каждая буква алфавита последовательно заменяется в тексте какой-то другой буквой. Чтобы шифровка была обратимой, никакие две буквы не заменяются одной и той же буквой. Мощным методом криптоанализа является атака с известным открытым текстом (known plain text attack). При атаке с известным открытым текстом дешифровщик знает фразу или предложение, зашифрованное противником, и путем изучения зашифрованного текста выясняет метод кодировки. Ваша задача - расшифровать несколько зашифрованных строк текста, полагая, что каждая строка использует один и тот же набор замещений и что одна из закодированных строк является шифровкой открытого текста the quick brown fox jumps over the lazy dog.

Входные данные
Входные данные начинаются со строки, содержащей одно положительное целое число, которое означает количество тестовых блоков, за которой следует пустая строка. Между двумя последовательными тестовыми блоками также находится пустая строка. Каждый блок состоит из нескольких строк входных данных, зашифрованных способом, описанным выше. Зашифрованные строки содержат только строчные буквы и пробелы, и их длина не превышает 80 символов. Число строк входных данных не превышает 100. Номер известной вам строки не известен вам заранее.

Выходные данные
Для каждого тестового блока расшифруйте каждую строку и напечатайте их в стандартный вывод. Если существует несколько различных вариантов дешифровки, то подойдет любой. Если расшифровка невозможна, выведите No solution. Выходные данные для двух последовательных блоков должны быть разделены пустой строкой.

Пример входных и выходных данных во вложении

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def read_input():
    num_blocks = int(input().strip())
    input()  # Пропускаем пустую строку
 
    blocks = []
    for _ in range(num_blocks):
        block = []
        line = input().strip()
        while line:
            block.append(line)
            line = input().strip()
        blocks.append(block)
 
        # Пропускаем пустую строку между блоками
        if _ < num_blocks - 1:
            input()
 
    return blocks
 
 
def decrypt(ciphertext, known_plaintext):
    decryption_dict = {}
 
    for encrypted_char, known_char in zip(ciphertext, known_plaintext):
        if encrypted_char not in decryption_dict:
            decryption_dict[encrypted_char] = known_char
        elif decryption_dict[encrypted_char] != known_char:
            return None
 
    decrypted_text = ''.join(decryption_dict.get(char, char) for char in ciphertext)
    return decrypted_text
 
 
def decrypt_blocks(blocks):
    known_plaintext = blocks[0][0]  # Первая строка первого блока - известный открытый текст
 
    for block in blocks[1:]:  # Начинаем с расшифровки второго блока
        for encrypted_string in block:
            decrypted_text = decrypt(encrypted_string, known_plaintext)
            if decrypted_text is not None:
                print(decrypted_text)
                break
        else:
            print("No solution")
 
        print()  # Печатаем пустую строку между блоками
 
 
def main():
    blocks = read_input()
    decrypt_blocks(blocks)
 
 
if __name__ == "__main__":
    main()
Миниатюры
Задача 3.3 (Дешифратор II)  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2024, 21:11
Ответы с готовыми решениями:

Задача на словари: шифратор/дешифратор
Сгенерировать словарь-шифратор, то есть словарь, где ключ и значение являются символами. Используя словарь, зашифровать/расшифровать...

SOS! написал программу тест-дешифратор , дешифратор работает но при запуске теста выдает ошибку LIST INDEX OUT OF BOUND
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

дешифратор
Составить программу, для вывода на экран декодированного текста, хранящегося в файле в зашифрованном виде. Шифровка осуществлялась...

9
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 1
02.05.2024, 17:17
ты узнал в чем ошибка в коде ?
0
0 / 0 / 0
Регистрация: 19.04.2024
Сообщений: 5
02.05.2024, 17:18  [ТС]
Нет
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
02.05.2024, 20:17
Цитата Сообщение от Airadarey Посмотреть сообщение
# Первая строка первого блока - известный открытый текст
С чего бы? Хоть бы на пример глянули
0
0 / 0 / 0
Регистрация: 19.04.2024
Сообщений: 5
02.05.2024, 20:50  [ТС]
ChatGPT писал код, признаюсь))
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
02.05.2024, 23:50
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def get_words_lens(s):
    return list(map(len, s.split()))
 
text = 'the quick brown fox jumps over the lazy dog'
n = int(input('n = '))
tests = []
d = {}
for _ in range(n):
    test = input('->')
    tests.append(test)
    if get_words_lens(test) == get_words_lens(text):
        d = dict(zip(list(test), list(text)))
 
if not d:
    print('No solution')
else:
    for test in tests:
        res = ''.join([d[symb] for symb in test])
        print(res)
# n = 3
# tests = [
#     'vtz ud xnm xugm itr pyy jttk gmv xt otgm xt xnm puk ti xnm fprxq',
#     'xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj',
#     'frtjrpgguvj otvxmdxd prm iev prmvx xnmq'
# ]
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
03.05.2024, 18:30
idealist, строки по длине могут и совпадать.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
03.05.2024, 18:49
Цитата Сообщение от Red white socks Посмотреть сообщение
строки по длине могут и совпадать
Ну, по условию
Цитата Сообщение от Airadarey Посмотреть сообщение
Если существует несколько различных вариантов дешифровки, то подойдет любой
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
03.05.2024, 19:22
idealist, попробуйте такой тест:
Python
1
2
3
4
5
# tests = [
#     'vtz ud xnm xugm itr pyy jttk gmv xt otgm xt xnm puk ti xnm fprxq',
#     'xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj',
#     'aaa aaaaa aaaaa aaa aaaaa aaaa aaa aaaa aaa'
# ]
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
03.05.2024, 21:03
Лучший ответ Сообщение было отмечено Airadarey как решение

Решение

Red white socks, да, мерси, это ошибка. Надо еще и соответствие мультимножеств проверять:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from collections import Counter
 
def get_words_lens(s):
    return list(map(len, s.split()))
 
text = 'the quick brown fox jumps over the lazy dog'
n = int(input('n = '))
tests = []
d = {}
for _ in range(n):
    test = input('->')
    tests.append(test)
    if get_words_lens(test) == get_words_lens(text) and list(Counter(test).values()) == list(Counter(text).values()):
        d = dict(zip(list(test), list(text)))
 
if not d:
    print('No solution')
else:
    for test in tests:
        res = ''.join([d[symb] for symb in test])
        print(res)
# n = 3
# tests = [
#     vtz ud xnm xugm itr pyy jttk gmv xt otgm xt xnm puk ti xnm fprxq
#     xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
#     aaa aaaaa aaaaa aaa aaaaa aaaa aaa aaaa aaa
# ]
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2024, 21:03
Помогаю со студенческими работами здесь

Дешифратор
Такая проблема: хочу написать программу, которая бы расшифровывала зашифрованный текст(без знаков препинания и на русском языке) методом...

Дешифратор
На компьютере поймал шифратор файлов и теперь все файлы с приветом. Помогите, кто может разобраться с этой проблемой, вся работа зависла....

Дешифратор
Всем доброго дня. Если сможете натолкните на путь истинный. У меня в текстовом файле есть такой кусочек значений ...

Дешифратор 4 to 10
Здравствуйте, если вас не затруднить, не подскажете ли какую схему лучше выбрать для преобразования нечётных чисел дешифратором 4 на 10?...

Дешифратор
lPaeesh le pemu mnxit ehess rtnisg! О, извините, это должно было быть: Пожалуйста, помогите мне распутать эти строки! Каким-то образом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru