zoukankan      html  css  js  c++  java
  • L1-064 估值一亿的AI核心代码 (20 分)

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

    AI.jpg

    以上图片来自新浪微博。

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


    ***注意,如果你也是卡在第二个测试点,可以测试 [can I can] -> [can you can] 和 [can you you] -> [I can you]***
    #include <bits/stdc++.h>
    using namespace std;
    
    string line, orign;
    
    
    bool is_fuhao(char c) {
        return (!isspace(c) && !isalpha(c) && !isdigit(c));
    }
    
    bool is_duli(int s, int t, int limit) {
    
        return (((s == 0) || isspace(line[s - 1]) || is_fuhao(line[s - 1]))
                    && ((t == limit) || isspace(line[t + 1]) || is_fuhao(line[t + 1])));
    }
    
    int find_duli(string s, int pos) {
        int idx;
        int len = line.length();
        while(pos < len && (idx = line.find(s, pos)) >= 0) {
            if(is_duli(idx, idx + s.length() - 1, len - 1))
                return idx;
            else
                pos += s.length();
        }
        return -1;
    }
    
    void replace_unit(string o, string t) {
        bool isUpdate = true;
        int pos = 0;
        while(pos < (int)line.length() && isUpdate) {
            isUpdate = false;
            int idx = find_duli(o, pos);
            if(idx >= 0) {
                line.replace(idx, o.length(), t);
                isUpdate = true;
                pos = idx + o.length();
            }
        }
    }
    
    void proc_replace() {
        replace_unit("I", "You");
        replace_unit("me", "You");
        replace_unit("can you", "I can");
        replace_unit("could you", "I could");
    }
    
    void del_blank() {
        bool isUpdate = true;
        while(isUpdate) {
            int len = line.length(), pos = 0;
            isUpdate = false;
            for(int i = pos; i < len; i++) {  // 结尾不会是空格,不会越界
                if(isspace(line[i]) && (isspace(line[i + 1]) || is_fuhao(line[i + 1]))) {
                    line.erase(i, 1);
                    pos = i;
                    isUpdate = true;
                    break;
                }
            }
        }
    }
    
    void to_lower_tanhao() {
    
        transform(line.begin(), line.end(), line.begin(), [](char c)->char {
                  if(c == '?') return '!';
                  else if(c == 'I') return 'I';
                  return tolower(c);
        });
    
    }
    
    void input_and_trim() {
    
        getline(cin, orign);
        line = orign;
    
        if(!line.empty()) {
            line.erase(0,line.find_first_not_of(" "));
            line.erase(line.find_last_not_of(" ") + 1);
        }
    
    }
    
    int main() {
    
        int n;
        cin >> n;
        getchar();
        while(n --) {
            input_and_trim();
            to_lower_tanhao();
            del_blank();
            proc_replace();
            to_lower_tanhao();
            cout << orign << endl;
            cout <<"AI: "<< line << endl;
        }
    
    }
     
  • 相关阅读:
    BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表
    CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度
    BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick
    # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT
    [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
    【2018九省联考】后的瞎扯
    BZOJ 4671 异或图 | 线性基 容斥 DFS
    Luogu 4294 [WC2008]游览计划 | 斯坦纳树
    BZOJ 2434 阿狸的打字机 | AC自动机
    UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
  • 原文地址:https://www.cnblogs.com/Pretty9/p/11440319.html
Copyright © 2011-2022 走看看