任务描述
之前程序只能处理 26 个小写英文字母,而不支持其它字符,如大写字母、数字、标点等。但这些字符在实际使用中也会大量出现,需要进行支持,才能更好的保护信息。
本关任务是对凯撒加密方法进行扩展,使其能够进一步处理其它英文字符。
相关知识
可视字符
实际上,在 ASCII 编码表中总共包含 95 个可视字符,即下图红框中的字符。可视字符是能够在屏幕上显示出来,或者说能看得见的字符。剩下的 33 个字符是控制字符,是看不见的,如删除符、换行符等。
可视字符基本上涵盖了所有常见的英文字符,包括大小写字母、数字、标点、特殊符号等。如果能对所有可视字符进行加密,就能满足英文文本的需要了。
算法扩展
观察一下,跟之前 26 个小写字母类似,在 ASCII 编码表中,这 95 个可视字符也是连续排列的。第一个字符是空格’ ‘、最后一个是波浪号’~’。
所以,也可以用循环偏移的方法对可视字符进行加密,过程跟之前一样,只不过字符从原来的 26 个小写字母扩展到 95 个可视字符。具体来说,在之前程序的基础上,进行如下改动,就可以使程序支持所有可视字符:
1)修改首个字符对应的 ASCII 码;
2)将支持的字符总数改为 95;
3)在对文本中某个字符x加密时,要先判断能否加密,之前的判断条件是看x是否为小写英文字符,而现在应改为看x是否为可视字符。
编程要求
Begin-End 区间给出的是第 3 关的过关程序,能够对所有小写英文字母进行凯撒加密。修改代码,使其能够支持所有可视字符。
过关后,可以尝试一下解密过程。
测试说明
例如,测试集 1 的输入为:
Attack Tonight!
测试集 1 的输出为(大写字母、空格、标点都能加密):
Attack Tonight! -> Cvvcem"Vqpkijv#
开始你的任务吧,祝你成功!
########## Begin ##########
firstASCII = ord(' ') #首个字符的ASCII码
N = 95 #支持的字符总数
def enChar(x, key):
xid = ord(x)-firstASCII
yid = (xid+key) % N
y = chr(firstASCII+yid)
return y
def Caesar(text, key):
result = ''
for x in text:
if ' '<=x<='~': #若x是可视字母
x = enChar(x,key)
result = result + x
return result
key = 2 #密钥
text = input()
enText = Caesar(text, key)
print('%s -> %s' % (text, enText))
########## End ##########