温馨提示:本站为童趣票务官方授权演出订票中心,请放心购买。
你现在的位置:首页 > 演出资讯  > 儿童亲子

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)

标签: 青少儿 python noc