CCF 201703-3 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` 轉換為 `<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 語法,你的程序不需要考慮語法錯誤的情況。
  每個測試點包含的語法規則如下表所示,其中“√”表示包含,“×”表示不包含。
測試點編號 段落 標題 無序列表 強調 超級鏈接
1 × × × ×
2 × × ×
3 × × ×
4 × × ×
5 × × ×
6 × ×
7 × ×
8 × ×
9 × ×
10
提示
  由於本題要將輸入數據當做一個文本文件來處理,要逐行讀取直到文件結束,C/C++、Java 語言的用戶可以參考以下代碼片段來讀取輸入內容。


  
  直接模擬,考試時用文件讀入進行測試,結果提交代碼時忘記把文件讀入注釋掉,結果直接得了0分,過后練習時把代碼中文件讀入注釋掉改為標准輸入,就100分了。。就這樣因為兩個斜杠和400分失之交臂。。
  代碼如下:
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int MAX=105;
  4 string strs[MAX];
  5 
  6 void output(string str)
  7 {
  8     int len=str.length();
  9     for(int i=0;i<len;i++)
 10     {
 11         if(str[i]=='_')
 12         {
 13             int r=str.find('_',i+1);
 14             string tmp="<em>"+str.substr(i+1,r-i-1)+"</em>";
 15             output(tmp);
 16             i=r;
 17         }
 18         else if(str[i]=='[')
 19         {
 20             int r=str.find(']',i+1);
 21             string text=str.substr(i+1,r-i-1);
 22 
 23             int l=str.find('(',r+1);
 24             int linkr=str.find(')',r+1);
 25 
 26             string link=str.substr(l+1,linkr-l-1);
 27             string tmp="<a href=\""+link+"\">"+text+"</a>";
 28 
 29             output(tmp);
 30 
 31             i=linkr;
 32         }
 33         else
 34             printf("%c",str[i]);
 35     }
 36 }
 37 
 38 void solve_h()
 39 {
 40     int len=strs[0].length();
 41 
 42     int pos=len,cnt=0;
 43     for(int i=0;i<len;i++)
 44     {
 45         if(strs[0][i]=='#')
 46             cnt++;
 47         if(strs[0][i]!='#'&&strs[0][i]!=' ')
 48         {
 49             pos=i;
 50             break;
 51         }
 52     }
 53 
 54     cout<<"<h"<<cnt<<">";
 55     output(strs[0].substr(pos));
 56     cout<<"</h"<<cnt<<">"<<endl;
 57 }
 58 
 59 void solve_p(int cnt)
 60 {
 61     cout<<"<p>";
 62     for(int i=0;i<cnt;i++)
 63     {
 64         output(strs[i]);
 65 
 66         if(i==cnt-1)
 67             cout<<"</p>";
 68 
 69         cout<<endl;
 70     }
 71 }
 72 
 73 void solve_l(int cnt)
 74 {
 75     cout<<"<ul>"<<endl;
 76 
 77     for(int i=0;i<cnt;i++)
 78     {
 79         int len=strs[i].length();
 80         int pos=len,cnt=0;
 81 
 82         for(int j=1;j<len;j++)
 83             if(strs[i][j]!=' ')
 84             {
 85                 pos=j;
 86                 break;
 87             }
 88 
 89         cout<<"<li>";
 90         output(strs[i].substr(pos));
 91         cout<<"</li>"<<endl;
 92     }
 93     cout<<"</ul>"<<endl;
 94 }
 95 
 96 int main()
 97 {
 98     //freopen("in.txt","r",stdin);
 99     std::string line;
100 
101     int cnt=0;
102     while(getline(std::cin,line))
103     {
104         if(line=="")
105         {
106             if(cnt==0)
107                 continue;
108 
109             if(strs[0][0]=='#')
110                 solve_h();
111             else if(strs[0][0]=='*')
112                 solve_l(cnt);
113             else
114                 solve_p(cnt);
115 
116             cnt=0;
117             continue;
118         }
119 
120         strs[cnt++]=line;
121     }
122 
123     if(cnt)
124     {
125             if(strs[0][0]=='#')
126                 solve_h();
127             else if(strs[0][0]=='*')
128                 solve_l(cnt);
129             else
130                 solve_p(cnt);
131     }
132     return 0;
133 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM