商业网站建设举例,百度查重,服装网站建设平台,做网站的客户需求报告答案这几天搞泰迪杯数据分析技能赛去了。等拿国奖了就出一期关于泰迪杯的。
题目
试题编号#xff1a; 201703-3 试题名称#xff1a; Markdown 时间限制#xff1a; 1.0s 内存限制#xff1a; 256.0MB 问题描述#xff1a; 问题描述 Markdown 是一种很流行的轻量级标记…这几天搞泰迪杯数据分析技能赛去了。等拿国奖了就出一期关于泰迪杯的。
题目
试题编号 201703-3 试题名称 Markdown 时间限制 1.0s 内存限制 256.0MB 问题描述 问题描述 Markdown 是一种很流行的轻量级标记语言lightweight markup language广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的 这些用 Markdown 写成的文本尽管本身是纯文本格式然而读者可以很容易地看出它的文档结构。同时还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示
本题要求由你来编写一个 Markdown 的转换工具完成 Markdown 文本到 HTML 代码的转换工作。简化起见本题定义的 Markdown 语法规则和转换规则描述如下 ●区块区块是文档的顶级结构。本题的 Markdown 语法有 3 种区块格式。在输入中相邻两个区块之间用一个或多个空行分隔。输出时删除所有分隔区块的空行。 ○段落一般情况下连续多行输入构成一个段落。段落的转换规则是在段落的第一行行首插入 p在最后一行行末插入 /p。 ○标题每个标题区块只有一行由若干个 # 开头接着一个或多个空格然后是标题内容直到行末。# 的个数决定了标题的等级。转换时# Heading 转换为 h1Heading/h1## Heading 转换为 h2Heading/h2以此类推。标题等级最深为 6。 ○无序列表无序列表由若干行组成每行由 * 开头接着一个或多个空格然后是列表项目的文字直到行末。转换时在最开始插入一行 ul最后插入一行 /ul对于每行* Item 转换为 liItem/li。本题中的无序列表只有一层不会出现缩进的情况。 ●行内对于区块中的内容有以下两种行内结构。 ○强调_Text_ 转换为 emText/em。强调不会出现嵌套每行中 _ 的个数一定是偶数且不会连续相邻。注意 _Text_ 的前后不一定是空格字符。 ○超级链接[Text](Link) 转换为 a hrefLinkText/a。超级链接和强调可以相互嵌套但每种格式不会超过一层。 输入格式 输入由若干行组成表示一个用本题规定的 Markdown 语法撰写的文档。 输出格式 输出由若干行组成表示输入的 Markdown 文档转换成产生的 HTML 代码。 提示 由于本题要将输入数据当做一个文本文件来处理要逐行读取直到文件结束C/C、Java 语言的用户可以参考以下代码片段来读取输入内容。 题目分析个人理解
题目定义的规则分为区块和行内两个部分对于输入的字符串具体处理步骤为输入一行处理一行在整个区块输入结束或整个输入结束后才输出一个区块的转换结果。第一步先处理行内行内若包含强调和超级链接则按照题目中的规则转换强调和超级链接。第二步处理区块儿区块一共有三种包括‘#’开头的标题‘*’号开头的无序列表和段落一个区块可能有多行所以在每次处理一行时都要判断此行是否是区块的第一行以便添加不同的格式。关于输出:空行和输入结束标志着区块的结束可以输出结果了在区块结束或整个输入结束才输出整个区块代码中用preline保存每一个区块的前面的输入每次处理一行时都可以根据preline判断这个区块的类型以便输出对应的格式字符串例如,若preline包含 ul 说明这是一个无序列表输出的时候在最后补上\n/ ul 更更更具体的步骤对于输入利用sys库标准输入对每一行判断到底是区块还是行内如果是区块判断是区块的具体的哪三个如果是‘#’开头的标题统计是几级标题利用count函数利用.split()方法以#切片按照要求格式拼接即可。如果是 ‘* ’开头此时有一个问题鬼知道是不是第一行如果是第一行则先加ul再按照要求切片拼接字符串即可用list_tag标记设置默认值为Flase如果是第一行加入ul后设置list_tagTrue。 如果是是段落还需判断是不是段落的第一行同理于*开头的我就不多赘述了。行内处理好后存入一个temp[]空间然后开始处理行内注意超链接和强调可以相互嵌套使用while循环如果存在‘ _ ’就一直判断先处理强调强调不会出现套娃的现象所以只需要知道哪一段强调即可首先用i去标记是‘_’是第几次出现如果是第一次i1则是强调开始的标志第二次i2,是结束的标志然后按照强调的字符串的开始和结尾要求对字符串操作即可。再处理超链接的情况超链接也不会嵌套超链接还是用while判断是否存在‘[’,存在则有超链接超链接的题目要求就是里面Test的情况多一些本质还是字符串的处理还是用字符串的切片和拼接用烂了都人都麻了最后判断是段落结束还是无序列表结束分别追加相应的标识即可。上代码
import sys
data[]#记录转换好的文档
flagFalse#标记段落是否是多行
list_tagFalse#标记无序列表是否是多行
for line in sys.stdin:#利用sys库标准输入line表示键盘输入的每行内容
#区块lineline.strip()#利用strip()方法去字符串头尾的空格if # in line:#标题countline.count(#)templine.split(#)[-1].strip()#不要用空格分割万一题目标题有空格呢temphstr(count)temp/hstr(count)elif * in line:#如果是无序列表if list_tagFalse:data.append(ul)list_tagTruetempline.split(*)[-1].strip()#用*分割templitemp/lielse:#段落if line and flagFalse:#首次出现的段落tempplineflagTrue#重标记elif line and flagTrue:#中间出现的段落templineelif line and flagTrue:#段落结束修改最后一个元素加上/pdata[-1]data[-1]/pflagFalsetempelif line and list_tagTrue:#无序列表结束data.append(/ul)templist_tagFalseelse:#回到初始状态tempflagFalselist_tagFalse
#行内强调i1#标记’_是第一个还是第二个while _ in temp:#强调可能有多个可能有无限个所以用whileindex_1temp.find(_)#使用find()函数返回第一个’_‘索引if i1:#第一次出现temptemp[:index_1]emtemp[index_11:]#切片拼接操作i2else:#第二次出现一对’_‘完成temptemp[:index_1]/emtemp[index_11:]i1
#超链接while [ in temp:#超链接可能有多个可能有无限个所以用whilei1temp.find([)i2temp.find(],i11)#从i11位置开始王后找]i3temp.find((,i21)i4temp.find(),i31)temptemp[:i1]a hreftemp[(i31):i4]temp[(i11):i2]/atemp[(i41):]#按照格式切片拼接即可data.append(temp)#转换好的追加写入data[]即可
if flagTrue:#当以段落结束时data[-1]data[-1]/p
if list_tagTrue:#当以无序列表结束时data.append(/ul)
for d in data:#按输出格式输出没有空行if d:continueprint(d)总结