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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
以下是我的代码,第一次提交只有测试点5过不了,但是调试了好几次都找不出来测试点5是什么,有没有大佬救救我!感激不尽!
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
int n,kongge=0;
char x;
scanf("%d",&n);
x=getchar();//吸收多余的换行符
int i,j,k,count=0;
char s1[1001],s2[1001];
for(i=0;i<n;i++)
{
gets(s1);//输入
puts(s1);//先按原话输出
printf("AI: ");
for(j=0;s1[j]!='\0';j++)
{
if(s1[j]==' ')
s1[j]='*';
else break;
}//记字符串开头空格为*
for(j=0;s1[j]!='\0';j++)
{
if(s1[strlen(s1)-1-j]==' ')
s1[strlen(s1)-1-j]='*';
else break;
}//记字符串末尾空格为*
for(j=0;s1[j]!='\0';j++)
{
if(s1[j]=='*') continue;
if(s1[j]==' ')
{
count=1;
kongge=1;
}
if(kongge)
{
while(s1[j]!='\0')
{
if(s1[j+1]==' ')
{
s1[j+1]='*';//记字符串中间的多余空格为*
count++;
}
else
{
kongge=0;
break;
}
j++;
}
if(isalnum(s1[j+1])==0&&s1[j+1]!=' '&&s1[j+1]!='*'&&count)
s1[j+1-count]='*';//把标点符号前剩下的一个的空格变为*
count=0;
}
if(isupper(s1[j])&&s1[j]!='I')
s1[j]+=32;//大写的字母改为小写
if(s1[j]=='?')
s1[j]='!';//问号改为感叹号
}
for(k=j=0;s1[j]!='\0';j++)
{
if(s1[j]!='*')
s2[k++]=s1[j];//空格已经换成了*,即把去空格后的字符串s1赋值给s2
}
s2[k]='\0';
/*******************************输出并完成规则4和5****************************/
for(j=0;s2[j]!='\0';j++)
{
if(s2[j]=='c'&&s2[j+1]=='o'&&s2[j+2]=='u'&&s2[j+3]=='l'&&s2[j+4]=='d')
if(s2[j+5]==' '&&s2[j+6]=='y'&&s2[j+7]=='o'&&s2[j+8]=='u')
{
printf("I could");
j+=8;
continue;
}//could you 改为 I could
if(isalnum(s2[j-1])==0&&s2[j]=='m'&&s2[j+1]=='e'&&isalnum(s2[j+2])==0)
{
printf("you");
j+=1;
continue;
}//独立的 me 改为 you
if(isalnum(s2[j-1])==0&&s2[j]=='I'&&isalnum(s2[j+1])==0)
{
printf("you");
continue;
}//独立的I 改为 you
if(s2[j]=='c'&&s2[j+1]=='a'&&s2[j+2]=='n'&&s2[j+3]==' ')
if(s2[j+4]=='y'&&s2[j+5]=='o'&&s2[j+6]=='u')
{
printf("I can");
j+=6;
continue;
}//can you 改为 I can
putchar(s2[j]);//其他原样输出
}
printf("\n");
}
return 0;
}