这几天搞泰迪杯数据分析技能赛去了。等拿国奖了就出一期关于泰迪杯的。
试题编号: 201703-3
试题名称: Markdown
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的:
这些用 Markdown 写成的文本,尽管本身是纯文本格式,然而读者可以很容易地看出它的文档结构。同时,还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示:
本题要求由你来编写一个 Markdown 的转换工具,完成 Markdown 文本到 HTML 代码的转换工作。简化起见,本题定义的 Markdown 语法规则和转换规则描述如下:
●区块:区块是文档的顶级结构。本题的 Markdown 语法有 3 种区块格式。在输入中,相邻两个区块之间用一个或多个空行分隔。输出时删除所有分隔区块的空行。
○段落:一般情况下,连续多行输入构成一个段落。段落的转换规则是在段落的第一行行首插入 ,在最后一行行末插入
#
开头,接着一个或多个空格,然后是标题内容,直到行末。#
的个数决定了标题的等级。转换时,# Heading
转换为 Heading
,## Heading
转换为 Heading
,以此类推。标题等级最深为 6。*
开头,接着一个或多个空格,然后是列表项目的文字,直到行末。转换时,在最开始插入一行
,最后插入一行
;对于每行,* Item
转换为 - Item
。本题中的无序列表只有一层,不会出现缩进的情况。_Text_
转换为 Text
。强调不会出现嵌套,每行中 _
的个数一定是偶数,且不会连续相邻。注意 _Text_
的前后不一定是空格字符。[Text](Link)
转换为 Text
。超级链接和强调可以相互嵌套,但每种格式不会超过一层。提示
由于本题要将输入数据当做一个文本文件来处理,要逐行读取直到文件结束,C/C++、Java 语言的用户可以参考以下代码片段来读取输入内容。
import sys
data=[]#记录转换好的文档
flag=False#标记段落是否是多行
list_tag=False#标记无序列表是否是多行
for line in sys.stdin:#利用sys库标准输入,line表示键盘输入的每行内容
#区块
line=line.strip()#利用strip()方法去字符串头尾的空格
if '#' in line:#标题
count=line.count('#')
temp=line.split('#')[-1].strip()#不要用空格分割,万一题目标题有空格呢
temp="+str(count)+">"+temp+" +str(count)+">"
elif '*' in line:#如果是无序列表
if list_tag==False:
data.append(""
)
list_tag=True
temp=line.split("*")[-1].strip()#用*分割
temp="- "
+temp+""
else:#段落
if line and flag==False:#首次出现的段落
temp=""
+line
flag=True#重标记
elif line and flag==True:#中间出现的段落
temp=line
elif line=="" and flag==True:#段落结束,修改最后一个元素(加上)
data[-1]=data[-1]+""
flag=False
temp=""
elif line=='' and list_tag==True:#无序列表结束
data.append("")
temp=""
list_tag=False
else:#回到初始状态
temp=''
flag=False
list_tag=False
#行内,强调
i=1#标记’_'是第一个还是第二个
while '_' in temp:#强调可能有多个,可能有无限个所以用while
index_1=temp.find('_')#使用find()函数返回第一个’_‘索引
if i==1:#第一次出现
temp=temp[:index_1]+''+temp[index_1+1:]#切片,拼接操作
i=2
else:#第二次出现(一对’_‘完成)
temp=temp[:index_1]+''+temp[index_1+1:]
i=1
#超链接
while '[' in temp:#超链接可能有多个,可能有无限个所以用while
i1=temp.find('[')
i2=temp.find(']',i1+1)#从i1+1位置开始王后找']'
i3=temp.find('(',i2+1)
i4=temp.find(')',i3+1)
temp=temp[:i1]+'+temp[(i3+1):i4]+'">'+temp[(i1+1):i2]+""+temp[(i4+1):]#按照格式切片拼接即可
data.append(temp)#转换好的追加写入data[]即可
if flag==True:#当以段落结束时
data[-1]=data[-1]+''
if list_tag==True:#当以无序列表结束时
data.append("")
for d in data:#按输出格式输出(没有空行)
if d=='':
continue
print(d)