7-78 估值一亿的AI核心代码 (20分)
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了 I;
把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
把原文中所有独立的 I 和 me 换成 you;
把原文中所有的问号 ? 换成惊叹号 !;
在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。
具体解析见代码:
#include<bits/stdc++.h>
using namespace std;
void replace(char s[], char s1[], char s2[]){
char str[2000]={};
char *p=s,*q=s,*r=str;
while(p=strstr(p,s1)){
if(p-s!=0&&isalpha(*(p-1))||isalpha(*(p+strlen(s1)))){ //比如ccan you或者can youu,不符合条件,则跳过
p++; continue;
}
while(q!=p) *r++=*q++; //将要改变的字符串前面的字符也赋值过去
for(int i=0; s2[i]; i++){ //s2赋值过去
*r++=s2[i];
}
p += strlen(s1);//再变换后的位置,接着进行搜索要变换的字符串
q = p; //更新q的位置
}
while(*q) *r++=*q++;//将最后的字符,赋值过去
*r=0;
strcpy(s, str); //将改变后的字符串更新
}
void solve(char s[]){
char str[2000]={};
int i=0,k=0;
for(; s[i]==' '; i++); //消除字符串前面的空格
for(; s[i]; i++){
if(s[i]==' '&&!isalpha(s[i+1])&&!isdigit(s[i+1])) continue; //将多余的空格去掉,包括去掉‘,’前的空格
if(s[i]=='?') s[i] = '!';
if(isupper(s[i])&&s[i]!='I') s[i] = tolower(s[i]);
str[k++]=s[i];
}
replace(str,"I","S"); //先将I替换为S,防止将I can中的I变成了you
replace(str,"can you","I can");
replace(str,"could you","I could");
replace(str,"me", "you");
replace(str,"S","you");
cout << "AI: ";
puts(str);
}
int main(){
char s[2000];
int n;
cin >> n;
getchar();
while(n--){
cin.getline(s,2000);
puts(s);
solve(s);
}
return 0;
}
欢迎大家批评改正!!!