电报加解密

A国和B国正在陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。为了保证信息不被 泄漏,A国司令部向小猴发送了最新的军用密码的编码规则。

加密的规则:

- 电报中的小写字母,按字母表顺序替换为后一个对应的大写字母,如果超出字母表,则转 回到第一个字母;

- 电报中的大写字母,按字母表顺序替换为前一个对应的小写字母,如果超出字母表,则转 回到最后一个字母;

- 电报中的数字,按数码从小到大的顺序替换为后一个对应的数码,例如 0 替换为 1、 1 替换为 2、 9 替换为 0。

- 其他字符不做变化。

解密的规则为加密规则的逆过程。

例如,字母 g 以字母 H 代替,字母 N 以字母 m 代替。因此电报 gN96 经过加密之后为 Hm07,电报 Hm07 经过解密之后为 gN96。

现在,小猴收到了A国司令发来的 n 份电报信息,请你帮助小猴对这些信息进行解密,并输出 解密后的结果。

输入描述

第一行,包含一个正整数 n。( 1≤n≤100 )

接下来 n 行,每行包含一个字符串 si,第 i 行的字符串 si 表示小猴收到的第 i 份电报信息。 保证字符串 si 中只包含大小写英文字母、数字、空格和英文标点符号(保证只会出 现:','、'.'、':'、'!' 和 '?')。

输出描述

共 n 行,第 i 行输出一个字符串,表示第 i 份电报经过解密之后的内容。

输入样例

3

fPPE MVDL PO ZPVS FYBN!

aFMJFWF JO ZPVSTFMG!

h XJTI UIF FYBN B TVDDFTT!


输出样例

Good luck on your exam!

Believe in yourself!

I wish the exam a success!


解析:

一、此题重点难点在于加密规则中字符的替换,需要熟悉ASCII码表,能够将字符转ASCII码,ASCII码转字符

1、电报中的小写字母,按字母表顺序替换为后一个对应的大写字母,如果超出字母表,则转回到第一个字母;

小写字母的ASCII码比对应大写字母ASCII码多32,因此将小写字母转为ASCII码减去32得到对应大写字母ASCII码,再加1就是后一个对应的大写字母的ASCII码,最后再把ASCII码转为字符。特殊情况就是"z"超出字母表,转回"A"

2、电报中的大写字母,按字母表顺序替换为前一个对应的小写字母,如果超出字母表,则转回到最后一个字母;

小写字母的ASCII码比对应大写字母ASCII码多32,因此将大写字母转为ASCII码加上32得到对应小写字母ASCII码,再减1就是前一个对应的小写字母的ASCII码,最后再把ASCII码转为字符。特殊情况就是"A"超出字母表,转回"z"

3、电报中的数字,按数码从小到大的顺序替换为后一个对应的数码,例如 0 替换为 1、 1 替换为 2、 9 替换为 0

设计简单算法,将数字+1然后除以10取余数就是转换的结果,例如(0+1)%10==1;(9+1)%10==0

二、对于输入的字符串,如何判断其中的字符是大写,小写还是数字呢?需要用到以下内置函数:

#isupper()方法判断大写字母

#islower()方法判断小写字母

#isdigit()方法判断数字


程序实现步骤参考:

第一步:编写三个函数分别能够替换小写字母、大写字母、数字

第二步:实现输入,使用循环输入n行加密的字符串

第三步:对每一行加密的字符串进行遍历,根据字符进行相应的转换拼接,把解密的字符串存入定义的数组

第四步:打印结果


参考代码:

#小写字母替换
def replacelow(s):
    if s=='z':
        return 'A'
    else:#ASCII码相差32
        return chr(ord(s)-32+1)
#大写字母替换
def replaceup(s):
    if s=='A':
        return 'z'
    else:#ASCII码相差32
        return chr(ord(s)+32-1)
#数字替换
def replacenum(s):    
    return str((s+1)%10)

n=int(input())
res=[]#定义数组,存放解密信息
#输入n行加密信息
#isupper()方法判断大写字母
#islower()方法判断小写字母
#isdigit()方法判断数字
for i in range(n):
    s=input()
    s1=''
    for k in s:
        if k.isupper():
            s1+=replaceup(k)
        elif k.islower():
            s1+=replacelow(k)
        elif k.isdigit():
            s1+=replacenum(int(k))
        else:
            s1+=k
    res.append(s1)
#输出
for j in res:
    print(j)

本站内容未经许可,禁止任何网站及个人进行转载。