这是一个非常有趣的凯撒密码问题。
这是我的字典:
**{'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}**
很显然,字典是无序的。它们不是按字母或数字排列的,而是按对排列的。
我必须:
在此字典中查找字符串中的每个字母(“嗨,我叫凯撒”)
返回已编码的消息。如果字母为“ a”,则字典中的值为1。但是,我的代码是在字典中打印值为2的字母“ b”。
我已经看到了使用列表的凯撒示例(可以由我定购),但没有尝试以此方式导航词典 ...
我一弄清,我就会发布答案。此刻,我对此感到困惑。写下来有助于澄清可能需要的步骤。
请注意,如果代码正常运行,我认为“”会变成“ a”。
预期输出:“ ijanzaobnajtadbftbt”
答案 0 :(得分:1)
好吧,这是我的主意
d = {'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}
sentence = 'hi my name is caesar'
for char in ''.join(sentence.split()):
print(d[chr(ord(char) + 1)], end=' ')
输出
9 10 14 26 15 2 14 6 10 20 4 2 6 20 2 19
答案 1 :(得分:1)
您可以创建一个反向字典,并使用它来构建加密的字符串。反向字典将有助于查找与给定字符的“下一个”数字相对应的字符:
d = {'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}
reverse_d = {v: k for k, v in d.items()}
sentence = 'hi my name is caesar'
encrypted = ''.join([reverse_d.get(d[c] + 1, reverse_d[0]) for c in sentence])
print(encrypted)
# ijanzaobnfajtadbftbs
请注意,如果在0
中找不到数字,我将使用默认密钥reverse_d
。
答案 2 :(得分:1)
如果字典总是只表示字母中的字符数,那么您甚至不需要字典,这是一个单行代码:
sentence = 'hi my name is caesar'
encoded = ''.join([chr(ord(c)+1) if ord(c)>96 and ord(c)<122 else "a" for c in sentence])
这给
In [14]: encoded
Out[14]: 'ijanzaobnfajtadbftbs'
但是对于一般解决方案,我想说滑块是最优雅的方法。
答案 3 :(得分:0)
message = "hi my name is caesar"
alphabet = ' abcdefghijklmnopqrstuvwxyz'
positions = {' ': 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': 26}
# STEP ONE is to make an empty list to add your characters to. (Lists work well with dictionaries)
encryptlist = []
# STEP TWO locate the value of the 'r' in caesar.
for chars in message:
Num = positions[chars]
数字返回:18
#STEP THREE encrypt by one step (+1). You can keep the result within 0-26 using result % 27
encoded_Num = (Num + 1) % 27
#STEP 4 encrypt as a list
encryptlist.append(alphabet[encoded_Num])
加密列表现在返回 ['i','j','a','n','z','a','o','b','n','f','a','j',' t','a','d','b','f','t','b','s']
# convert the list to a string
encoded_message = "".join(encryptlist)
encoded_message
返回:'ijanzaobnfajtadbftbs',这是预期的输出