以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI 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

ps : 这题目非常非常非常的细节,因为他给的条件单个看着还好,但连在一起就很刁钻,而且有存在漏洞(标注在原稿)

简洁版代码

#include<iostream>
#include<cstring>
using namespace std;
#define Change s2[len2++]='y',s2[len2++]='o',s2[len2++]='u';continue;  // I 与 me 转换记入
int main()
{char s1[10001],s2[10001]; // 注意字符串要够大,不然会有测试点过不了int num,flag;cin >> num;getchar();//  开始数据读入 num 次while (num--){int len1,len2=0;cin.getline(s1,1001);cout << s1 << endl;/*  去掉头尾空格  */for(flag=0 ; flag<strlen(s1) ; flag++) if(s1[flag]!=' ') break;strcpy(s1,s1+flag);for(flag=strlen(s1)-1 ; flag>=0; flag--) if(s1[flag]!=' ') break;s1[flag+1] = '\0';//  初步处理: 去掉多余空格 ,大小转小写 , ? -> !len1 = strlen(s1);for(int z=0;z<len1;z++){if(s1[z]>='A' && s1[z]<='Z' && s1[z]!='I') s1[z] += 32;if(s1[z]=='?') s1[z] = '!';if(s1[z]==' ' && isalnum(s1[z+1])==0) continue;s2[len2++] = s1[z];}s2[len2]= '\0';strcpy(s1,s2);  // s1 = s2len1 = len2; len2 = 0;/*  开始核心判断  */for(int z=0;z<len1;z++){// 判断 Iif(s1[z]=='I' && isalnum(s1[z-1])==0 && isalnum(s1[z+1])==0){Change;}// 判断 meif(strstr(s1+z,"me")==s1+z && isalnum(s1[z-1])==0 && isalnum(s1[z+2])==0){z++;Change  }// 判断 can youif(strstr(s1+z,"can you")==s1+z && isalnum(s1[z-1])==0 && isalnum(s1[z+7])==0){s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='a',s2[len2++]='n';z+=6 ;continue;  }// 判断 could youif(strstr(s1+z,"could you")==s1+z && isalnum(s1[z-1])==0 && isalnum(s1[z+9])==0){s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='o',s2[len2++]='u',s2[len2++]='l',s2[len2++]='d';z+=8 ;continue;  }// 上述判断都不符合,直接存入s2[len2++] = s1[z];}//  AI : 回答输出s2[len2] = '\0';cout << "AI: " << s2 << endl;}return 0;
}

这是本人的原稿,个人认为这个才是考虑最全面的AC

#include<iostream>
#include<cstring>
using namespace std;
#define Change_I s2[len2++]='y',s2[len2++]='o',s2[len2++]='u';continue;  // I 与 me 转换记入
#define Change_1 s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='a',s2[len2++]='n'; // can you 转换记入
#define Change_2 s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='o',s2[len2++]='u',s2[len2++]='l',s2[len2++]='d'; // could you 转换记入操作
bool Flag_I(char s1[10001], int z);
bool Flag_M(char s[10001], int z);
int main()
{char s1[10001],s2[10001]; // 注意字符串要够大,不然会有测试点过不了int num,flag;cin >> num;getchar();//  开始数据读入 num 次while (num--){int len1,len2=0;cin.getline(s1,1001);cout << s1 << endl;/*  去掉头尾空格  */for(flag=0 ; flag<strlen(s1) ; flag++) if(s1[flag]!=' ') break;strcpy(s1,s1+flag);for(flag=strlen(s1)-1 ; flag>=0; flag--) if(s1[flag]!=' ') break;s1[flag+1] = '\0';//  初步处理: 去掉多余空格 ,大小转小写 , ? -> !len1 = strlen(s1);for(int z=0;z<len1;z++){if(s1[z]>='A' && s1[z]<='Z' && s1[z]!='I') s1[z] += 32;if(s1[z]=='?') s1[z] = '!';if(s1[z]==' ' && isalnum(s1[z+1])==0) continue;s2[len2++] = s1[z];}s2[len2]= '\0';strcpy(s1,s2);len1 = len2; len2 = 0;//  开始核心判断for(int z=0;z<len1;z++){if(s1[z]=='I') if(Flag_I(s1,z)) {Change_I}if(s1[z]=='m') if(Flag_M(s1,z)) {z++;Change_I}if(strstr(s1+z,"can you")==s1+z){if(len1==7)                                           {Change_1;z+=6;continue;}if(z==0 && isalnum(s1[z+7])==0)                    {Change_1;z+=6;continue;}if(z==len1-7 && isalnum(s1[z+7])==0)               {Change_1;z+=6;continue;}if(isalnum(s1[z-1])==0 && isalnum(s1[z+7])==0)  {Change_1;z+=6;continue;}}if(strstr(s1+z,"could you")==s1+z){if(len1==9)                                            {Change_2;z+=8;continue;}if(z==0 && isalnum(s1[z+9])==0)                     {Change_2;z+=8;continue;}if(z==len1-9 && isalnum(s1[z+9])==0)                {Change_2;z+=8;continue;}if(isalnum(s1[z-1])==0 && isalnum(s1[z+9])==0)   {Change_2;z+=8;continue;}}s2[len2++] = s1[z];}//  AI : 回答输出s2[len2] = '\0';cout << "AI: " << s2 << endl;}return 0;
}
bool Flag_M(char s[10001], int z) {int len = strlen(s);if(len<2 || z==len || s[z+1]!= 'e') return false;if(len==2) return true;if(z==0 && isalnum(s[z+2])==0) return true;else if(z==len-2 && isalnum(s[z-1])==0) return true;elseif(isalnum(s[z-1])==0 && isalnum(s[z+2])==0 ) return true;return false;
}
bool Flag_I(char s[10000], int z) {int len = strlen(s);
//    if(len==1) return true; // 答案没有考虑一句只有一个 I 的情况,所有这句没写也是对的
//     else
if(z==0 && isalnum(s[z+1])==0) return true;else if(z==len-1 && isalnum(s[z-1])==0) return true;else if(len>2 && isalnum(s[z-1])==0 && isalnum(s[z+1])==0) return true;return false;
}

