☀L1-064 估值一亿的AI核心代码 (20分)[PTA][大模拟][isalpha()函数]

24 篇文章 0 订阅
14 篇文章 0 订阅

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI 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

我真的写了好久好久

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;
priority_queue<int,vector<int>,greater<int>>q;
 
const int mod=10e9+7;

string s;

int is_eors(char c)
{
    if(isdigit(c)||isalpha(c))
        return 0;
    if(c==' ')
        return 1;
    return 2;
}

void check()
{
    int len=s.size();
    int is_empty=true;
    for(int i=0;i<len;i++)
    {
        if(s[i]!=' ')
            is_empty=false;
    }
    if(is_empty==true)
    {
        cout<<endl;
        return;
    }
    for(int i=0;i<len;i++)
    {
        if(isalpha(s[i])&&!islower(s[i])&&s[i]!='I')
        {
            s[i]+=32;
        }
        if(s[i]=='?')
            s[i]='!';
    }
    string nsp=" ";
    for(int i=0;i<len;i++)
    {
        if(s[i]==' '&&s[i-1]==' ')
            continue;
        else
            nsp+=s[i];
    }
    nsp+=' ';
    len=nsp.size();
    string out="";
    for(int i=0;i<len;i++)
    {
        out+=nsp[i];
        if(nsp[i+1]=='I'&&is_eors(nsp[i])>0&&is_eors(nsp[i+2])>0)
        {
            i++;
            out+="you";
        }
        else if(nsp[i+1]=='m'&&nsp[i+2]=='e'&&is_eors(nsp[i])>0&&is_eors(nsp[i+3])>0)
        {
            i+=2;
            out+="you";
        }
        else if(nsp[i+1]=='c'&&nsp[i+2]=='a'&&nsp[i+3]=='n'&&nsp[i+5]=='y'&&nsp[i+6]=='o'&&nsp[i+7]=='u'&&is_eors(nsp[i])>0&&is_eors(nsp[i+8])>0)
        {
            i+=7;
            out+="I can";
        }
        else if(nsp[i+1]=='c'&&nsp[i+2]=='o'&&nsp[i+3]=='u'&&nsp[i+4]=='l'&&nsp[i+5]=='d'&&nsp[i+7]=='y'&&nsp[i+8]=='o'&&nsp[i+9]=='u'&&is_eors(nsp[i])>0&&is_eors(nsp[i+10])>0)
        {
            i+=9;
            out+="I could";
        }
    }
    len=out.size();
    for(int i=len-1;i>=0;i--)
    {
        if(out[i]!=' ')
        {
            len=i;
            break;
        }
    }
    int t=0;
    for(int i=0;i<=len;i++)
    {
        if(i>0&&out[i]==' '&&is_eors(out[i+1])==2)
            continue;
        else if(out[i]!=' ')
        {
            cout<<out[i];
            t++;
        }
        else if(out[i]==' '&&t>0)
        {
            cout<<" ";
        }
    }
    cout<<endl;
}

int main()
{
    int N;
    cin>>N;
    getchar();
    for(int i=0;i<N;i++)
    {
        getline(cin,s);
        cout<<s<<endl;
        cout<<"AI: ";
        check();
    }
    return 0;
}

int is_eors(char c)//is empty or symbol,必须写,用来给字符分类

{

    if(isdigit(c)||isalpha(c))

        return 0;

    if(c==' ')

        return 1;

    return 2;

}

isalpha()函数:判断字符是否为英文字母

islower()函数:判断字符是否为小写字母

isdigit()函数:判断字符是否为数字

1⃣️判断句子是否全为empty

2⃣️大写替换为小写 and ?替换为!

3⃣️nsp(not_space)去掉多余空格

❀在nsp的开始和末尾都加上空字符,来应对下面对I或者me等的替换

string nsp=" ";

    for(int i=0;i<len;i++)

    {

        if(s[i]==' '&&s[i-1]==' ')

            continue;

        else

            nsp+=s[i];

    }

    nsp+=' ';

4⃣️out进行单词和词组的替换

❀只需要拷贝到新的字符串并且跳过原字符串的替换部分

if(nsp[i+1]=='I'&&is_eors(nsp[i])>0&&is_eors(nsp[i+2])>0)

        {

            i++;

            out+="you";

        }

5⃣️去掉尾部空格

for(int i=len-1;i>=0;i--)

    {

        if(out[i]!=' ')

        {

            len=i;

            break;

        }

    }

for(int i=0;i<=len;i++)

6⃣️去掉首部空格及特殊字符前空格并输出

int t=0;

    for(int i=0;i<=len;i++)

    {

        if(i>0&&out[i]==' '&&is_eors(out[i+1])==2)//跳过特殊字符前空格

            continue;

        else if(out[i]!=' ')

        {

            cout<<out[i];

            t++;

        }

        else if(out[i]==' '&&t>0)//跳过首部空格

        {

            cout<<" ";

        }

    }

参考:https://blog.csdn.net/qq_41464123/article/details/88926928?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160464655019724839264118%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160464655019724839264118&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-88926928.pc_first_rank_v2_rank_v28&utm_term=L1-064+估值一亿的AI核心代码+20分&spm=1018.2118.3001.4449

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值