PTA | 估值一亿的AI核心代码

目录

题目:

输入格式:

输出格式:

输入样例:

输出样例:

代码:

无注释版:

有注释版: 


题目:

PTA | 估值一亿的AI核心代码_第1张图片

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出样例:

Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

代码长度限制16 KB,时间限制400 ms,内存限制64 MB,栈限制8192 KB

代码:

无注释版:
#include
using namespace std;
string s;
int a1[1010],a2[1010];
int b1[1010],b2[1010];
int main(){
	int n;
	cin>>n;
	getchar();
	for(int i=1;i<=n;i++){
		getline(cin,s);
		cout<='A'&&s[i]<='Z'&&s[i]!='I'){
				s[i]+=32;
			}
		}
		for(int i=0;i'9'&&s[i+1]<'A'||s[i+1]>'Z'&&s[i+1]<'a'||s[i+1]>'z'){
                	s.erase(s.begin()+i);  
				}  
            }
        }
		for(int i=0;;i++){
            i=s.find("can you",i);
            if(i==-1) break;
			if((i==0||s[i-1]<'0'||s[i-1]>'9'&&s[i-1]<'A'||s[i-1]>'Z'&&
			s[i-1]<'a'||s[i-1]>'z')&&(i+7==s.size()||s[i+7]<'0'||
			s[i+7]>'9'&&s[i+7]<'A'||s[i+7]>'Z'&&s[i+7]<'a'||s[i+7]>'z')){
				s.replace(i,7,"E can");
			}
        }
        for(int i=0;;i++){
            i=s.find("could you",i);
            if(i==-1) break;
			if((i==0||s[i-1]<'0'||s[i-1]>'9'&&s[i-1]<'A'||s[i-1]>'Z'&&
			s[i-1]<'a'||s[i-1]>'z')&&(i+9==s.size()||s[i+9]<'0'||
			s[i+9]>'9'&&s[i+9]<'A'||s[i+9]>'Z'&&s[i+9]<'a'||s[i+9]>'z')){
				s.replace(i,9,"E could");
			}
        }
        for(int i=0;;i++){
            i=s.find("I",i);
            if(i==-1) break;
			if((i==0||s[i-1]<'0'||s[i-1]>'9'&&s[i-1]<'A'||s[i-1]>'Z'&&
			s[i-1]<'a'||s[i-1]>'z')&&(i+1==s.size()||s[i+1]<'0'||
			s[i+1]>'9'&&s[i+1]<'A'||s[i+1]>'Z'&&s[i+1]<'a'||s[i+1]>'z')){
				s.replace(i,1,"you");
			}
        }
        for(int i=0;;i++){
            i=s.find("me",i);
            if(i==-1) break;
			if((i==0||s[i-1]<'0'||s[i-1]>'9'&&s[i-1]<'A'||s[i-1]>'Z'&&
			s[i-1]<'a'||s[i-1]>'z')&&(i+2==s.size()||s[i+2]<'0'||
			s[i+2]>'9'&&s[i+2]<'A'||s[i+2]>'Z'&&s[i+2]<'a'||s[i+2]>'z')){
				s.replace(i,2,"you");
			}
        }
		for(int i=0;i
有注释版: 
#include
using namespace std;

string s;  // 用来存储用户输入的字符串
int a1[1010], a2[1010];  // 数组用于记录空格的起始位置和长度
int b1[1010], b2[1010];  // 数组用于记录其他位置的空格处理

int main() {
    int n;  // 存储输入的行数
    cin >> n;  // 读取行数
    getchar();  // 读取并丢弃换行符

    // 处理每一行用户输入
    for (int i = 1; i <= n; i++) {
        getline(cin, s);  // 读取用户输入的一行
        cout << s << "\n";  // 原样输出用户输入

        // 删除字符串开头和结尾的空格
        while (s[0] == ' ') s.erase(0, 1);  // 删除开头的空格
        while (s[s.size() - 1] == ' ') s.erase(s.size() - 1, 1);  // 删除结尾的空格

        // 将大写字母转换为小写字母,除了 'I'
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'I') {
                s[i] += 32;  // 将大写字母转换为小写字母
            }
        }

        // 处理多余空格
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == ' ') {  // 遇到空格
                // 如果后面有连续的空格,删除它们
                while (s[i + 1] == ' ') s.erase(s.begin() + i + 1);
                // 如果空格后面不是字母或数字,删除空格
                if (s[i + 1] < '0' || s[i + 1] > '9' && s[i + 1] < 'A' || s[i + 1] > 'Z' && s[i + 1] < 'a' || s[i + 1] > 'z') {
                    s.erase(s.begin() + i);  // 删除多余的空格
                }
            }
        }

        // 将 "can you" 替换为 "I can"
        for (int i = 0;; i++) {
            i = s.find("can you", i);  // 查找 "can you"
            if (i == -1) break;  // 如果找不到,退出循环
            // 检查 "can you" 前后是否是独立单词
            if ((i == 0 || s[i - 1] < '0' || (s[i - 1] > '9' && s[i - 1] < 'A') || (s[i - 1] > 'Z' && s[i - 1] < 'a') || s[i - 1] > 'z')
                && (i + 7 == s.size() || s[i + 7] < '0' || (s[i + 7] > '9' && s[i + 7] < 'A') || (s[i + 7] > 'Z' && s[i + 7] < 'a') || s[i + 7] > 'z')) {
                s.replace(i, 7, "I can");  // 替换为 "I can"
            }
        }

        // 将 "could you" 替换为 "I could"
        for (int i = 0;; i++) {
            i = s.find("could you", i);  // 查找 "could you"
            if (i == -1) break;  // 如果找不到,退出循环
            // 检查 "could you" 前后是否是独立单词
            if ((i == 0 || s[i - 1] < '0' || (s[i - 1] > '9' && s[i - 1] < 'A') || (s[i - 1] > 'Z' && s[i - 1] < 'a') || s[i - 1] > 'z')
                && (i + 9 == s.size() || s[i + 9] < '0' || (s[i + 9] > '9' && s[i + 9] < 'A') || (s[i + 9] > 'Z' && s[i + 9] < 'a') || s[i + 9] > 'z')) {
                s.replace(i, 9, "I could");  // 替换为 "I could"
            }
        }

        // 将独立的 "I" 替换为 "you"
        for (int i = 0;; i++) {
            i = s.find("I", i);  // 查找 "I"
            if (i == -1) break;  // 如果找不到,退出循环
            // 检查 "I" 前后是否是独立单词
            if ((i == 0 || s[i - 1] < '0' || (s[i - 1] > '9' && s[i - 1] < 'A') || (s[i - 1] > 'Z' && s[i - 1] < 'a') || s[i - 1] > 'z')
                && (i + 1 == s.size() || s[i + 1] < '0' || (s[i + 1] > '9' && s[i + 1] < 'A') || (s[i + 1] > 'Z' && s[i + 1] < 'a') || s[i + 1] > 'z')) {
                s.replace(i, 1, "you");  // 替换 "I" 为 "you"
            }
        }

        // 将独立的 "me" 替换为 "you"
        for (int i = 0;; i++) {
            i = s.find("me", i);  // 查找 "me"
            if (i == -1) break;  // 如果找不到,退出循环
            // 检查 "me" 前后是否是独立单词
            if ((i == 0 || s[i - 1] < '0' || (s[i - 1] > '9' && s[i - 1] < 'A') || (s[i - 1] > 'Z' && s[i - 1] < 'a') || s[i - 1] > 'z')
                && (i + 2 == s.size() || s[i + 2] < '0' || (s[i + 2] > '9' && s[i + 2] < 'A') || (s[i + 2] > 'Z' && s[i + 2] < 'a') || s[i + 2] > 'z')) {
                s.replace(i, 2, "you");  // 替换 "me" 为 "you"
            }
        }

        // 将 "?" 替换为 "!" 的处理
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == 'E') s[i] = 'I';  // 替换 'E' 为 'I'
            if (s[i] == '?') s[i] = '!';  // 替换 '?' 为 '!'
        }

        // 输出 AI 的回答
        cout << "AI: " << s << "\n";
    }

    return 0;
}

你可能感兴趣的:(PTA,算法,c++,数据结构)