CCF 201703-3 Markdown

CCF 201703-3 Markdown

來自專欄如何快速高效學習C++?- 計算機軟體能力認證考試系統?

118.190.20.162

試題編號: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` 轉換為 `<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 語言的用戶可以參考以下代碼片段來讀取輸入內容。

#include <bits/stdc++.h>using namespace std;const int N = 100010, INF = 0x3f3f3f3f;//work1處理鏈接,work2處理加粗字體,返回值為在被調用函數中處理的最後一個字元的位置。//因為兩者相互調用,故先聲明函數int work1(string &res, string &str, int i);int work2(string &res, string &str, int i);int work1(string &res, string &str, int i){ res += "<a href=""; int j = i; while(str[i] != () i++;//跳到小括弧處 for(i++; str[i] != ); i++) { //首先跳到小括弧處把網址處理好,如果發現網址中有加粗字體,就調用work2,否則直接加到結果中 if(str[i] == _) i = work2(res, str, i); else res += str[i]; } res += "">"; int k = i; i = j;//回到中括弧的位置,處理網址的文本顯示 for(i++; str[i] != ]; i++) { if(str[i] == _)//如果發現網址中有加粗字體,就調用work2,否則直接加到結果中 i = work2(res, str, i); else res += str[i]; } res += "</a>"; return k;}int work2(string &res, string &str, int i){ res += "<em>"; for(i++; str[i] != _; i++) { if(str[i] == [)//如果發現加粗字體中含有網址,就調用work1,否則直接加到結果中 i = work1(res, str, i); else res += str[i]; } res += "</em>"; return i;}int main(){ string str, res; //f_1為true標記上一行為列表,f_2為true標記上一行為段落 bool f_1 = false, f_2 = false; while(getline(cin, str)) { if(str.size() == 0) {//此時一個區塊結束,處理列表或者段落 if(f_1 == true) { f_1 = false; res += "</ul>"; res +=
; } if(f_2 == true) { f_2 = false; res += "</p>"; res +=
; } continue; } if(str[0] == #) { int num = 0, i; for(i = 0; str[i] == #; i++) num++; res += "<h"; res += (num + 0); res += >; while(str[i] == ) i++; for(; str[i]; i++) { if(str[i] == [) i = work1(res, str, i); else if(str[i] == _) i = work2(res, str, i); else res += str[i]; } res += "</h"; res += (num + 0); res += >; res +=
; } else if(str[0] == *) { if(f_1 == false)//第一次遇到列表,加上開頭並換行 res += "<ul>", res +=
; f_1 = true; //做標記 res += "<li>"; int i = 1; while(str[i] == ) i++; for(; str[i]; i++) { if(str[i] == [) i = work1(res, str, i); else if(str[i] == _) i = work2(res, str, i); else res += str[i]; } res += "</li>"; res +=
; } else { if(f_2 == false) //段落的第一行,加上開頭 res += "<p>"; if(f_2 == true) //非第一行,則加換行 res +=
; f_2 = true;//做標記 for(int i = 0; str[i]; i++) { if(str[i] == [) i = work1(res, str, i); else if(str[i] == _) i = work2(res, str, i); else res += str[i]; } } } //文件尾也是一個區塊的結束,記得處理列表和段落 if(f_1 == true) { f_1 = false; res += "</ul>"; res +=
; } if(f_2 == true) { f_2 = false; res += "</p>"; res +=
; } cout << res; return 0;}

PS:

廣告時間啦~

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

歡迎掃碼關注~


推薦閱讀:

為什麼社會發展的越來越快?——人工智慧可能真的會讓人類最終走向滅亡
如何快速定數等分一條線段?
工欲善其事,必先利其器——從一道數論題談起
Python進擊-基本語法結構

TAG:數學 | Markdown | ccf |