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
***注意,如果你也是卡在第二个测试点,可以测试 [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; } }