我试图制作一个VigenèreCipher但我似乎无法找到一种方法来实现一个功能,在输入消息时忽略输入的空格,然后打印最终的例子:我输入起始消息:“ python计算“然后我输入密钥为:”stack“如果程序忽略原始消息中的空格,我希望得到:”isukzg wppannjqr“但我得到:”isukzgwppannjqr“。任何人都知道如何解决这个问题。我考虑过使用ords,但我还没有找到实现它的方法。代码如下:
def translateMessage(key, message, mode):
translated = ""
keyIndex = 0
key = key.upper()
for symbol in message:
xyz = alphabet.find(symbol.upper())
if xyz != -1:
if mode == 'encrypt' or 'e':
xyz += alphabet.find(key[keyIndex]) + 1
elif mode == 'decrypt' or 'd':
xyz -= alphabet.find(key[keyIndex]) + 1
xyz %= len(alphabet)
if symbol.isupper():
translated += alphabet[xyz]
elif symbol.islower():
translated += alphabet[xyz].lower()
keyIndex += 1
if keyIndex == len(key):
keyIndex = 0
return translated
if __name__ == '__main__':
fetch_user_inputs()
答案 0 :(得分:2)
你只需要在translateMessage()
中添加一个else语句就可以像这样在输出中添加空格
def translateMessage(key, message, mode):
translated = ""
keyIndex = 0
key = key.upper()
for symbol in message:
xyz = alphabet.find(symbol.upper())
if xyz != -1:
if mode == 'encrypt' or 'e':
xyz += alphabet.find(key[keyIndex]) + 1
elif mode == 'decrypt' or 'd':
xyz -= alphabet.find(key[keyIndex]) + 1
xyz %= len(alphabet)
if symbol.isupper():
translated += alphabet[xyz]
elif symbol.islower():
translated += alphabet[xyz].lower()
keyIndex += 1
if keyIndex == len(key):
keyIndex = 0
else : translated += symbol #this will add space as it is
return translated
答案 1 :(得分:0)
你可以做得更好,这段代码甚至可以返回格式和空格,例如。大写字母,小写字母!
def shift_dict(Caesar, Shift):
dic_len = len(Caesar)
Shift = Shift % dic_len
list_dic = [(k,v) for k, v in iter(Caesar.items())]
Shifted = {
list_dic[x][0]: list_dic[(x - Shift) % dic_len][1]
for x in range(dic_len)
}
return Shifted
Viginere = {
"A":0,
"B":1,
"C":2,
"D":3,
"E":4,
"F":5,
"G":6,
"H":7,
"I":8,
"J":9,
"K":10,
"L":11,
"M":12,
"N":13,
"O":14,
"P":15,
"Q":16,
"R":17,
"S":18,
"T":19,
"U":20,
"V":21,
"W":22,
"X":23,
"Y":24,
"Z":25
}
VFU = {
0:"A",
1:"B",
2:"C",
3:"D",
4:"E",
5:"F",
6:"G",
7:"H",
8:"I",
9:"J",
10:"K",
11:"L",
12:"M",
13:"N",
14:"O",
15:"P",
16:"Q",
17:"R",
18:"S",
19:"T",
20:"U",
21:"V",
22:"W",
23:"X",
24:"Y",
25:"Z"
}
VFL = {
0:"a",
1:"b",
2:"c",
3:"d",
4:"e",
5:"f",
6:"g",
7:"h",
8:"i",
9:"j",
10:"k",
11:"l",
12:"m",
13:"n",
14:"o",
15:"p",
16:"q",
17:"r",
18:"s",
19:"t",
20:"u",
21:"v",
22:"w",
23:"x",
24:"y",
25:"z"
}
Asker = int(input("Do you want to... 1. Encode, or 2. Decode? "))
X = 0
Lister = []
Text = list(str(input("")))
Key = list(str(input("")).upper())
Z = 0
if Asker == 1:
for i in range(len(Text)):
Shift = Viginere[Key[(Z % len(Key))]]
if Text[X].isalpha():
LetterNum = Viginere[Text[X].upper()]
Helper = (LetterNum + Shift) % 26
if Text[X].isupper():
Lister.append(VFU[Helper])
else:
Lister.append(VFL[Helper])
else:
Lister.append(Text[X])
Z -= 1
X += 1
Z += 1
print(*Lister, sep = "")
elif Asker == 2:
for i in range(len(Text)):
Shift = Viginere[Key[(Z % len(Key))]]
if Text[X].isalpha():
LetterNum = Viginere[Text[X].upper()]
Helper = (LetterNum - Shift) % 26
if Text[X].isupper():
Lister.append(VFU[Helper])
else:
Lister.append(VFL[Helper])
else:
Lister.append(Text[X])
Z -= 1
X += 1
Z += 1
print(*Lister, sep = "")
这将轻松解决您的问题,它甚至会要求您输入字符串和密钥!这是python魔术的定义。