目录

蓝桥 卷“兔”来袭编程竞赛专场-01破解藏头诗 题解

赛题介绍

挑战介绍

藏头诗是一种将需要传递的内容隐藏在每句诗的第一个字,解密时只需要提取每句诗的第一个字,然后连在一起就可以获得传递的消息。古人经常使用藏头诗,隐晦地表达自己想说的话,既有诗意,又能传递信息。

例如《水浒传》中的一诗:

芦花丛中一扁舟,俊杰俄从此地游。

义士若能知此理,反躬难逃可无忧。

提取每句诗的第一个字,连成一句话就是:芦俊义反。

挑战目标

补充文件 acrostic_poetry.pyacrostic_poetry_decryption(poem) 函数中的 TODO 部分,使其实现我们需要的功能:

  • 输入一个字符串,字符串为一首诗内容,每句诗之间使用逗号(,)或句号(。)分割。
  • 提取每句诗的第一个字,然后从左往右依次拼接,最后将得到的字符串赋值给变量 decryption_text
  • 如果输入内容中有空格,请先去掉空格后再处理。 如果输入内容中没有内容,则返回 None。 www
1
2
3
4
5
6
7
import re

def acrostic_poetry_decryption(poem: str) -> str:
    """TODO
    """
    decryption_text : str = ''
    return decryption_text

挑战要求

  • 题目需使用 Python3 完成,除 re 库外,不能使用其它标准库和第三方库。
  • 函数传入的 poem 为字符串类型,可能为空、None 等值。
  • 不得修改文件路径、文件名 acrostic_poetry.py 以及函数名 acrostic_poetry_decryption(poem)。
  • 请只保留文件 acrostic_poetry.py 及文件中函数,不要添加测试或执行代码,避免检测时出错。
  • 线上环境调试代码时,请使用 python3 acrostic_poetry.py 命令调用 Python3。

参考样例

1
2
3
4
5
6
7
8
# 样例 1
poem = "芦花丛中一扁舟,俊杰俄从此地游,义士若能知此理,反躬难逃可无忧。"; decryption_text = "芦俊义反"
# 样例 2
poem = "  芦花丛中一扁舟,俊杰俄从此地游。义士  若能知此理,反躬难逃可无忧。"; decryption_text = "芦俊义反"
# 样例 3
poem = "芦花丛中一扁舟,俊杰俄从此地游义士若能知此理,反躬难逃可无忧"; decryption_text = "芦俊反"
# 样例 4
poem = None; decryption_text = None

注意:最终实现效果以完全满足要求为准,而不是仅满足如上样例。


题解

解题思路

  1. 要注意对传入参数类型的检查,包括空字符串等情形。
  2. 考察对字符串分割的能力。若直接用字符串split()方法,需要多次操作才能完成。如果分割标识符较多,不是明智之举。这里使用正则的字符串分割方法re.split().
  3. 正则模式中括号[]用来表示一组字符,单独列出:[,。] 匹配 ‘,或’。'
  4. 利用Python列表推导简化代码编写。分别从正则分割后的列表中提取每段的首个字。因为有空字符串,所以还要在列表推导中加个if判断。
  5. 最后使用join方法将列表拼接为字符串返回即可。

代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import re


def acrostic_poetry_decryption(poem: str) -> str:
    """TODO
    """
    # 过滤非str类型输入
    if not isinstance(poem, str):
        return None
    # 过滤空格符
    poem = poem.replace(' ', '')
    # 过滤空字符串
    if poem == "":
        return None
    # 利用正则以符号分组,提取每组的首个字符
    result = [x[0] for x in re.split('[,。]', poem) if x]

    decryption_text: str = ''.join(result)
    return decryption_text


题目来源:破解藏头诗