PTA L1-064 估值一亿的AI核心代码
PTA L1-064 估值一亿的AI核心代码
有坑!不少
题目及分析
题目:
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
1. 无论用户说什么,首先把对方说的话在一行中原样打印出来;
2. 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
3. 把原文中所有大写英文字母变成小写,除了 I;
4. 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
5. 把原文中所有独立的 I 和 me 换成 you;
6. 把原文中所有的问号 ? 换成惊叹号 !;
7. 在一行中输出替换后的句子作为 AI 的回答
直接思路(有BUG)
首先按照规则一对一的想出解决方案:
- 首先直接输出原话(废话)
- 然后删除多余空格
2.1 先删除行首行尾空格,用while一直判断是否为空格就行
2.2 单词间和符号前的空格,遍历字符串,找到空格后,如果下一个也是空格,就删除当前空格;如果下一个为标点符号或者单词,就不删除 - 遍历字符串,将大写英文字母转换为小写,'I' 不做处理
- 找到空格或者标点符号后的can you,could you,然后替换为 I can,I could(坑点来袭,下面会介绍坑点)
- 基本同4 空格或者标点符号后的I,me 替换为you
- 遍历字符串,将?替换为!
- 输出处理结果
逻辑分析一波
执行顺序应该为1->2.1->2.2,3,6->4,5->7
坑点
- 执行顺序处:处理空格和大小写不能和替换放在一个循环中!!!不然空格+大小写不好替换
- 替换字符串时,替换的必须是 独立 的字符串!!!如can you前面和后面都必须是空格或者是字符串,但是有一种特殊情况! can you在字符串的末尾,所以需要对这种也要处理
- 特殊情况:当两个标点符号中有许多空格,按照规则来说,输出的时候中间是不留空格的!输出时需注意!!!判断当前位如果是空格,并且是下一位是符号,不输出此空格。
AC代码
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
//@date: 2020-02-01 11:58:40
//@state:YES
int judge(char c)
{//判断传入的字符是什么
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
return 1;//字母
else if(c>='0'&&c<='9')
return 2;//数字
else if(c==' ')
return 0;//空格
else if(c>=33&&c<=126)
return -1;//标点符号
return 99;//默认值
}
string AI(string ask)
{//返回处理结果
//删除行首空格
while(ask[0]==' ')
ask.erase(ask.begin());
//删除行尾空格
while(ask[ask.size()-1]==' ')
ask.erase(ask.end()-1);
for(int i=0;i<ask.size();i++)
{
//大写变小写
if(ask[i]>='A'&&ask[i]<='Z'&&ask[i]!='I')
ask[i]+=32;
//?->!
if(ask[i]=='?')
ask[i]='!';
//删除多余空格
if(ask[i]==' ')
{
int j=i+1;
while(ask[j]==' ') j++;
ask.erase(ask.begin()+i+1,ask.begin()+j);//此处参数必须为迭代器,int不行
}
}
//替换字符串
for(int i=0;i<ask.size();i++)
{
if(i==0)
{
if(ask[i]=='I'&&(judge(ask[i+1])<=0||i+1==ask.size()))
ask.replace(i,1,"you");
else if(ask.substr(i,2)=="me"&&(judge(ask[i+2])<=0||i+2==ask.size()))
ask.replace(i,2,"you");
else if(ask.substr(i,7)=="can you"&&(judge(ask[i+7])<=0||i+7==ask.size()))
ask.replace(i,7,"I can");
else if(ask.substr(i,9)=="could you"&&(judge(ask[i+9])<=0||i+9==ask.size()))
ask.replace(i,9,"I could");
}
if(judge(ask[i])<=0)
{
if(judge(ask[i+1])==1)//字母
{
if(ask[i+1]=='I'&&(judge(ask[i+2])<=0||i+2==ask.size()))
ask.replace(i+1,1,"you");
if(ask.substr(i+1,2)=="me"&&(judge(ask[i+3])<=0||i+3==ask.size()))
ask.replace(i+1,2,"you");
if(ask.substr(i+1,7)=="can you"&&(judge(ask[i+8])<=0||i+8==ask.size()))
ask.replace(i+1,7,"I can");
if(ask.substr(i+1,9)=="could you"&&(judge(ask[i+10])<=0||i+10==ask.size()))
ask.replace(i+1,9,"I could");
}
}
}
return ask;
}
int main()
{
int n;
string ask,ans;
cin>>n;
cin.get();
while(n--)
{
getline(cin,ask);
cout<<ask<<endl;
ans=AI(ask);
cout<<"AI: ";
for(int i=0;i<ans.size();i++)
{
//判断符号+空格+符号的特殊情况
if(ans[i]==' '&&judge(ans[i+1])<=0)
continue;
else
cout<<ans[i];
}
cout<<endl;
}
return 0;
}
PTA L1-064 估值一亿的AI核心代码的更多相关文章
- PTA --- 天梯赛 L1-064 估值一亿的AI核心代码
L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...
- L1-064 估值一亿的AI核心代码 (20 分)
L1-064 估值一亿的AI核心代码 (20 分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: ...
- L1-064 估值一亿的AI核心代码 (20分)
L1-064 估值一亿的AI核心代码 (20分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除 ...
- PTA 估值一亿的AI核心代码
题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...
- PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)
Update:smz说regex秒过Orz,yzd记在这里了. 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校 ...
- L1-064 估值一亿的AI核心代码
以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...
- go & AI核心代码
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...
- win10安装PS和AI后报代码为16的错误解决方法
win10安装PS和AI后报代码为16的错误解决方法 一.总结 一句话总结:修改兼容性和以管理员方式运行就可以了 修改兼容性 以管理员身份运行 二.PS和AI安装后报代码为16的错误解决方法介绍(转) ...
- AI写代码! 神器copilot介绍+安装+使用
!郑重提示!!!!!!!: 正在学编程.算法的同学请千万不要依赖此插件,否则你可能甚至无法手写出一个for循环 AI帮我写代码?我帮AI写代码?庄周梦蝶?蝶梦庄周?十分梦幻. copilot在VSco ...
随机推荐
- Kafka 管理【主题、分区、消费者组】
更多内容,前往 IT-BLOG 主题操作 使用 kafka-topics.sh 工具可以执行主题的大部分操作.可以用它创建.修改.删除和查看集群里的主题.要使用该工具的全部功能,需要通过 --zook ...
- XAML 设计器已意外退出。(退出代码: e0434352)
一.前言 开门见山,这个问题我遇到过两次,第一次因为项目刚开始不长时间,我查了很长时间都没解决,然后就直接重写了,几乎一样的写法,但问题没复现了,但程序员思维告诉我,一定还是有比较关键的地方出现了问题 ...
- Win11右键菜单改回传统样式
Win11右键菜单,比较不人性化,隐藏了一些常用选项,需要点"更多选项"才能显示,多次一举. 解决方法,一句话: reg.exe add "HKCU\Software\C ...
- Node.js中理解asyncmap函数 ,爬取王者荣耀荣耀官网壁纸400多张
async/mapLimit函数理解 const phantom = require('phantom') const express = require('express'); const app ...
- odoo 开发入门教程系列-模型之间的关系(Relations Between Models)
模型之间的关系(Relations Between Models) 上一章介绍了为包含基本字段的模型创建自定义视图.然而,在任何真实的业务场景中,我们都需要不止一个模型.此外,模型之间的链接是必要的. ...
- 记一次 .NET 某设备监控系统 死锁分析
一:背景 1. 讲故事 上周看了一位训练营朋友的dump,据朋友说他的程序卡死了,看完之后发现是一例经典的死锁问题,蛮有意思,这个案例算是学习 .NET高级调试 入门级的案例,这里和大家分享一下. 二 ...
- Mybatis的整体理解
I有关于我的对ybatis的设想: 简单总结-下有关于我对wybat is的架构理解: 总体分为三个层面: 1.对外接口API 2.MapStatement数据处理 3.执行及其数据存储 两个主要的对 ...
- Python开发遇到的一些问题
1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try usin ...
- [MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条
@ 目录 关于图形绘制 创建自定义控件 使用控件 创建专辑封面 项目地址 我们将绘制一个圆形的音乐播放控件,它包含一个圆形的进度条.专辑页面和播放按钮. 关于图形绘制 使用MAUI的绘制功能,需要Mi ...
- Gateway服务网关+过滤器
为什么需要网关 Gateway网关是我们服务的守门神,所有微服务的统一入口. 网关的核心功能特性: 请求路由 权限控制 限流 架构图: 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果 ...