L1-064 估值一亿的AI核心代码

孤者浪人 提交于 2020-02-17 06:57:02

L1-064 估值一亿的AI核心代码
在这里插入图片描述

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

代码如下

#include <iostream>
#include <string.h>
#include <string>
#include <bits/stdc++.h>
using namespace std;
	

int fh(string str,int i)
{
    if(str[i] >= 'a' && str[i] <= 'z') return 1;
	else if(str[i] >= '0' && str[i] <= '9') return 2;
    else if(str[i] >= 'A' && str[i] <= 'Z') return 3;
    else if(str[i] == ' ') return 4;
    else return 5;  //其他符号 
}
int pd(int x, int y, string ans)
{
    if((x < 0||ans[x] == ' '||fh(ans,x) == 5)&&(ans[y] == ' '||fh(ans,y)==5))
        return true;
    return false;
}

int main(){
	int n;
	scanf("%d ", &n);
	while(n--)
	{
		string ans = "";
		string str;
		getline(cin,str);  //输入一行字符 
		cout << str << endl;
		cout << "AI: ";
		int s = 0, w = str.length();
		while(str[s] == ' ') s ++;  //删除句首的空格 
		while(str[w] == ' ') w --;  //删除句尾的空格 
		for(int i = s; i < w; i++){
			if(str[i] == ' ' && (str[i+1] == ' '|| fh(str,i+1) == 5)) 
				continue;  //删除不合适的空格 
			else if(fh(str,i) == 3 && str[i] != 'I')
				ans += str[i] + 32;	 //大写变小写 
			else if(str[i] == '?') 
				ans += "!";  // ‘?’变成 ‘! ’ 
			else ans += str[i];			
		}
	    int len = ans.size();  //新的字符串的长度 
		for(int i = 0; i < len; i++){
			if(ans[i] == 'I'&&pd(i - 1, i + 1, ans)){
				cout << "you";
			}  
			else if(ans.substr(i,2) == "me" && pd(i - 1, i + 2, ans)){
				cout << "you"; i ++;
			}  
			else if(ans.substr(i,7) == "can you" && pd(i - 1, i + 7, ans)){
				cout << "I can"; i += 6;
			}  
			else if(ans.substr(i,9) == "could you" && pd(i - 1, i + 9, ans)){
				cout << "I could"; i += 8;
			}  
			else cout << ans[i];
	    } 	
		cout << endl;
    }
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!