ZeroJudge a217. caps lock的災難
解題思路
題幹中提到,需要一個程式可以自動將英文句子中的字母轉換為正確的大小寫格式。而我實際測試後,發現裡面許多句子並非是正統的句子格式,許多句連一個單字都無法湊齊。若無法從測資中看出本題對句子的定義會花很久時間在寫判斷式上,以下是我整理出的規則。
- 句子開頭第一個字母必須大寫
- 只有
.
、?
、!
可以分隔句子與句子
i
前後沒有字母時需要大寫,相反則否
,
、.
、?
、!
可存在於句子的任何地方
e.g. ,,dpfoj??s, idlk!i!s i,!,sl
這句可以被分為 ,,dpfoj?
、?
、s, idlk!
、i!
、s i,!
、,sl
6 句句子,依照上面的規則,輸出應為:
output: ,,Dpfoj??S, idlk!I!S I,!,Sl
- 在第一句
,,dpfoj?
中 d
為句子的首個字母因此大寫(,
不是字母,也無法大寫)
- 第二句只有
?
,不須進行大小寫轉換
- 第三句中
s
為句子首個字母因此需要大寫,而 i
因為後方連接其他字母因此不用大寫
- 第四句中
i
句子開頭的同時前後也沒有連接字母(!
並非字母),必須大寫
- 第五句中
s
為句子首個字母因此需要大寫,而 i
的前後方並無字母,因此需大寫
- 第六句中
,
並非字母,因此 s
大寫。
程式碼
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#include <bits/stdc++.h>
using namespace std;
bool is_alpha(char c){ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
char upper(char c){ if (c >= 'a' && c <= 'z'){ return c - 'a' + 'A'; } return c; }
int main(){ string sentence; while(getline(cin, sentence)){ int len_sentence = sentence.length(); bool in_sentence = false; for (int i = 0; i < len_sentence; i++){ if (!in_sentence){ if (is_alpha(sentence[i])){ in_sentence = true; sentence[i] = upper(sentence[i]); } }else{ if (sentence[i] == '.' || sentence[i] == '!' || sentence[i] == '?'){ in_sentence = false; } if (sentence[i] == 'i' and (sentence[i - 1] == ' ' or sentence[i - 1] == ',') and (i == len_sentence - 1 or (sentence[i + 1] == ' ' or sentence[i + 1] == ',' or sentence[i + 1] == '.' or sentence[i + 1] == '!' or sentence[i + 1] == '?'))){ sentence[i] = 'I'; } } } cout << sentence << "\n"; } return 0; }
|
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
while True: try: sentence = list(input()) except: break len_sentence = len(sentence) in_sentence = False for i in range(0, len_sentence): if not in_sentence: if sentence[i].isalpha(): in_sentence = True sentence[i] = sentence[i].upper() else: if sentence[i] in '.!?': in_sentence = False if sentence[i] == 'i' and sentence[i - 1] in ' ,' and (i == len_sentence - 1 or sentence[i + 1] in ' ,.!?'): sentence[i] = sentence[i].upper()
print(''.join(sentence))
|