Помогите решить задачу на Python (Дешифратор II)
Код и условия задачи представлены ниже. Проблема: код ничего не выводит. В чём ошибка?
Задача 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. Выходные данные для двух последовательных блоков должны быть разделены пустой строкой.
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()