我正在尝试用Python创建一个Ceaser Cipher函数,该函数会根据您输入的内容来移动字母。
plainText = input("Secret message: ")
shift = int(input("Shift: "))
def caesar(plainText, shift):
cipherText = ""
for ch in plainText:
if ch.isalpha():
stayInAlphabet = ord(ch) + shift
if stayInAlphabet > ord('z'):
stayInAlphabet -= 26
finalLetter = chr(stayInAlphabet)
cipherText += finalLetter
print(cipherText)
return cipherText
caesar(plainText, shift)
例如,如果我将“ 3月的想法”作为消息,而将1作为班次,则在输出“ UIF JEFT PG NBSDI”时将输出“ UIFJEFTPGNBSDI”。它不会保留空格,还会在应保持原样的情况下将诸如感叹号之类的内容移回原处。如果我将shift设置为3,字母也应该包含含义,X应该回到A。
答案 0 :(得分:0)
密码无法产生预期结果的原因是您的代码无法说明它不是字母非数字字母的情况。因此,一个潜在的解决方案就是增加对空格的处理。
代码
plainText = input("Secret message: ")
shift = int(input("Shift: "))
def caesar(plainText, shift):
cipherText = ""
for ch in plainText:
if ch.isalpha():
stayInAlphabet = ord(ch) + shift
if stayInAlphabet > ord('z'):
stayInAlphabet -= 26
finalLetter = chr(stayInAlphabet)
cipherText += finalLetter
elif ch is " ":
cipherText += " "
print(cipherText)
return cipherText
caesar(plainText, shift)
示例
Secret message: THE IDES OF MARCH
Shift: 1
UIF JEFT PG NBSDI
答案 1 :(得分:0)
要解决间距问题,可以在else
上添加if ch.isalpha()
,然后将纯文本字符附加到密文中。这还将处理标点符号和其他特殊的非字母字符。
要处理换行(例如,从X到A),您需要使用模运算符%
。由于A
是第65个ASCII字符而不是第0个字符,因此您需要将字母字符从零开始,然后应用mod,然后加回'A'的偏移量。要进行环绕切换,可以执行以下操作:final_letter = chr((ord(ch) + shift - ord('A')) % 26 + ord('A'))
。请注意,这26个字母来自拉丁字母中的字母数。
牢记这些,这是一个完整的示例:
plain_text = input("Secret message: ")
shift = int(input("Shift: "))
def caesar(plain_text, shift):
cipher_text = ""
for ch in plain_text:
if ch.isalpha():
final_letter = chr((ord(ch) + shift - ord('A')) % 26 + ord('A'))
cipher_text += final_letter
else:
cipher_text += ch
print(cipher_text)
return cipher_text
caesar(plain_text, shift)
样本输入:
plain_text = "THE IDES OF MARCH"
shift = 1
cipher_text = caesar(plain_text, shift)
print(cipher_text)
# UIF JEFT PG NBSDI