ZeroJudge E627: Pig-Latin

同題: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.
ZeroJudge E627 範例測資

解題思路

使用 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

發佈留言