这是我的任务: 编写一个DECRYPTS秘密消息的程序。
首先应该提示用户输入乱码字母。然后它应该要求秘密消息。最后,它输出未加扰的版本。
请注意,拼音字母输入正好为26个字符。所有字母字符都被翻译成它们的解码等价物(将采用WHILE循环),而所有其他非字母字符应该完全按原样输出而不进行翻译。
到目前为止,这是我的代码:
decrypt = ["*"] * 26
scram_alphabet = input("Please input the scrambled alphabet in order: ")
while len(scram_alphabet) != 26:
scram_alphabet = input("Please input the scrambled alphabet in order. The alphabet must have 26 characters: ")
num = 0
for each_letter in scram_alphabet:
decrypt[num] = ord(each_letter)
num = num + 1
print()
print()
msg = input("Now input your scrambled message: ")
print()
print()
num = 0
alphabet = [" "] * 26
for letter in range (26):
alphabet[letter] = letter + 65
while num < 26:
alphabet [num] = decrypt [num]
print(chr(alphabet[num]))
num = num + 1
for alpha in msg.upper():
if alpha < "A" or alpha > "Z":
print(alpha,end="")
else:
print(chr(decrypt[ ord(alpha) - 65 ]), end="")
我似乎无法弄清楚如何使用while循环解扰字母表。
目前,如果我输入'XQHAJDENKLTCBZGUYFWVMIPSOR'作为字母和'VNKW KW BO 1WV WJHFJV BJWWXEJ!'作为秘密消息,程序打印出乱码字母和“未加扰”的消息,其中显示“IZTP TP QG 1PI PLNDLI QLPPSJL!”。解读的消息实际上是“这是我的第一封秘密消息!”
任何助手?
答案 0 :(得分:3)
您正在以错误的方向进行映射。例如,让我们取第一个字母。 V应该变成T,但为什么呢?
答案是因为V在字母表中占据的位置是T通常占据的位置。相反,你正在寻找V将在字母表中占据的位置,并在那个字母中替换,这就是我。
简而言之,您当前的程序是一个扰码器,而不是一个解扰器,因此您只是第二次扰乱该消息。例如,如果我使用相同的字母,而是提供原始邮件,我得到的结果与您提供的加扰邮件相同:
Please input the scrambled alphabet in order: 'XQHAJDENKLTCBZGUYFWVMIPSOR'
Now input your scrambled message: 'THIS IS MY 1ST SECRET MESSAGE!'
VNKW KW BO 1WV WJHFJV BJWWXEJ!
这是问题:
decrypt[num] = ord(each_letter)
相反,您需要以相反的方向构建地图:
decrypt[ord(each_letter) - 65] = num + 65
现在该计划有效:
Please input the scrambled alphabet in order: 'XQHAJDENKLTCBZGUYFWVMIPSOR'
Now input your scrambled message: 'VNKW KW BO 1WV WJHFJV BJWWXEJ!'
THIS IS MY 1ST SECRET MESSAGE!
答案 1 :(得分:0)
据我所知,看起来你的脚本运行正常。解读的消息似乎不是“这是我的第1封秘密消息!”
以下是我使用您的字母表进行的一些手动翻译:
Key: XQHAJDENKLTCBZGUYFWVMIPSOR
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Original: VNKW KW BO 1WV WJHFJV BJWWXEJ!
Translated: IZTP ...
看起来你需要一个不同的例子来测试,或者我可能误解了加扰的执行方式。