估值一亿的AI核心代码(简洁详细过程+题目存在漏洞)相关推荐

  1. 7-118 估值一亿的AI核心代码 (20 分)

    7-118 估值一亿的AI核心代码 (20 分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除 ...

  2. L1-064 估值一亿的AI核心代码——按照规则逐一击破

    一.题目 估值一亿的AI核心代码 二.分析 1.消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉: 判断是否为符号 bool If(char ...

  3. 7-8 估值一亿的AI核心代码 (20 分) 代码有解析

    7-8 估值一亿的AI核心代码 (20 分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文 ...

  4. 估值一亿的AI核心代码 (20分)

    估值一亿的AI核心代码 (20分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格 ...

  5. PTA 估值一亿的AI核心代码 (20 分)

    估值一亿的AI核心代码 (20 分) AI.jpg 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消 ...

  6. 【PTA-训练day16】L2-028 秀恩爱分得快 + L1-064 估值一亿的AI核心代码

    !L2-028 秀恩爱分得快 - 分块大模拟 PTA | 程序设计类实验辅助教学平台 这个题还是挺考验 函数合理运用 和 数据模拟处理能力 的 思路: 因为可能出现-0这种输入 所以不能是int型 s ...

  7. 估值一亿的AI核心代码现已开源

    package ai.core;import java.util.Scanner;/*** @description: AI核心代码*/ public class AiMain {public sta ...

  8. L1-064 估值一亿的AI核心代码(C++)

    以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...

  9. L1-064 估值一亿的AI核心代码 (20 分)-PAT 团体程序设计天梯赛 GPLT

    本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部 ...

最新文章

  1. 【c语言】判断一个数是否为素数
  2. HTML开发中的一个问题
  3. 什么是“缓存友好”代码?
  4. BZOJ3862Little Devil I——树链剖分+线段树
  5. linux下安装使用libuuid(uuid-generate)
  6. 【渝粤题库】陕西师范大学201981教育统计与测量 作业 (专升本、高起本)
  7. 在下拉菜单中,传递的value参数为 id时,如何拿到其 label值?
  8. argparse模块---解析命令行参数
  9. [蓝桥杯][2018年第九届真题]全球变暖
  10. linux7 开启端口,常用CentOS7系统防火墙开启设置和开放端口方法
  11. 京东宙斯php版本sdk不能用_多主机平台玩家的福音,北通宙斯T6精英版体验测评...
  12. ip_conntrack 模块的作用
  13. 【转】利用匿名namespace解决C++中重复定义的问题
  14. cvte软件测试在线测评,CVTE笔试题总结归纳
  15. win10安装IIS及操作使用
  16. ISCSI,FC,FCoE 存储rescan 连接的方法
  17. 华为手机usb调试打开后自动关闭怎么办?华为手机 usb调试为什么自动关闭?usb调试老是自动关闭怎么回事?...
  18. 解决SVN造成的桌面图标问号
  19. 康托尔点集matlab实数,康托尔集是什么。详细解释
  20. 【论文阅读】Zero-Resource Knowledge-Grounded Dialogue Generation

热门文章

  1. 视频缓存文件(.tdl)合并为新的视频文件(.mp4)
  2. APISIX 如何与 Hydra 集成,搭建集中认证网关助力企业安全
  3. 在 .NET 中使用 Web API 连接到 MongoD
  4. 【mahout笔记】初步理解userCF(基于用户的推荐算法)在mahout的实现
  5. SSL/TLS证书过期了怎么办?
  6. Android突破64K限制
  7. 基于HTML(甜品奶茶店)餐饮美食项目的设计与实现(html前端源码和论文设计)
  8. html5注册的正则表达,正则表达式-创建正则表达式
  9. 2018:秋清集·跋
  10. unity 小任务一之点击方块变色