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)

首先按照规则一对一的想出解决方案:

  1. 首先直接输出原话(废话)
  2. 然后删除多余空格

          2.1 先删除行首行尾空格,用while一直判断是否为空格就行

          2.2 单词间和符号前的空格,遍历字符串,找到空格后,如果下一个也是空格,就删除当前空格;如果下一个为标点符号或者单词,就不删除
  3. 遍历字符串,将大写英文字母转换为小写,'I' 不做处理
  4. 找到空格或者标点符号后的can you,could you,然后替换为 I can,I could(坑点来袭,下面会介绍坑点)
  5. 基本同4 空格或者标点符号后的I,me 替换为you
  6. 遍历字符串,将?替换为!
  7. 输出处理结果

逻辑分析一波

执行顺序应该为1->2.1->2.2,3,6->4,5->7

坑点

  1. 执行顺序处:处理空格和大小写不能和替换放在一个循环中!!!不然空格+大小写不好替换
  2. 替换字符串时,替换的必须是 独立 的字符串!!!如can you前面和后面都必须是空格或者是字符串,但是有一种特殊情况! can you在字符串的末尾,所以需要对这种也要处理
  3. 特殊情况:当两个标点符号中有许多空格,按照规则来说,输出的时候中间是不留空格的!输出时需注意!!!判断当前位如果是空格,并且是下一位是符号,不输出此空格。

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核心代码的更多相关文章

  1. PTA --- 天梯赛 L1-064 估值一亿的AI核心代码

    L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...

  2. L1-064 估值一亿的AI核心代码 (20 分)

    L1-064 估值一亿的AI核心代码 (20 分)   以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: ...

  3. L1-064 估值一亿的AI核心代码 (20分)

    L1-064 估值一亿的AI核心代码 (20分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除 ...

  4. PTA 估值一亿的AI核心代码

    题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...

  5. PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)

    Update:smz说regex秒过Orz,yzd记在这里了. 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校 ...

  6. L1-064 估值一亿的AI核心代码

    以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...

  7. go & AI核心代码

  8. 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码

    前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...

  9. win10安装PS和AI后报代码为16的错误解决方法

    win10安装PS和AI后报代码为16的错误解决方法 一.总结 一句话总结:修改兼容性和以管理员方式运行就可以了 修改兼容性 以管理员身份运行 二.PS和AI安装后报代码为16的错误解决方法介绍(转) ...

  10. AI写代码! 神器copilot介绍+安装+使用

    !郑重提示!!!!!!!: 正在学编程.算法的同学请千万不要依赖此插件,否则你可能甚至无法手写出一个for循环 AI帮我写代码?我帮AI写代码?庄周梦蝶?蝶梦庄周?十分梦幻. copilot在VSco ...

随机推荐

  1. DVWA-CSRF(跨站请求伪造)

    csrf(Cross-site request forgery)跨站请求伪造:攻击者诱导用户访问第三方网站,在第三方网站中携带恶意代码,向被攻击者发送请求 原理可以这样来说 用户在访问了一个后台管理网 ...

  2. MySQL学习(十三)InnoDB

    参考博客: https://my.oschina.net/wangzemin/blog/5346534 InnoDB之BufferPool https://juejin.cn/post/7007421 ...

  3. C++温故补缺(十九):atomic类

    atomic 参考:c++11 多线程(3)atomic 总结 - 简书.c++11 atomic Npgw的博客.C++11 并发指南系列 - Haippy - 博客园. atomic_flag a ...

  4. kubernetes(k8s)命名空间一直Terminating

    root@hello:~# kubectl get ns NAME STATUS AGE auth Terminating 34m default Active 23h kube-node-lease ...

  5. [Windows]BAT脚本自定义函数

    1 helloworld @echo off call :helloworld helloworld goto :EOF :helloworld setlocal echo %1 endlocal&a ...

  6. 异常:java.io.FileNotFoundException:e:\demo(拒绝访间。)

    禁止向目录中写数据,只能向文件写数据

  7. 数组练习 fill sort

    package day05; import java.util.Arrays; //fill sort equals public class testArrays { public static v ...

  8. java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    问题描述 最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错.且服务所在的物理机只能ping通,但是无法登录.报错信息如下: ERROR 04-12 03:01:43,930 [Default ...

  9. 【Spring注解驱动】(二)AOP及一些扩展原理

    1 AOP动态代理简介及功能实现 1.1 简介 指在程序运行期间动态地将某段代码切入到指定方法的指定位置进行运行的方式. 1.2 功能实现测试 功能:实现在业务逻辑运行的时候将日志打印 ①导入aop模 ...

  10. Ununtu服务器安装Nginx与PHP

    Ununtu服务器安装Nginx与PHP 1. 安装Nginx: 1.1 sudo apt update sudo apt install nginx 验证结果,使用命令: sudo systemct ...