我正在制作这款Caesar Cipher解码器,并且我希望程序打印每个选项(可以转换的26种方式)。但是,当我运行代码时,什么都没有显示,这是我的错误。如果您知道,请告诉我,我是编码的新手,需要帮助。
import sys
import time
L2I = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ",range(26)))
I2L = dict(zip(range(26),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
msg = ("What is the intercepted message \n")
for character in msg:
sys.stdout.write(character)
sys.stdout.flush()
time.sleep(0.1)
msg_ans = input("> ")
msg_ans = msg_ans.strip()
shift = 0
def decipher(msg_ans,shift):
while shift < 26:
for i in msg_ans.upper():
if i.isalpha() == True :
msg_ans += I2L[ (L2I[i]+ shift)%26 ]
shift += 1
else:
msg_ans += i
shift += 1
print (msg_ans)
decipher(msg_ans,shift)
我希望它能输出26种可以移动的方式。但是,当我使用“ Hello”一词时,我得到的是“ HelloHFNOSMKSTXRQZBGWUCDHBAJLQLKTVAVVFIO”,而不是“ IFMMP JGNNQ ...”
答案 0 :(得分:0)
味精应该是这样的
msg = "What is the intercepted message \n"
您可能还想在这里打印而不是返回
return msg_ans
答案 1 :(得分:0)
有两个问题。首先,每次检查单个字符时,您就递增shift
。实际上,您只想在每次循环遍历消息后增加它。您还应该将初始化移动到函数中。没有理由传递shift
,因为您只是按顺序尝试了所有26种可能性。
def decipher(msg_ans):
shift = 0
while shift < 26:
for i in msg_ans.upper():
if i.isalpha() == True :
msg_ans += I2L[ (L2I[i]+ shift)%26 ]
else:
msg_ans += i
shift += 1
print (msg_ans)
但是,在这一点上,没有理由使用while
循环而不是for
:
def decipher(msg_ans):
for shift in range(26):
for i in msg_ans.upper():
if i.isalpha() == True :
msg_ans += I2L[ (L2I[i]+ shift)%26 ]
else:
msg_ans += i
print (msg_ans)
另一个问题是,您只是将新字符附加到输入字符串的末尾。您没有指定您实际想要的形式,所以假设您希望在字符串列表中使用它。您需要初始化列表,在每次迭代时构建一个临时字符串,然后将临时字符串附加到列表中:
def decipher(msg_ans):
possible_messages = []
for shift in range(26):
decoded_msg = ''
for i in msg_ans.upper():
if i.isalpha() == True :
decoded_msg += I2L[ (L2I[i]+ shift)%26 ]
else:
decoded_msg += i
possible_messages.append(decoded_msg)
return possible_messages
然后仅打印调用该函数的结果:
print(decipher(msg_ans))