当前位置:   article > 正文

团体程序设计天梯赛 L1-064 估值一亿的AI核心代码_天梯赛的ai英文问答程序源代码

天梯赛的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出样例:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
解题思路

正则表达式牛逼!!!

  • 具有特殊意义的元字符
符号作用
\能够改变字符原本的含义
^指示字符串的头,且要求字符串以字符开头,^ 表示一个真正的^符号
$指示字符串的尾,且要求字符串以字符结尾,$表示一个真正的$符号
\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;
} 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/376707
推荐阅读
相关标签
  

闽ICP备14008679号