Я начинаю заниматься программированием и Python. Я сделал большую часть Learn Python Hard Way, и теперь я работаю над созданием собственных компьютерных игр с помощью Python.Проверьте сгенерированную строку на заданную строку в python
В книге «Изобретения» есть глава, в которой вы создаете простую программу шифрования, которая шифрует предоставленную пользователем фразу с использованием номера ключа для смещения кодов ASCII и использования этого номера ключа для decrpyt. Позже в этой главе добавлен метод дешифрования «грубой силы», который проходит через все 26 возможных переводов сообщения и печатает каждый из них.
Я хотел сделать еще один шаг и напечатать только правильно переведенное сообщение, а не просматривать все 26. Я создал строку с общими словами на английском языке и пробовал различные методы для проверки каждого сгенерированного вывода на эту строку. До сих пор я не мог найти какой-либо метод, который работает.
Вот код дешифровки: (отступ блоки являются правильными в IDLE, но не здесь.)
def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'): num -= 26
elif num < ord('A'): num += 26
elif symbol.islower():
if num > ord('z'): num -= 26
elif num < ord('a'): num += 26
translated += chr(num)
else: translated += symbol
return translated
поэтому, когда пользователь выбирает «грубую силу» режим и тип в сообщении, следующая функция называется:
def brute():
for key in range(1, MAX_KEY_SIZE + 1):
if words in getTranslatedMessage('decrypt', message, key).split():
print(getTranslatedMessage('decrypt', message, key))
и, наконец, вот список слов я проверяю против:
words = 'and is the but or not may in it why how who where'.split()
Редактировать: Вот что у меня есть сейчас. Она не работает ...
def brute():
for key in range(1, MAX_KEY_SIZE + 1):
if set(getTranslatedMessage('decrypt', message, key)).intersection(words_set):
print(getTranslatedMessage('decrypt', message, key))
Когда я попробовал метод .intersection, он распечатал огромное количество результатов. Я добавил в начале программы печать (набор слов) в начале программы, чтобы узнать, почему и вот что напечатано: {'a', '', 'b', 'e', 'd', 'i ',' h ',' m ',' o ',' n ',' s ',' r ',' u ',' t ',' w ',' y '} Почему это не то, что в моем списке? Я попробую любой метод, спасибо, спасибо! – tehstone
@tehstone: это произойдет, если вы не назовете '.split()' словами. Если вы зададите одну длинную строку, тогда она делает набор из всех букв.Вы хотите, чтобы слова были списком строк, а не одной длинной строкой. – DSM
изменить: прочитайте код выше ... здесь не так хорошо работает. Да, я понял, что это была строка, а не список. я сделал это список, но я все еще не могу заставить пересечение работать ... вот что у меня есть сейчас. Защита скотина(): для ключа в диапазоне (1, MAX_KEY_SIZE + 1): если установлено (getTranslatedMessage ('расшифровывать', сообщение, ключ)) пересечение (words_set). печати (getTranslatedMessage ('расшифровывать', message, key)) – tehstone