L1-064 估值一亿的AI核心代码
题目链接-L1-064 估值一亿的AI核心代码
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 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
解题思路
正则表达式牛逼!!!
- 具有特殊意义的元字符
符号 | 作用 |
---|---|
\ | 能够改变字符原本的含义 |
^ | 指示字符串的头,且要求字符串以字符开头,^ 表示一个真正的^符号 |
$ | 指示字符串的尾,且要求字符串以字符结尾,$表示一个真正的$符号 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’ |
\< | 匹配单词开头位置 |
\> | 匹配单词结尾位置 |
| | 连接两个子表达式,表示或的关系,a|b,a与b中只能取一个 |
. | 表示一个除了\n以外的任意一个字符,\.表示一个真正的.符号 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’ |
-
量词元字符
-
字符串模拟,
regex_place()
替换 -
具体操作见代码,思路见注释
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
cin.ignore();
while(n--) {
string s;
getline(cin,s);
cout<<s<<endl;
s=regex_replace(s,regex("(\\s+)")," ");//删除连续的多余空格
if(s.front()== ' ')
s.erase(s.begin());//删除字符串行首的空格
if(s.back()==' ')
s.pop_back();//删除字符串行末的空格
s=regex_replace(s,regex("( !)"),"!");//删除!前的空格
s=regex_replace(s,regex("( ,)"),",");//删除,前的空格
s=regex_replace(s,regex("( \\.)"),"."); //删除.前的空格
s=regex_replace(s,regex("( \\?)"),"?"); //删除?前的空格
s=regex_replace(s,regex("( ')"),"'");//删除'前的空格
for(auto &c:s)
if(c!='I') //除了I的字母
c=tolower(c);//转化为小写字母
s=regex_replace(s,regex("(\\bcan you\\b)"),"_I can");//将can you替换为I can
s=regex_replace(s,regex("(\\bcould you\\b)"),"_I could");//将could you替换为I could
s=regex_replace(s,regex("(\\bI\\b)"),"you");//将I替换为you
s=regex_replace(s,regex("(\\bme\\b)"),"you");//将me替换为you
s=regex_replace(s,regex("(\\?)"),"!");//将?替换为!
s=regex_replace(s,regex("(\\b_I\\b)"),"I");//为了避免重复替换而设置的_I换回I
cout<<"AI: "<<s<<endl;
}
return 0;
}