- 計算機軟體能力認證考試系統

問題描述

  Markdown 是一種很流行的輕量級標記語言(lightweight markup language),廣泛用於撰寫帶格式的文檔。例如以下這段文本就是用 Markdown 的語法寫成的:

  這些用 Markdown 寫成的文本,儘管本身是純文本格式,然而讀者可以很容易地看出它的文檔結構。同時,還有很多工具可以自動把 Markdown 文本轉換成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面這段文本通過轉化得到的 HTML 代碼如下所示:

  本題要求由你來編寫一個 Markdown 的轉換工具,完成 Markdown 文本到 HTML 代碼的轉換工作。簡化起見,本題定義的 Markdown 語法規則和轉換規則描述如下:  ●區塊:區塊是文檔的頂級結構。本題的 Markdown 語法有 3 種區塊格式。在輸入中,相鄰兩個區塊之間用一個或多個空行分隔。輸出時刪除所有分隔區塊的空行。  ○段落:一般情況下,連續多行輸入構成一個段落。段落的轉換規則是在段落的第一行行首插入 `<p>`,在最後一行行末插入 `</p>`。  ○標題:每個標題區塊只有一行,由若干個 `#` 開頭,接著一個或多個空格,然後是標題內容,直到行末。`#` 的個數決定了標題的等級。轉換時,`# Heading` 轉換為 `<h1>Heading</h1>`,`## Heading` 轉換為 `<h2>Heading</h2>`,以此類推。標題等級最深為 6。  ○無序列表:無序列表由若干行組成,每行由 `*` 開頭,接著一個或多個空格,然後是列表項目的文字,直到行末。轉換時,在最開始插入一行 `<ul>`,最後插入一行 `</ul>`;對於每行,`* Item` 轉換為 `<li>Item</li>`。本題中的無序列表只有一層,不會出現縮進的情況。

  ●行內:對於區塊中的內容,有以下兩種行內結構。

  ○強調:`_Text_` 轉換為 `<em>Text</em>`。強調不會出現嵌套,每行中 `_` 的個數一定是偶數,且不會連續相鄰。注意 `_Text_` 的前後不一定是空格字元。  ○超級鏈接:`[Text](Link)` 轉換為 `<a href="Link">Text</a>`。超級鏈接和強調可以相互嵌套,但每種格式不會超過一層。

輸入格式

  輸入由若干行組成,表示一個用本題規定的 Markdown 語法撰寫的文檔。

輸出格式

  輸出由若干行組成,表示輸入的 Markdown 文檔轉換成產生的 HTML 代碼。

樣例輸入

# Hello

Hello, world!

樣例輸出

<h1>Hello</h1>

<p>Hello, world!</p>

評測用例規模與約定

  本題的測試點滿足以下條件:

  ●本題每個測試點的輸入數據所包含的行數都不超過100,每行字元的個數(包括行末換行符)都不超過100。  ●除了換行符之外,所有字元都是 ASCII 碼 32 至 126 的可列印字元。  ●每行行首和行末都不會出現空格字元。  ●輸入數據除了 Markdown 語法所需,內容中不會出現 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 這些字元。  ●所有測試點均符合題目所規定的 Markdown 語法,你的程序不需要考慮語法錯誤的情況。

提示

  由於本題要將輸入數據當做一個文本文件來處理,要逐行讀取直到文件結束,C/C++、Java 語言的用戶可以參考以下代碼片段來讀取輸入內容。

思路:

題目有點長,要仔細讀。主要需要注意的地方有以下幾點:

  1. 模塊有三大類(標題、列表、段落)+空行,共4類,每次輸入的當前行與上一行類型不一致時,需要對當前行類別不同的其他類的標記做檢查,補上對應類的markdown的尾綴。
  2. 三大類的行內文本都需要進行
    1. 強調轉換
    2. 超鏈接轉換
  3. 超鏈接文本里需要做強調轉換

AC code:

#include <bits/stdc++.h>

#define test 0
#define local 0
#define um unordered_map
#define mp make_pair
#define loop(i,st,end) for(int i=st;i<end;i++)
using namespace std;
typedef long long ll;
int head=0;
bool p=false;
bool l=false;
class text {
public:
string s="";
text(){}
text(const string _s){
int i=0;
//skip
while(_s[i]== ||_s[i]==*||_s[i]==#)i++;
s=_s.substr(i);
solve();
cout<<s;
}
void solve(){
//add <em> </em>
em_process();
//procee [txt](link)
link_process();
}
void em_process(){
string temp="";
int counter=0;
loop(i,0,s.size()){
if(_==s[i]){
counter++;
if(1==counter%2)temp+="<em>";
else temp+="</em>";
}else{
temp+=s[i];
}
}
s=temp;
}
static string em_process(string&ss){
string temp="";
int counter=0;
loop(i,0,ss.size()){
if(_==ss[i]){
counter++;
if(1==counter%2)temp+="<em>";
else temp+="</em>";
}else{
temp+=ss[i];
}
}
return temp;
}
void link_process(){
string temp="";
int counter=0;
loop(i,0,s.size()){
if([==s[i]){
int find=i;
auto find2=s.find(],find);
auto find3=s.find((,find2);
auto find4=s.find(),find3);

string txt=s.substr((int)find+1,find2-find-1);
string link=s.substr((int)find3+1,find4-find3-1);

temp+=("<a href=""+link+"">"+txt+"</a>");

i=(int)find4;

}else{
temp+=s[i];
}
}
s=temp;
}
};

void head_clear(){
if(head>0){
cout<<"</h"<<head<<">"<<endl;
}
head=0;
}
void list_clear(){
if(l){
cout<<"</ul>"<<endl;
}
l=false;
}
void p_clear(){
if(p){
cout<<"</p>"<<endl;
}
p=false;
}
int main(){

#if local
fstream read("3test.txt");
cin.rdbuf(read.rdbuf());
#endif
string line="";
while(getline(cin,line)){
//empty line
if(line.empty()){
head_clear();
list_clear();
p_clear();
}else if(#==line[0]){//head line
list_clear();
p_clear();
while(#==line[head])head++;
cout<<"<h"<<head<<">";
text t(line);
}else if(*==line[0]){//list line
head_clear();
p_clear();
if(false==l){
cout<<"<ul>"<<endl;
l=true;
}
cout<<"<li>";
text t(line);
cout<<"</li>"<<endl;
}else{// paraph line
head_clear();
list_clear();
if(false==p){
cout<<"<p>";
p=true;
}else cout<<endl;
text t(line);
}
}
//end line
head_clear();
list_clear();
p_clear();
return 0;
}

PS:

廣告時間啦~

理工狗不想被人文素養拖後腿?不妨關注微信公眾號:

歡迎掃碼關注~


推薦閱讀:
相关文章