这是我的任务:
编写一个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("Your scrambled alphabet is: ", end = "")
for num in range (26):
print(chr(decrypt[num]), end = "")
print()
print()
msg = input("Now input your scrambled message: ")
print()
print()
alphabet = 65
for s in range (26):
decrypt[s] = (alphabet)
alphabet = alphabet + 1
print("The unscrambled alphabet is: ", end = "")
for num in range (26):
print(chr(decrypt[num]), end = "")
print()
print()
print("Your unscrambled message reads: ")
for alpha in msg.upper():
if alpha < "A" or alpha > "Z":
print(alpha, end="")
else:
ord_alpha = ord(alpha)
print (chr(decrypt[ord_alpha - 65]), end = "")
Ex:Scrambled Alphabet = XQHAJDENKLTCBZGUYFWVMIPSOR,乱序消息= VNKW KW BO 1WV WJHFJV BJWWXEJ!
一切正常,直到我到达最后一个打印语句,其中说明未加扰的消息与加扰的消息相同。我知道这些指令需要一个while循环,但我无法弄清楚如何使用一个来解码字母表。
任何助手?
答案 0 :(得分:2)
好吧,正如已经注意到的那样,你正在破坏你的decrypt
变量。
但是,您也没有正确构建从“乱码”字母到正常字母的映射。
在不使用基本迭代而不是列表和简单列表函数(index()
)的情况下解密可能看起来像这样:
cleartext = ""
for c in msg:
if c in alphabet:
pos = alphabet.index(c)
cleartext += string.ascii_uppercase[pos]
else:
cleartext += c
它不仅可以修补您的代码,还可以从一些改进中获益。我认为这可能是家庭作业,你可能不会想到这么远,但IMO无论如何学习它都没有错。
如果我必须在没有translate
的情况下做你正在做的事情(见下文),我可能会做这样的事情(只是一个简单的例子,可能会通过一些工作得到改善):
import string
def validate(alpha):
# Is it exactly 26 characters long?
if len(alpha) != 26: return False
for c in alpha:
# Is every character in [A-Z]?
if c not in string.ascii_uppercase: return False
# Is this character duplicated?
if alpha.count(c) > 1: return False
return True
alphabet = ""
while not validate(alphabet):
alphabet = input("Please input the encryption alphabet in order (only A-Z"
" allowed, with no duplicates): ")
msg = input("Now input your encrypted message: ")
print("Your encrypted alphabet is:", alphabet)
print("Your encrypted message is:", msg)
# Create a mapping from one alphabet to the other using a dictionary
table = dict(zip(alphabet, string.ascii_uppercase))
cleartext = "".join([table[c] if c in table else c for c in msg])
print("Your decrypted message reads:", cleartext)
最后,您也可以使用Python的内置字符串翻译来完成此操作,如下所示:
import string
# read and validate alphabet
# read message
print(str.translate(message, str.maketrans(alphabet, string.ascii_uppercase)))
答案 1 :(得分:1)
在你把所有乱码信写入其中后,你正在破解解密:
crypt = ["*"] * 26
for s in range (26):
val = decrypt[s] - 65
crypt[val] = (s + 65)