本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了
I
; - 把原文中所有独立的
can you
、could you
对应地换成I can
、I could
—— 这里“独立”是指被空格或标点符号分隔开的单词; - 把原文中所有独立的
I
和me
换成you
; - 把原文中所有的问号
?
换成惊叹号!
; - 在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI:
和一个空格。
大模拟。 字符串问题,重要的就是要考虑 将字符串拆分成个体。
一开始只考虑 了 空格 和 非空格(没有想到标点符号也可以拆分词语)
所以最小的个体就是 单词了,标点符号只需要在每次结束之后判断一下,是不是标点符号,再进行添加即可。
注意几个坑点:(都是最基本元素的时候,出的问题)
1.输入只有一个标点符号,我们需要输出一个空格(题目要求必须有空格)
2. 输入都是空格的时候,也需要输出一个空格
3. 独立 的含义,就是 不可分,中间没有任何分隔符,一开始想的情况 ,比如 "can" you,输出应该是什么,还是原样输出,题目写的很明白。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rep(i,a,b) for(int i=a;i<b;++i)
const int N=1010;
char res[N];
string str;
char getCh(char ch){
if(ch=='I')return ch;
if(ch>='A'&&ch<='Z')ch=ch-'A'+'a';
if(ch=='?')return '!';
return ch;
}
int notSign(char ch){
if(ch>='A'&&ch<='Z')return 1;
if(ch>='a'&&ch<='z')return 1;
if(ch>='0'&&ch<='9')return 1;
return 0;
}
/*
10
don 't
*/
int notAdj(int p,char ch){
if(str[p-1]==ch)return 0;
return 1;
}
int main(){
int n;
scanf("%d",&n);
getchar();
rep(kase,0,n){
getline(cin,str);
cout<<str<<endl;
int len=str.length();
int p=0,q=0;
string preword="",word="";
while(p<len){
while(p<len&&str[p]==' ')p++;
int f=0;
word="";
while(p<len&¬Sign(str[p])){
if(f==0&¬Sign(str[p])){
if(q==0||q>0&¬Adj(p,res[q-1])){
f=1;
res[q++]=' ';
}
}
char ch=str[p++];
res[q++]=getCh(ch);
word+=res[q-1];
}
//cout<<"***"<<preword<<" "<<word<<endl;
//printf("%s\n",res);
if(word=="I"){
res[q-1]='y';
res[q++]='o';
res[q++]='u';
}else if(word=="me"){
res[q-2]='y';
res[q-1]='o';
res[q++]='u';
}else if(word=="you"&&preword=="can"){
q-=7;
res[q++]='I';
res[q++]=' ';
res[q++]='c';
res[q++]='a';
res[q++]='n';
}else if(word=="you"&&preword=="could"){
q-=9;
res[q++]='I';
res[q++]=' ';
res[q++]='c';
res[q++]='o';
res[q++]='u';
res[q++]='l';
res[q++]='d';
}
// printf("%s\n",res);
if(p<len&&str[p]!=' ')res[q++]=getCh(str[p++]);
preword=word;
// cout<<word<<" "<<preword<<endl;
}
//res[q]='\n';
//res[q+1]='\n';
printf("AI:");
if(q==0||res[0]!=' ')printf(" ");
rep(i,0,q)printf("%c",res[i]);
printf("\n");
}
return 0;
}