同題:UVa 00492 – Pig-Latin
由於你認為 email 的 PGP 加密法不夠安全,所以你決定先把原始信件轉換為 Pig Latin,再使用 PGP 加密法以加強安全性。
因此你需要寫一個程式,該程式將把原始信件轉換為 Pig Latin 的格式。
單詞應根據以下規則轉換為 Pig Latin:
- 以母音開頭的單詞 (a、e、i、o、u、以及其大寫形式) 應在其後附加字串「ay」。
- 例如:「apple」變成「appleay」。
- 以子音開頭的單詞 (不是大小寫的 a、e、i、o、u 之外的任何字母) 都應刪除第一個子音,並將其加到單詞的尾端,再加上「ay」。
- 例如:「hello」變成「ellohay」。
- 不可更改任何字母的大小寫。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入為一個原始信件,信件包含多行。 | 對於輸入信件,請輸出轉換後的信件。 |
This is the input. | hisTay isay hetay inputay. |
解題思路
使用 getline 將一整行收起來,並且將字串分開來存到一個陣列中。
在進行字串處理時,需要判斷目前的字串是否都是數字而非英文字母,如果是數字的字串則不需要做任何處理。如果是需要處理的字串,則需要判斷頭尾是否為標點符號,可以使用 isalpha 這個函式。如果有標點符號則需要先將其移除做完加密後在將其加回去。
範例程式碼-ZeroJudge E627: Pig-Latin
#include <iostream>
#include <vector>
using namespace std;
bool isVowel(const char ch) {
if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' || ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
return true;
}
return false;
}
string process (string s) {
if (s.empty()) {
s += 'a';
s += 'y';
return s;
}
if (!isVowel(s[0])) {
const char tmp = s[0];
s = s.substr(1, s.length());
s += tmp;
}
s += 'a';
s += 'y';
return s;
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
string str;
while (getline(cin, str)) {
vector<string>v;
string tmp = "";
for (int i = 0; i<str.length(); i++) {
if (!isalpha(str[i]) && !tmp.empty()) {
if (str[i] != ' ') tmp += str[i];
v.push_back(tmp);
tmp = "";
continue;
}
if (str[i] != ' ') tmp += str[i];
}
if (!tmp.empty()) v.push_back(tmp);
vector<string>ans;
for (int i = 0; i<v.size(); i++) {
string s = v[i];
bool number = true;
for (int j = 0; j<s.length(); j++) {
if (!isdigit(s[j])) {
number = false;
break;
}
}
if (number) {
ans.push_back(s);
continue;
}
if (!isalpha(s[(int(s.length())-1)]) && !isalpha(s[0])) {
const char head = s[0], tail = s[(int(s.length())-1)];
string tmp = "";
for (int j = 1; j<s.length()-1; j++) tmp += s[j];
s = tmp;
s = process(s);
s += tail;
ans.push_back(head+s);
continue;
}
if (!isalpha(s[(int(s.length())-1)])) {
const char ch = s[(int(s.length())-1)];
s = s.substr(0, s.length()-1);
s = process(s);
s += ch;
ans.push_back(s);
continue;
}
ans.push_back(process(s));
}
for (int i = 0; i<ans.size(); i++) {
cout << ans[i];
if (i != ans.size()-1) cout << " ";
}
cout << "\n";
}
}
//ZeroJudge E627
//Dr. SeanXD