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

时间:2024-05-20 13:11:25

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

L1-064 估值一亿的AI核心代码 (20 分)
以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 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

第四次天梯赛的L1 - 8。相信死磕这道题的小伙伴们大多都亏本了(大佬除外哈),反正我是写了一个多小时最后才拿了1分…
水平不够,最终写了100多行,请各位大佬们见谅。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <climits>
#include <string>
using namespace std;
typedef long long LL;
#define debug(x, y) cout<<x<<" "<<y<<endl
#define nl cout<<endl
#define fy cout<<"------"<<endl
const int maxn = 1010;
bool fuhao(char ch) {///空格与半角符号均为true
    if(ch>='0'&&ch<='9') return false;
    else if(ch=='I') return false;
    else if(ch>='a'&&ch<='z') return false;
    return true;
}
///独立则单词前后没有字母
int cok(char s[], int i) {///can you 与could you 是否独立
    i--;
    ///判断c前面的字符,c前面可以什么也没有或者有一个空格
    if(i>=0&&s[i]!=' ') return 0;
    i++;
    ///can you独立,返回1
    ///注意单词后面的字符可以是半角符号、空格后者结束符'\0'
    if(s[i+1]=='a'&&s[i+2]=='n'&&s[i+3]==' '&&s[i+4]=='y'&&s[i+5]=='o'&&s[i+6]=='u'&&fuhao(s[i+7])) return 1;
    ///could you独立, 返回2
    if(s[i+1]=='o'&&s[i+2]=='u'&&s[i+3]=='l'&&s[i+4]=='d'&&s[i+5]==' '&&s[i+6]=='y'&&s[i+7]=='o'&&
       s[i+8]=='u'&&fuhao(s[i+9])) return 2;
    return 0;
}
///同cok
bool iok(char s[], int i) {///I是否独立
    i--;
    if(i>=0&&s[i]!=' ') return false;
    i++;
    if(fuhao(s[i+1])) return true;
    else return false;
}
///同cok
bool meok(char s[], int i) {///me是否独立
    i--;
    if(i>=0&&s[i]!=' ') return false;
    i++;
    if(s[i+1]!='e') return false;
    if(fuhao(s[i+2])) return true;
    else return false;
}
void work(char c[], int lenc) {
    int si=0, ei=lenc-1;
    while(c[si]==' ') si++;///去字符串的前空格
    while(c[ei]==' ') ei--;///去字符串的后空格
    /**
    下面将字符串中单词/符号之间多余的空格去掉,半角符号前后先留
    一个空格不去(当然如果给的字符串符号前没有空格,那也不用加啊
    ,比如最后一个样例),大写转为小写(I除外)。
    **/
    char s[maxn];
    memset(s, '\0', sizeof(s));
    int k=0;
    for(int i=si; i<=ei; i++) {
        if(c[i]=='I') s[k++]=c[i];
        else if(c[i]>='A'&&c[i]<='Z') s[k++]=c[i]+'a'-'A';
        else if(c[i]==' ') {
            s[k++]=c[i];
            while(c[i]==' ') i++;///只要一个空格
            i--;
        } else s[k++]=c[i];
    }
    s[k]='\0';
    for(int i=0; i<k; i++) {
        if(s[i]=='c') {
            int wordi=cok(s, i);
            if(wordi==1) {
                printf("I can");
                i+=6;///第i+6是u
            } else if(wordi==2) {
                printf("I could");
                i+=8;///第i+8是u
            } else printf("c");
        } else if(s[i]=='I') {
            if(iok(s, i)) printf("you");
            else printf("I");
        } else if(s[i]=='m') {
            if(meok(s, i)) {
                printf("you");
                i++;///第i+1是e
            } else printf("m");
        } else if(s[i]==' ') {
            if(fuhao(s[i+1])) continue;
            else printf(" ");
        } else if(s[i]=='?')printf("!");
        else printf("%c", s[i]);
    }
    nl;
    ///fy;
    ///printf("%s\n", s);
}
int main() {
    int t;
    scanf("%d", &t);
    getchar();
    while(t--) {
        int k=0;
        char ch, s[maxn];
        while(scanf("%c", &ch), ch!='\n') s[k++]=ch;
        s[k]='\0';
        printf("%s\nAI: ", s);
        work(s, k);
    }
    return 0;
}