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

## 赛题介绍

### 挑战介绍

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

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

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

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

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

### 挑战目标

补充文件 `acrostic_poetry.py` 下 `acrostic_poetry_decryption(poem)` 函数中的 TODO 部分，使其实现我们需要的功能：

- 输入一个字符串，字符串为一首诗内容，每句诗之间使用逗号（，）或句号（。）分割。
- 提取每句诗的第一个字，然后从左往右依次拼接，最后将得到的字符串赋值给变量 `decryption_text`。
- 如果输入内容中有空格，请先去掉空格后再处理。
如果输入内容中没有内容，则返回 `None`。
www
```python
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。

### 参考样例

```python
# 样例 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`方法将列表拼接为字符串返回即可。

代码如下：

```python
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

```

---

题目来源：[破解藏头诗](https://www.lanqiao.cn/problems/2395/learning/?contest_id=83)

