需要编写程序来解码秘密消息的字母表

时间:2012-08-10 21:42:17

标签: python

所以,我需要输入一个加扰的字母表,然后使用该字母输入一个秘密信息。我的程序需要解密秘密消息。到目前为止我写过这个并且卡住了。我希望有人可以帮助我。到目前为止我尝试的是将列表中的每个索引更改为A-Z。我的问题是如何使用我为此编写的内容并使其适用于我输入的秘密消息。

s = ()

alphabet = input("Please input the scrambled alphabet in order: ")
message = input("Now input the scrambled message: ")
alphabet.upper()
s = dict(alphabet)
num = 1

while num < 2:
    s[0] = chr(65)
    s[1] = chr(66)
    s[2] = chr(67)
    s[3] = chr(68)
    s[4] = chr(69)
    s[5] = chr(70)
    s[6] = chr(71)
    s[7] = chr(72)
    s[8] = chr(73)
    s[9] = chr(74)
    s[10] = chr(75)
    s[11] = chr(76)
    s[12] = chr(77)
    s[13] = chr(78)
    s[14] = chr(79)
    s[15] = chr(80)
    s[16] = chr(81)
    s[17] = chr(82)
    s[18] = chr(83)
    s[19] = chr(84)
    s[20] = chr(85)
    s[21] = chr(86)
    s[22] = chr(87)
    s[23] = chr(88)
    s[24] = chr(89)
    s[25] = chr(90)
    num +=1
print (s)

for alpha in message.upper():
    if alpha < "A" or alpha > "Z":
        print(alpha,end="")
    else:
        print(s [ord(alpha) -65 ], end="")

6 个答案:

答案 0 :(得分:3)

首先,创建大字典s是完全没必要的。它实际上什么都不做:行:

s [ord(alpha) -65 ]

将一个字母变成一个数字,减去65,然后将它放入一个增加65的字典并将其变回一个数字。

其次,行alphabet.upper()实际上并没有改变字母表,它只返回一个大写的版本。你需要做

alphabet = alphabet.upper()

现在为肉食部分。你打算做的是创建一个字典,将代码字母表中的字母映射到真实字母表中的字母。第dict(alphabet)行不会这样做。相反,遍历字符串中的字符并将每个字符分配给相应的字母。你使用chr走在正确的轨道上,但是工作量太大了。怎么样:

s = {}
for i in range(26):  # iterate from 0 to 25
    s[alphabet[i]] = chr(65 + i)

因为chr(65 + i)是正常有序字母表中的字母,alphabet[i]是加扰字母。

一旦你有了这本字典,逐字逐句地进行更改应该很容易(而且留给你)。

答案 1 :(得分:2)

您可以使用字符串translate()方法:

import string

intab   = 'abcdefghijklmnopqrstuvwxyz' # or string.ascii_lowercase
outtab  = 'xyzabcdefghijklmnopqrstuvw'
tab = string.maketrans(intab, outtab)
s = raw_input('Type some text: ').lower()
print s.translate(tab)

maketrans()创建一个包含两个字母的表格,translate()只需将字符串中的每个字符替换为表格中的字符串。

答案 2 :(得分:0)

我不知道Python - 这是伪代码

  
      
  1. 创建乱码字母数组
  2.   
  3. 创建“普通”字母数组
  4.   
  5. 在消息中使用foreach char,在scrambled数组中找到char,然后输出相应的“normal”char
  6.   

答案 3 :(得分:0)

你可以写一本字典:

alphabet({'a':'alpha', 'b':'bravo','c':'charlie', etc.}) 

所以abc会转换为alphabravocharlie

其中'a','b',..是编码字母,'alpha','bravo',...是它们的实际值。通过颠倒这个来制作“密码”。

请参阅有关词典的在线教程部分: http://docs.python.org/dev/library/collections.html

答案 4 :(得分:0)

我相信你问'如果我输入一串字符(我假设一个没有分隔符的字符串),我该如何制作一个字典,其中第一个字母= A,第二个字母= B,等等“。 (对不起,如果这是错误的解释)。如果是这种情况,您可以执行以下操作(请注意raw_input - input的使用是一个内置的,用于评估参数 - 它不会分配):

alphabet = raw_input("Please input the scrambled alphabet in order: ")
message = raw_input("Now input the scrambled message: ")

secret_map = {}

# Step through the provided string, incrementing the character number by index.
# Index will start at 65 + 0 = A (change to 98 if you want lowercase)
for index, letter in enumerate(alphabet):
    secret_map[letter] = chr(65 + index)

# Now join the string together, mapping each letter to its corresponding value
new_str = ''.join([secret_map[char] for char in message])

# Print the resulting string
print new_str

由于这是家庭作业(也许你还没有列出理解),这相当于创建new_str

new_str = ''
for letter in message:
    new_str += secret_map[letter]

如果这不是你想要的,请告诉我。

答案 5 :(得分:0)

我无法抗拒扩展stummjr的答案,创建一个更加pythonic版本的编码和解码(我添加了一些额外的变量来尝试让每一步更清晰):

import random, string

cypher_list = list(string.ascii_lowercase)
random.shuffle(cypher_list)
cypher_text = ''.join(cypher_list)

encode_tab = string.maketrans(string.ascii_lowercase, cypher_text)
decode_tab = string.maketrans(cypher_text, string.ascii_lowercase)

orig_text = 'this means war'
crypt_text = orig_text.translate(encode_tab)
clear_text = crypt_text.translate(decode_tab)

print cypher_text
print crypt_text
print clear_text
assert(clear_text == orig_text)