2012-02-25 4 views
2

Я начинаю заниматься программированием и 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)) 

ответ

3

Проблема сводится к этой линии:

if words in getTranslatedMessage('decrypt', message, key).split(): 

Вы не можете сравнить списки так:

>>> a = [1,2,3] 
>>> b = [2,3,4] 
>>> if a in b: 
...  print ("yep!") 
... 
>>> 

if words in somelist проверяет, ли слова: элемент of somelist. Например:

>>> a in b 
False 
>>> a in [[1,2,3],4,5] 
True 

У вас есть другие альтернативы.

>>> if set(a).intersection(b): 
...  print("yep!") 
... 
yep! 
>>> if any(i in b for i in a): 
...  print("also yep, but slow") 
... 
also yep, but slow 
>>> bset = set(b) 
>>> if any(i in bset for i in a): 
...  print("still yep, not so bad") 
... 
still yep, not so bad 

и так далее, с различными уровнями эффективности. У наборов очень быстрые тесты на членство, поэтому обычно лучше использовать их, если производительность является проблемой. Первая из них может принимать шаги len (a) * len (b). После фиксации этого (и изменения скотины принять сообщение аргумента), я считаю, что ваш код дает:

>>> m = getTranslatedMessage("d", "this may work", 17) 
>>> print(m) 
cqrb vjh fxat 
>>> brute(m) 
this may work 

который я думаю, что вы хотели.

+0

Когда я попробовал метод .intersection, он распечатал огромное количество результатов. Я добавил в начале программы печать (набор слов) в начале программы, чтобы узнать, почему и вот что напечатано: {'a', '', 'b', 'e', ​​'d', 'i ',' h ',' m ',' o ',' n ',' s ',' r ',' u ',' t ',' w ',' y '} Почему это не то, что в моем списке? Я попробую любой метод, спасибо, спасибо! – tehstone

+0

@tehstone: это произойдет, если вы не назовете '.split()' словами. Если вы зададите одну длинную строку, тогда она делает набор из всех букв.Вы хотите, чтобы слова были списком строк, а не одной длинной строкой. – DSM

+0

изменить: прочитайте код выше ... здесь не так хорошо работает. Да, я понял, что это была строка, а не список. я сделал это список, но я все еще не могу заставить пересечение работать ... вот что у меня есть сейчас. Защита скотина(): для ключа в диапазоне (1, MAX_KEY_SIZE + 1): если установлено (getTranslatedMessage ('расшифровывать', сообщение, ключ)) пересечение (words_set). печати (getTranslatedMessage ('расшифровывать', message, key)) – tehstone

Смежные вопросы