赞
踩
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
1、无论用户说什么,首先把对方说的话在一行中原样打印出来;
2、消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
3、把原文中所有大写英文字母变成小写,除了 I;
4、把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
5、把原文中所有独立的 I 和 me 换成 you;
6、把原文中所有的问号 ? 换成惊叹号 !;
7、在一行中输出替换后的句子作为 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
这题说真的恶心,要考虑的情况较多,疯狂特判的感觉
(菜是原罪…,请让我慢慢诉说其中细节吧)
用题目要求将原文转换为 AI 回答
①、题目要求消除原文中多余空格,把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉。
策略:为了方便删除空格,这里我利用 stringstream 流对字符串以空格进行截取,得到每一个非空格的“单词”(包括一些奇怪的符号,但一定要是有效字符,这里也是一个坑)。
while(getline(ss, tmp, ' ')){
if(tmp[0]>32) //保证dc中一定是有效字符
dc[x++]=tmp;
}
②、题目要求把原文中所有大写英文字母变成小写,除了 I。
策略:直接扫描字符串,将全部字母字符串转换为小写,当然这里要除了 ‘I’ 以及所有的问号 ? 换成惊叹号 !。(记住一定要转换了,再去判断有没有独立 me或者 you can 或者 you could,我之前就是卡死在这里)
for(int i=0; i<x; i++){
for(int j=0; j<dc[i].size(); j++){
if(dc[i][j]>='A'&&dc[i][j]<='Z'
&&dc[i][j]!='I')
dc[i][j] = dc[i][j]+32;
if(dc[i][j]=='?')
dc[i][j] = '!';
}
}
③、题目要求把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词。(记住一定要先转换字母小写了,再判断有没有独立 me或者 you can 或者 you could,我之前就是卡死在这里)
策略:还是扫描每个单词的字符,若符合条件 can you 或 could you 被空格或标点符号分隔开,则替换为 I can 或 I could 。这里也有个坑,就是 you 后面是否存在的有效字符,若存在那就直接替换,否则就要跳过一个单词,避免出现重复替换。
(重复替换,例如原文:can you you you 替换后 I I I can,这样是错误的,我们需要避免这种情况)
if(dc[i][j]=='c'){
//单独的 can you
if(dc[i].substr(j)=="can"
&&dc[i+1].substr(0,3)=="you")
if((dc[i+1].size()>3&&dc[i+1][3]<=47)
||dc[i+1].size()==3)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。