ZeroJudge a217. caps lock的災難

解題思路

題幹中提到,需要一個程式可以自動將英文句子中的字母轉換為正確的大小寫格式。而我實際測試後,發現裡面許多句子並非是正統的句子格式,許多句連一個單字都無法湊齊。若無法從測資中看出本題對句子的定義會花很久時間在寫判斷式上,以下是我整理出的規則。

  1. 句子開頭第一個字母必須大寫
  2. 只有 .?! 可以分隔句子與句子
  3. i 前後沒有字母時需要大寫,相反則否
  4. ,.?! 可存在於句子的任何地方

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
// a217 AC

#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]); // 套用規則 1.,開頭大寫
}
}else{ // 如果迴圈在句子中
if (sentence[i] == '.' || sentence[i] == '!' || sentence[i] == '?'){
in_sentence = false; // 套用規則 2.,遇到以上句子則迴圈離開句子
}
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'; // 關於 i 的大寫,套用規則 3.:如果前面是空格或逗號,且後面是空格、逗號、句點、驚嘆號或問號,則將 i 改為大寫
}
}
}
cout << sentence << "\n";
}
return 0;
}

C++ AC

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# a217 AC

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() # 套用規則 1.,開頭大寫
else: # 如果迴圈在句子中
if sentence[i] in '.!?':
in_sentence = False # 套用規則 2.,遇到以上句子則迴圈離開句子
if sentence[i] == 'i' and sentence[i - 1] in ' ,' and (i == len_sentence - 1 or sentence[i + 1] in ' ,.!?'):
sentence[i] = sentence[i].upper() # 關於 i 的大寫,套用規則 3.:如果前面是空格或逗號,且後面是空格、逗號、句點、驚嘆號或問號,則將 i 改為大寫

print(''.join(sentence)) # 串列轉回字串輸出

Python AC