2015-11-10 57 views
1
def rotated(n: int): 
    '''Returns a rotated letter if parameter is greater than 26''' 
    ALPHABET = 'abcdefghijklmnopqrstuvwxyz' 
    if n>= 26: 
     n %= 26 
    return ALPHABET[n:26] + ALPHABET[:n] 
assert rotated(0) == 'abcdefghijklmnopqrstuvwxyz' 
assert rotated(26) == 'abcdefghijklmnopqrstuvwxyz' 

上面的函数是重置字母,如果给定的整数等于大于26(所以字母z与键1将等于a)。通过蛮力解码密文

def Caesar_decrypt(text: str, key: int) -> str: 
    '''Returns a decryption of parameter text and key''' 
    text = text.lower() 
    key_to_zero = str.maketrans(rotated(key),rotated(0)) 
    return text.translate(key_to_zero) 
assert Caesar_decrypt('Cat', 29) == Caesar_decrypt('Cat', 3) 
assert Caesar_decrypt('Good night', 0) == 'good night' 

Caesar_decrypt然后采用旋转的函数来解密一个给定的文本字符串。但是,我试图解密给定的文本没有一个键,这将是我的下一个功能:Caesar_break。

word = open('wordlist.txt', 'r') 
dictionary = word.readlines() 
def Caesar_break(code: str) -> str: 
    alist = [] 
    for x in range(26): 
     a = Caesar_decrypt(code, x) 
     alist += a 
    for i in dictionary: 
     if i in alist: 
      return i 

***注意:wordlist.txt只是一个包含所有字典单词的文档。请参阅http://www.ics.uci.edu/~kay/wordlist.txt。所以我想知道为什么当我测试出Caesar_break代码时,shell窗口不会返回任何东西。我如何修复代码?谢谢!

如果我的话令人困惑,这是该函数如何工作的例子:

Caesar_decrypt('mjqqt', 5) == 'hello' 

使用Caesar_break,上面的表述看起来像:

Caesar_break('mjqqt') == 'hello' 

(都等于到'你好')

换句话说,我需要Caesar_break解码消息没有那里5。

+0

原谅我,如果我只是被真正愚蠢的权利,但我从来没有见过蟒蛇明确的参数/返回类型的声明......比 –

+0

其他,你有Caesar_break'的'里面缩进问题。我认为'范围(26)中的x:'是错误缩进的?你也知道'wordlist.txt'是一个巨大的文件,所以'我在字典'循环中可能会运行很长时间.... –

+0

是的,当我将代码粘贴到stackoverflow上时,意外地添加了四个空格,谢谢。至于wordlist文件,有没有办法让代码在没有循环的情况下工作那么多时间? –

回答

0

与您的版本不同,我只是更改了一些内容,如果在for-in内找到该单词,我们将返回该单词。请注意,我没有资本实现公约的方法。

with open('wordlist.txt') as words: 
    dictionary = frozenset(map(str.strip, words)) 

def caesar_break(code: str): 
    for x in range(26): 
     word = caesar_decrypt(code, x) 

     if word in dictionary: 
      return word 
+0

嗯,当我尝试这个时,shell也不会返回任何内容。 –

+0

@RamonHallan,你的'dictionary'中是否有这个单词?是否有可能没有正确解析'dictionary'? –

+0

A'asia在字典中,是的,但是当我再次尝试复制你的确切代码时,它没有再返回任何东西。 –