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

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

以上图片来自新浪微博。

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

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

如果输入的全是空格,回复是 AI: 后面要有一个空格哦。先分隔成单词直接在输出的时候替换,比在字符串里面删除要替换的再把字符串加进去要更容易操作。

C 语言 ANS:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

#define MAXLEN 10001

int main(void)
{
    char original[MAXLEN] = {0}, newstr[MAXLEN] = {0};
    int nowpos, newpos;

    while (fgets(original, sizeof(original), stdin)) {
        if (isdigit(original[0]))
            continue;
        nowpos = newpos = 0;
        // 分隔出独立的单词
        while (original[nowpos] != '') {
            char c = original[nowpos++];
            if (isalnum(c)) {
                newstr[newpos++] = c;
            } else if (isspace(c)) {
                newstr[newpos++] = c;
                while (original[nowpos] == ' ') nowpos++;
            } else {
                newstr[newpos++] = ' ';
                newstr[newpos++] = c;
            }
        }
        newstr[newpos-1] = '';
        // 大小写转换 问号变为惊叹号
        for (newpos = 0; newstr[newpos] != ''; newpos++)
            if (newstr[newpos] != 'I')
                newstr[newpos] = newstr[newpos] == '?' ? '!' : tolower(newstr[newpos]);
        
        char *words[MAXLEN] = {NULL};
        char *p = strtok(newstr, " ");
        int idx;
        for (idx = 0; p != NULL; idx++) {
            words[idx] = p;
            p = strtok(NULL, " ");
        }
        printf("%s", original);
        printf("AI:");
        if ((idx > 0 && !isalnum(words[0][0])) || idx == 0) {
            printf(" ");
        }
        for (int i = 0; i < idx; i++) {
            if (!isalnum(words[i][0])) {
                printf("%s", words[i]);
            } else if (i + 1 < idx && strcmp(words[i], "can") == 0 && strcmp(words[i+1], "you") == 0) {
                printf(" I can");
                i++;
            } else if (i + 1 < idx && strcmp(words[i], "could") == 0 && strcmp(words[i+1], "you") == 0) {
                printf(" I could");
                i++;
            } else if (strcmp(words[i], "I") == 0 || strcmp(words[i], "me") == 0) {
                printf(" you");
            } else {
                printf(" %s", words[i]);
            }
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fnmain/p/12348915.html