团体程序设计天梯赛 L1-064 估值一亿的AI核心代码

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;
} 

发布了123 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104751060
今日推荐