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,则上述函数将重置字母表(因此带键1的字母z等于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)
与你的版本没那么不同,我只是改变了一些东西,如果在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