L1-064 估值一亿的AI核心代码 (20 分)
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 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
第四次天梯赛的L1 - 8。相信死磕这道题的小伙伴们大多都亏本了(大佬除外哈),反正我是写了一个多小时最后才拿了1分…
水平不够,最终写了100多行,请各位大佬们见谅。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <climits>
#include <string>
using namespace std;
typedef long long LL;
#define debug(x, y) cout<<x<<" "<<y<<endl
#define nl cout<<endl
#define fy cout<<"------"<<endl
const int maxn = 1010;
bool fuhao(char ch) {///空格与半角符号均为true
if(ch>='0'&&ch<='9') return false;
else if(ch=='I') return false;
else if(ch>='a'&&ch<='z') return false;
return true;
}
///独立则单词前后没有字母
int cok(char s[], int i) {///can you 与could you 是否独立
i--;
///判断c前面的字符,c前面可以什么也没有或者有一个空格
if(i>=0&&s[i]!=' ') return 0;
i++;
///can you独立,返回1
///注意单词后面的字符可以是半角符号、空格后者结束符'\0'
if(s[i+1]=='a'&&s[i+2]=='n'&&s[i+3]==' '&&s[i+4]=='y'&&s[i+5]=='o'&&s[i+6]=='u'&&fuhao(s[i+7])) return 1;
///could you独立, 返回2
if(s[i+1]=='o'&&s[i+2]=='u'&&s[i+3]=='l'&&s[i+4]=='d'&&s[i+5]==' '&&s[i+6]=='y'&&s[i+7]=='o'&&
s[i+8]=='u'&&fuhao(s[i+9])) return 2;
return 0;
}
///同cok
bool iok(char s[], int i) {///I是否独立
i--;
if(i>=0&&s[i]!=' ') return false;
i++;
if(fuhao(s[i+1])) return true;
else return false;
}
///同cok
bool meok(char s[], int i) {///me是否独立
i--;
if(i>=0&&s[i]!=' ') return false;
i++;
if(s[i+1]!='e') return false;
if(fuhao(s[i+2])) return true;
else return false;
}
void work(char c[], int lenc) {
int si=0, ei=lenc-1;
while(c[si]==' ') si++;///去字符串的前空格
while(c[ei]==' ') ei--;///去字符串的后空格
/**
下面将字符串中单词/符号之间多余的空格去掉,半角符号前后先留
一个空格不去(当然如果给的字符串符号前没有空格,那也不用加啊
,比如最后一个样例),大写转为小写(I除外)。
**/
char s[maxn];
memset(s, '\0', sizeof(s));
int k=0;
for(int i=si; i<=ei; i++) {
if(c[i]=='I') s[k++]=c[i];
else if(c[i]>='A'&&c[i]<='Z') s[k++]=c[i]+'a'-'A';
else if(c[i]==' ') {
s[k++]=c[i];
while(c[i]==' ') i++;///只要一个空格
i--;
} else s[k++]=c[i];
}
s[k]='\0';
for(int i=0; i<k; i++) {
if(s[i]=='c') {
int wordi=cok(s, i);
if(wordi==1) {
printf("I can");
i+=6;///第i+6是u
} else if(wordi==2) {
printf("I could");
i+=8;///第i+8是u
} else printf("c");
} else if(s[i]=='I') {
if(iok(s, i)) printf("you");
else printf("I");
} else if(s[i]=='m') {
if(meok(s, i)) {
printf("you");
i++;///第i+1是e
} else printf("m");
} else if(s[i]==' ') {
if(fuhao(s[i+1])) continue;
else printf(" ");
} else if(s[i]=='?')printf("!");
else printf("%c", s[i]);
}
nl;
///fy;
///printf("%s\n", s);
}
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
int k=0;
char ch, s[maxn];
while(scanf("%c", &ch), ch!='\n') s[k++]=ch;
s[k]='\0';
printf("%s\nAI: ", s);
work(s, k);
}
return 0;
}