我的任务是创建一个凯撒密码解码器,它接受一个输入字符串,并使用字母频率找到最佳的字符串。如果不确定这句话的意思,请看下面的问题:
编写一个程序,完成以下操作。首先,应读取一行输入,这是加密消息,由大写字母和空格组成。您的程序必须尝试使用所有26个可能的移位值S来解码消息;从这26个可能的原始消息中,打印出具有最高好度的那个。 为了方便起见,我们将为您预定义变量letterGoodness,它是长度为26的列表,等于上面频率表中的值
我已经有了这段代码:
x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
y = ""
for i in S:
x = ord(i)
x += N
if x > ord('Z'):
x -= NUM_LETTERS
elif x < ord('A'):
x += NUM_LETTERS
y += chr(x)
return y
def GoodnessFinder(S):
y = 0
for i in S:
if x != 32:
x = ord(i)
x -= ord('A')
y += letterGoodness[x]
return y
def GoodnessComparer(S):
goodnesstocompare = GoodnessFinder(S)
goodness = 0
v = ''
for i in range(0, 26):
v = SpyCoder(S, i)
goodness = GoodnessFinder(v)
if goodness > goodnesstocompare:
goodnesstocompare = goodness
return v
y = x.split()
z = ''
for i in range(0, len(y)):
if i == len(y) - 1:
z += GoodnessComparer(y[i])
print(z)
编辑:按Cristian Ciupitu的建议进行更改
这个程序的工作原理如下:
- 获取输入并将其分割为列表
- 对于每个列表值,我都会将其提供给好度量查找器。
- 它获取字符串的好度,并将所有其他内容与之进行比较,当存在较高的好度时,它会将较高的好度作为要比较的好度。
- 然后,它将文本字符串向右移i个单位以查看好度是更高还是更低。
我不确定问题出在哪里,第一个测试:LQKP OG CV GKIJV DA VJG BQQ
显示正确的消息:JOIN ME AT AT BY THE ZOO
但是下一个测试:UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH
给出了一个垃圾字符串:SGHR HR Z RZLOKD KHMD NE SDWS ENQ CDBQXOSHMF
而实际上应该是:THIS IS A SAMPLE LINE OF TEXT FOR DECRYPTING
我知道我必须:
尝试每个移位值
获得单词的“好度”
返回具有最高好度的字符串。
希望我的解释有意义,因为我现在很困惑。
ord('A')
,将26替换为NUM_LETTERS
。顺便提一下,在“GoodnessComparer”中,你使用了range(0, 25)
而不是(0, 26)
,这是一个笔误还是故意的?另外一件事:在“GoodnessFinder”中,你不需要每次都执行“ord(i)”,只有当“i”是空格(' '
)时才需要。 - Cristian Ciupitustring
模块并使用len(string.ascii_uppercase)
。 - Cristian Ciupitu