蓝桥 卷“兔”来袭编程竞赛专场-02破解曾公亮密码 题解
赛题介绍
挑战介绍
曾公亮编撰的《武经总要》中记载了一套严谨的军事通信密码,这也是目前发现我国古代战争中最早使用的军用密码表。将战场上可能常用到的情况,用 40 个短语归纳表示,且每个短语前编有固定的数字代码,这 40 个短语及数字代码如下:
代码 | 短语 | 代码 | 短语 | 代码 | 短语 | 代码 | 短语 | 代码 | 短语 |
---|---|---|---|---|---|---|---|---|---|
1 | 请弓 | 2 | 请箭 | 3 | 请刀 | 4 | 请甲 | 5 | 请枪旗 |
6 | 请锅幕 | 7 | 请马 | 8 | 请衣赐 | 9 | 请粮料 | 10 | 请草料 |
11 | 请车牛 | 12 | 请船 | 13 | 请攻城守县 | 14 | 请添兵 | 15 | 请移营 |
16 | 请进军 | 17 | 请退军 | 18 | 请固定 | 19 | 未见军 | 20 | 见贼 |
21 | 贼多 | 22 | 贼少 | 23 | 贼相敌 | 24 | 贼添兵 | 25 | 贼移营 |
26 | 贼进军 | 27 | 贼退军 | 28 | 贼固守 | 29 | 围得贼城 | 30 | 解围城 |
31 | 被贼围 | 32 | 贼围解 | 33 | 战不胜 | 34 | 战大胜 | 35 | 战大捷 |
36 | 将士投降 | 37 | 将士叛 | 38 | 士卒病 | 39 | 部将病 | 40 | 战小胜 |
然后约定某一首五言古诗作为解密的钥匙,五言古诗中 40 个字正好对应密码表中 40 种情况。
例如约定唐代王勃的《送杜少府之任蜀川》为解密的钥匙。
城阙辅三秦,风烟望五津。
与君离别意,同是宦游人。
海内存知己,天涯若比邻。
无为在歧路,儿女共沾巾。
如果军中马匹不足,需要请求马匹,那么对应密码表中的情报则是:7、请马。而《送杜少府之任蜀川》中第 7 个字是烟,将军只需要将“烟”字写到 一件普通公文书牒之中,并在字上加盖印章。朝廷收到公文书牒后通过《送杜少府之任蜀川》确认“烟”字的位置,然后查找密码表,获得相应的情报。
挑战目标
补充文件 zeng_gongliang.py
下 zeng_gongliang_decryption(text)
函数中的 TODO 部分,使其实现我们需要的功能:
- 输入古诗《送杜少府之任蜀川》中任意一个字,返回曾公亮密码表中对应的短语。
- 如果输入的内容在古诗《送杜少府之任蜀川》的 40 个 字中查找不到,则返回 None。
- 其它情况全部返回 None。
def zeng_gongliang_decryption(text: str) -> str:"""TODO"""key_dict = {'1':'请弓', '2':'请箭', '3':'请刀', '4':'请甲', '5':'请枪旗', '6':'请锅幕', '7':'请马', '8':'请衣赐', '9':'请粮料', '10':'请草料', '11':'请车牛', '12':'请船', '13':'请攻城守县', '14':'请添兵', '15':'请移营', '16':'请进军', '17':'请退军', '18':'请固定', '19':'未见军', '20':'见贼', '21':'贼多', '22':'贼少', '23':'贼相敌', '24':'贼添兵', '25':'贼移营', '26':'贼进军', '27':'贼退军', '28':'贼固守', '29':'围得贼城', '30':'解围城', '31':'被贼围', '32':'贼围解', '33':'战不胜', '34':'战大胜', '35':'战大捷', '36':'将士投降', '37':'将士叛', '38':'士卒病', '39':'部将病', '40':'战小胜'} decryption_text : str = ''return decryption_text
挑战要求
- 题目需使用 Python3 完成,不能使用标准库和第三方库。
- 函数传入 text 为字符串类型,可能为空、
None
等值。 - 不得修改文件路径、文件名
zeng_gongliang.py
以及函数名zeng_gongliang_decryption(text)
。 - 请只保留文件
zeng_gongliang.py
及文件中函数,不要添加测试或执行代码,避免检测时出错。 - 线上环境调试代码时,请使用
python3 zeng_gongliang.py
命令调用 Python3。
参考样例
# 样例 1
text = "烟"; decryption_text = "请马"
# 样例 2
text = "城"; decryption_text = "请弓"
# 样例 3
text = "请弓"; decryption_text = None
# 样例 4
text = "城 "; decryption_text = None
# 样例 5
text = None; decryption_text = None
注意:最终实现效果以完全满足要求为准,而不是仅满足如上样例。
题解
解题思路
主要考察字典dict
结构及方法的运用
- 要注意对传入参数类型的检查,包括空字符串等情形。
- 构造索引字符串。
- 利用
index()
方法寻找某个字符的索引. - 过滤不存在的键值,返回
None
。 - 最后使用
get
方法从字典找到对应的字符串值返回即可。
def zeng_gongliang_decryption(text: str) -> str:"""TODO"""# 过滤非str类型输入if not isinstance(text, str) or text == "":return None# 仅一个字符输入限制if len(text) > 1:return None# 构造数据字典key_dict = {'1': '请弓', '2': '请箭', '3': '请刀', '4': '请甲', '5': '请枪旗','6': '请锅幕', '7': '请马', '8': '请衣赐', '9': '请粮料', '10': '请草料','11': '请车牛', '12': '请船', '13': '请攻城守县', '14': '请添兵', '15': '请移营', '16': '请进军', '17': '请退军', '18': '请固定', '19': '未见军', '20': '见贼','21': '贼多', '22': '贼少', '23': '贼相敌', '24': '贼添兵', '25': '贼移营','26': '贼进军', '27': '贼退军', '28': '贼固守', '29': '围得贼城', '30':'解围城','31': '被贼围', '32': '贼围解', '33': '战不胜', '34': '战大胜','35': '战大捷','36': '将士投降', '37': '将士叛', '38': '士卒病', '39': '部将病', '40': '战小胜'}poem = "城阙辅三秦风烟望五津与君离别意同是宦游人海内存知己天涯若比邻无为在歧路儿女共沾巾"if text in poem:num = poem.index(text) + 1if key_dict.get(str(num)) == None:return Noneelse:return Nonedecryption_text: str = key_dict.get(str(num))return decryption_text
题目来源:蓝桥破解曾公亮密码
蓝桥 卷“兔”来袭编程竞赛专场-02破解曾公亮密码 题解相关推荐
- 蓝桥 卷“兔”来袭编程竞赛专场-05棋盘加密 题解
赛题介绍 挑战介绍 棋盘密码是一种坐标加密法.棋盘密码通过将 26 个字母设法变成十位数来达到加密的目的,密钥是一个 5×5 的棋盘,将 26 个英文字母填在棋盘的格子里,其中 i 和 j 在同一个方 ...
- 蓝桥 卷“兔”来袭编程竞赛专场-06姜子牙阴书加密 题解
赛题介绍 挑战介绍 姜子牙阴书密码是将一封完整的书信分割成三份,然后由三个送信者各送一份,收信人收到三份书信后再合并成一封完整的情报.如此,即使某个信使被敌军抓获,敌军也不会获得完整的情报. 但是如果 ...
- 蓝桥 卷“兔”来袭编程竞赛专场-07明码加密 题解
赛题介绍 挑战介绍 清末,电报技术进入中国.上海大北水线电报公司在 1871 年选用了六千八百九十七个汉字,代以四码数字,编写成了中国最早的电报明码本.为了传输的内容可以保密,又设计出了将明码本加密的 ...
- 蓝桥 卷“兔”来袭编程竞赛专场-09凯撒加密 题解
赛题介绍 挑战介绍 恺撒密码也称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.采用的是替换方法对信息中的英文字符循环替换为字母表序列中该字符后面或前面的第 N 个字符.例如当 N ...
- 蓝桥 卷“兔”来袭编程竞赛专场-04栅栏加密 题解
赛题介绍 挑战介绍 栅栏密码是一种简单的移动字符位置的加密方法,规则简单.加密方式是将明文按照一定的字数分成多个组,取每组第一个字连起来得到密文 1,再取每组第二个字连起来得到密文 2,以此类推,最后 ...
- 蓝桥 卷“兔”来袭编程竞赛专场-10仿射加密 题解
赛题介绍 挑战介绍 仿射密码结合了移位密码和乘数密码的特点,是一种替换密码.它是利用加密函数一个字母对一个字母的加密.加密函数是 y=ax+b(mod m) ,且 a,b∈Zm (a.b 的值在 m ...
- 蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解
赛题介绍 挑战介绍 列置换加密是明文以每行固定字数(key 的字母种类数,一般情况下 key 会选择字母不重复的单词)一行一行写下,如果最后一行字数小于每行的固定字数,则使用特殊符号补充,这样就形成了 ...
- CSDN编程竞赛第6期-参赛心得以及个人题解
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 (请不要删掉此地址) 前言/背景 这是第1次参加CSDN的在线编程竞赛,虽然也拿到满分了,但是输 ...
- 【青少年编程竞赛交流】02月份微信图文索引
02月份微信图文索引 由于"组队学习"这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习,所以,我另外新建了这个微信公众号"青少年编程竞赛交流& ...
最新文章
- 如何快速定位当前数据库消耗CPU最高的sql语句?
- hive的数据定义之创建数据库和表
- 我理解的配置管理系统
- BLE蓝牙核心数据库结构解析
- binder 进程间通讯关于handle一点疑问
- Knative 化繁为简之道:应用部署与访问
- 【Idea解法】Failed to execute goal on project : Could not resolve dependencies for pro
- SAP Fiori My note应用的add to功能的后台ABAP实现
- 微信小程序开发——超链接或按钮点击跳转到其他页面失效
- vscode删除文件夹,VSCode:删除文件中的所有注释
- 小爱音箱mini系统故障怎么办_梦龙评机小米小爱音箱HD使用体验
- 计算机是最大的一片云,计算机体系结构发展的四个时代介绍
- winform 读取用户控件的变量_winform中用户控件之间的传值
- 计算机二级msoffice高级应用考试,全国计算机二级MSOffice高级应用考试大纲
- 如何用echarts创建市区地图
- 如何解决录音嗡嗡嗡?VoiceMeeter加OBS免费且强大的录音录像解决方案
- Office 开发版本号与版本对应关系
- 基于java spring框架开发部标1078视频监控平台精华文章索引
- markdown 图片索引
- 空心的数字金字塔--C语言