本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了
I
; - 把原文中所有独立的
can you
、could you
对应地换成I can
、I 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
我真的写了好久好久
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;
priority_queue<int,vector<int>,greater<int>>q;
const int mod=10e9+7;
string s;
int is_eors(char c)
{
if(isdigit(c)||isalpha(c))
return 0;
if(c==' ')
return 1;
return 2;
}
void check()
{
int len=s.size();
int is_empty=true;
for(int i=0;i<len;i++)
{
if(s[i]!=' ')
is_empty=false;
}
if(is_empty==true)
{
cout<<endl;
return;
}
for(int i=0;i<len;i++)
{
if(isalpha(s[i])&&!islower(s[i])&&s[i]!='I')
{
s[i]+=32;
}
if(s[i]=='?')
s[i]='!';
}
string nsp=" ";
for(int i=0;i<len;i++)
{
if(s[i]==' '&&s[i-1]==' ')
continue;
else
nsp+=s[i];
}
nsp+=' ';
len=nsp.size();
string out="";
for(int i=0;i<len;i++)
{
out+=nsp[i];
if(nsp[i+1]=='I'&&is_eors(nsp[i])>0&&is_eors(nsp[i+2])>0)
{
i++;
out+="you";
}
else if(nsp[i+1]=='m'&&nsp[i+2]=='e'&&is_eors(nsp[i])>0&&is_eors(nsp[i+3])>0)
{
i+=2;
out+="you";
}
else if(nsp[i+1]=='c'&&nsp[i+2]=='a'&&nsp[i+3]=='n'&&nsp[i+5]=='y'&&nsp[i+6]=='o'&&nsp[i+7]=='u'&&is_eors(nsp[i])>0&&is_eors(nsp[i+8])>0)
{
i+=7;
out+="I can";
}
else if(nsp[i+1]=='c'&&nsp[i+2]=='o'&&nsp[i+3]=='u'&&nsp[i+4]=='l'&&nsp[i+5]=='d'&&nsp[i+7]=='y'&&nsp[i+8]=='o'&&nsp[i+9]=='u'&&is_eors(nsp[i])>0&&is_eors(nsp[i+10])>0)
{
i+=9;
out+="I could";
}
}
len=out.size();
for(int i=len-1;i>=0;i--)
{
if(out[i]!=' ')
{
len=i;
break;
}
}
int t=0;
for(int i=0;i<=len;i++)
{
if(i>0&&out[i]==' '&&is_eors(out[i+1])==2)
continue;
else if(out[i]!=' ')
{
cout<<out[i];
t++;
}
else if(out[i]==' '&&t>0)
{
cout<<" ";
}
}
cout<<endl;
}
int main()
{
int N;
cin>>N;
getchar();
for(int i=0;i<N;i++)
{
getline(cin,s);
cout<<s<<endl;
cout<<"AI: ";
check();
}
return 0;
}
int is_eors(char c)//is empty or symbol,必须写,用来给字符分类
{
if(isdigit(c)||isalpha(c))
return 0;
if(c==' ')
return 1;
return 2;
}
isalpha()函数:判断字符是否为英文字母
islower()函数:判断字符是否为小写字母
isdigit()函数:判断字符是否为数字
1⃣️判断句子是否全为empty
2⃣️大写替换为小写 and ?替换为!
3⃣️nsp(not_space)去掉多余空格
❀在nsp的开始和末尾都加上空字符,来应对下面对I或者me等的替换
string nsp=" ";
for(int i=0;i<len;i++)
{
if(s[i]==' '&&s[i-1]==' ')
continue;
else
nsp+=s[i];
}
nsp+=' ';
4⃣️out进行单词和词组的替换
❀只需要拷贝到新的字符串并且跳过原字符串的替换部分
if(nsp[i+1]=='I'&&is_eors(nsp[i])>0&&is_eors(nsp[i+2])>0)
{
i++;
out+="you";
}
5⃣️去掉尾部空格
for(int i=len-1;i>=0;i--)
{
if(out[i]!=' ')
{
len=i;
break;
}
}
for(int i=0;i<=len;i++)
6⃣️去掉首部空格及特殊字符前空格并输出
int t=0;
for(int i=0;i<=len;i++)
{
if(i>0&&out[i]==' '&&is_eors(out[i+1])==2)//跳过特殊字符前空格
continue;
else if(out[i]!=' ')
{
cout<<out[i];
t++;
}
else if(out[i]==' '&&t>0)//跳过首部空格
{
cout<<" ";
}
}