NOC青少儿编程大赛Python初中组决赛真题【解析】-电报加解密
更新时间:2024-10-10 23:44 浏览量:9
电报加解密
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)==1;(9+1)==0
二、对于输入的字符串,如何判断其中的字符是大写,小写还是数字呢?需要用到以下内置函数:
#isupper方法判断大写字母
#islower方法判断小写字母
#isdigit方法判断数字
程序实现步骤参考:
第一步:编写三个函数分别能够替换小写字母、大写字母、数字
第二步:实现输入,使用循环输入n行加密的字符串
第三步:对每一行加密的字符串进行遍历,根据字符进行相应的转换拼接,把解密的字符串存入定义的数组
第四步:打印结果
参考代码:
#小写字母替换def replacelow(s):if s=='z':return 'A'else:#ASCII码相差32return chr(ord(s)-32+1)#大写字母替换def replaceup(s):if s=='A':return 'z'else:#ASCII码相差32return chr(ord(s)+32-1)#数字替换def replacenum(s): return str((s+1))n=int(input)res=#定义数组,存放解密信息#输入n行加密信息#isupper方法判断大写字母#islower方法判断小写字母#isdigit方法判断数字for i in range(n):s=inputs1=''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+=kres.append(s1)#输出for j in res:print(j)