凯撒密码:如何将轮班作为输入?

时间:2015-10-02 13:21:59

标签: python python-2.7 caesar-cipher

如何通过将其替换为字母表中的字母k位置来对邮件中的每个字母进行编码?例如,如果k = 3,则“a”替换为“d”,“b”替换为“e”,依此类推。字母表包裹着。 “w”由“z”代替,“x”由“a”代替,“y”由“b”代替,“z”由“c”代替。您可以假设要编码的消息不为空,只包含小写字母和空格。空间被编码为空间。 这是我尝试过的,但它并不像它需要的那样工作。我需要输入一定数量的字母才能跳过。

def encode(string,keyletter):
  alpha="abcdefghijklmnopqrstuvwxyz"
  secret = ""
  for letter in string:
    index = alpha.find(letter)
    secret = secret+keyletter[index]
  print secret

2 个答案:

答案 0 :(得分:0)

您可以使用Python的maketrans功能生成合适的字符映射,如下所示:

import string

def encode(text, rotate_by):
    s_from = string.ascii_lowercase
    s_to = string.ascii_lowercase[rotate_by:] + \
           string.ascii_lowercase[:rotate_by]
    cypher_table = string.maketrans(s_from, s_to)
    return text.translate(cypher_table)

text = raw_input("Enter the text to encode: ").lower()
rotate_by = int(raw_input("Rotate by: "))
print encode(text, rotate_by)

这会显示:

Enter the text to encode: hello world
Rotate by: 3
khoor zruog

答案 1 :(得分:0)

这是一个简单的版本,不需要重新排列alpha字符串。请注意,这并不考虑用户输入错误,例如输入单词而不是旋转数字。

while 1:
    rot = int(raw_input("Enter Rotation: "))
    cipher = raw_input("Enter String: ")
    secret,alpha = '', 'abcdefghijklmnopqrstuvwxyz'

    for i in cipher.lower():   #Loop through the original string 
        if i not in alpha:     #If the character in the original string is not in the alphabet just add it to the secret word
            secret += i
        else:
            x = alpha.index(i)   #Get index of letter in alphabet
            x = (x+rot)%26  #Find the index of the rotated letter
            secret += alpha[x]   #Add the new letter to the secret word
    print f

你可以将for循环中的所有内容压缩到一行,但是这样看起来不那么漂亮

f += i if i not in s else s[(s.index(i)+rot)%26]

如果你想使用你的Caesar Cipher,那就找一个带钥匙的Caesar Cipher并添加该选项。这将需要操纵你的alpha字符串。