当前位置:   article > 正文

【PTA】L1-064 估值一亿的AI核心代码(详C++)_估值一亿的ai核心代码pta

估值一亿的ai核心代码pta

题目链接: L1-064 估值一亿的AI核心代码 - 团体程序设计天梯赛-练习集 (pintia.cn)

目录:

题目要求: 

输入格式:

输出格式:

输入样例:

输出样例:

思路:

相关好用函数介绍: 

字符函数:

erase函数的三种使用方法:

replace() 函数用法

代码:

测试结果: 


题目要求: 

以上图片来自新浪微博。

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

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

  1. 6
  2. Hello ?
  3. Good to chat with you
  4. can you speak Chinese?
  5. Really?
  6. Could you show me 5
  7. What Is this prime? I,don 't know

输出样例:

  1. Hello ?
  2. AI: hello!
  3. Good to chat with you
  4. AI: good to chat with you
  5. can you speak Chinese?
  6. AI: I can speak chinese!
  7. Really?
  8. AI: really!
  9. Could you show me 5
  10. AI: I could show you 5
  11. What Is this prime? I,don 't know
  12. AI: what Is this prime! you,don't know

代码长度限制                16 KB

时间限制                        400 ms

内存限制                        64 MB

思路:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;(纯纯废话)
  • Hello ?
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉
  •     can       you speak Chinese   ?    
  • AI: I can speak chinese!
  • 把原文中所有大写英文字母变成小写,除了 I
  •   Good to chat with you
  • AI: good to chat with you
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词
  • What Is this prime? I,don 't know
  • AI: what Is this prime! you,don't know
  • 原文中所有独立的 I 和 me 换成 you
  • 原文中所有的问号 ? 换成惊叹号 !
  • can you speak Chinese?
  • AI: I can speak chinese!
  • 一行中输出替换后的句子作为 AI 的回答
  • can you speak Chinese?
  • AI: I can speak chinese!

         (1)定义了一个名为judge的函数,它接受一个字符c作为参数,并返回一个整数来标识这个字符的类型。

        (2)定义了一个名为 AI 的函数,它接受一个字符串 ask 作为输入,并返回处理后的结果。这个函数主要用于处理输入的字符串,执行一系列转换和替换操作。

头文件和命名空间:

这里包含了<bits/stdc++.h>头文件,它实际上是一个包含了C++标准库中几乎所有头文件的头文件。使用using namespace std;为了避免在代码中重复写std::前缀。

  1. #include <bits/stdc++.h>
  2. using namespace std;

主函数:

程序的入口

  1. int main()
  2. {
  3. ....
  4. }

 judge的函数:

(1)判断字母

        这里首先判断c是否是大写字母('A''Z'之间)或小写字母('a''z'之间)。如果是,则返回1,并在注释中说明这是“字母”。

  1. if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
  2. return 1;//字母

(2)判断数字 

        如果c不是字母,则判断它是否是数字('0''9'之间)。如果是,则返回2,并在注释中说明这是“数字”。 

  1. else if(c>='0'&&c<='9')
  2. return 2;//数字

(3)判断空格         

        如果c既不是字母也不是数字,则判断它是否是空格。如果是,则返回0,并在注释中说明这是“空格”。 

  1. else if(c==' ')
  2. return 0;//空格

(4)判断标点符号

        如果c不是上述任何类型(即不是字母、数字或空格),则返回-1,并在注释中说明这是“标点符号”。 

  1. else
  2. return -1;//标点符号

 AI 的函数: 

(1)删除行首和行尾空格

        通过两个while循环,函数删除了输入字符串ask开头的所有空格和结尾的所有空格

  1. //删除行首空格
  2. while(ask[0]==' ')
  3. ask.erase(ask.begin());
  4. //删除行尾空格
  5. while(ask[ask.size()-1]==' ')
  6. ask.erase(ask.end()-1);

 (2)字符转换:

        使用for循环遍历字符串中的每个字符。
        如果字符是大写字母(除了'I'),则将其转换为小写字母。
        如果字符是问号?,则将其替换为叹号!。
        遍历过程中,如果遇到空格,则删除该空格之后的所有连续空格,只保留一个。

  1. for(int i=0;i<ask.size();i++)
  2. {
  3. //大写变小写
  4. if(ask[i]>='A'&&ask[i]<='Z'&&ask[i]!='I')
  5. ask[i]+=32;
  6. //?->!
  7. if(ask[i]=='?')
  8. ask[i]='!';
  9. //删除多余空格
  10. if(ask[i]==' ')
  11. {
  12. int j=i+1;
  13. while(ask[j]==' ') j++;
  14. ask.erase(ask.begin()+i+1,ask.begin()+j);//此处参数必须为迭代器,int不行
  15. }
  16. }

 (3)字符串替换:

        再次使用for循环遍历字符串。
        如果当前字符是字符串的开头,并且为'I',则根据下一个字符的类型(通过judge函数判断)决定是否将'I'替换为'you'。
        如果当前字符和下一个字符组成的子串是"me",并且紧接着的字符不是字母或字符串结束,则同样将"me"替换为"you"。
        如果当前字符开始的子串是"can you"或"could you",并且紧接着的字符不是字母或字符串结束,则分别替换为"I can"和"I could"。
        上述替换操作在字符串的开头以及字母之前都会进行检查。

  1. //替换字符串
  2. for(int i=0;i<ask.size();i++)
  3. {
  4. if(i==0)
  5. {
  6. if(ask[i]=='I'&&(judge(ask[i+1])<=0||i+1==ask.size()))
  7. ask.replace(i,1,"you");
  8. else if(ask.substr(i,2)=="me"&&(judge(ask[i+2])<=0||i+2==ask.size()))
  9. ask.replace(i,2,"you");
  10. else if(ask.substr(i,7)=="can you"&&(judge(ask[i+7])<=0||i+7==ask.size()))
  11. ask.replace(i,7,"I can");
  12. else if(ask.substr(i,9)=="could you"&&(judge(ask[i+9])<=0||i+9==ask.size()))
  13. ask.replace(i,9,"I could");
  14. }
  15. if(judge(ask[i])<=0)
  16. {
  17. if(judge(ask[i+1])==1)//字母
  18. {
  19. if(ask[i+1]=='I'&&(judge(ask[i+2])<=0||i+2==ask.size()))
  20. ask.replace(i+1,1,"you");
  21. if(ask.substr(i+1,2)=="me"&&(judge(ask[i+3])<=0||i+3==ask.size()))
  22. ask.replace(i+1,2,"you");
  23. if(ask.substr(i+1,7)=="can you"&&(judge(ask[i+8])<=0||i+8==ask.size()))
  24. ask.replace(i+1,7,"I can");
  25. if(ask.substr(i+1,9)=="could you"&&(judge(ask[i+10])<=0||i+10==ask.size()))
  26. ask.replace(i+1,9,"I could");
  27. }
  28. }
  29. }

 main函数:

(1)声明变量:

        int n;:用于存储用户输入的问题数量。

  string ask, ans;ask用于存储用户输入的问题,ans用于存储AI函数处理后的答案。

  1. int n;
  2. string ask,ans;

(2)读取问题数量: 

  cin >> n;:从标准输入读取用户输入的问题数量。

  cin.get();:读取并丢弃一个字符,通常是换行符,用于清除输入缓冲区中残留的换行符,避免影响后续getline的读取。

  1. cin>>n;
  2. cin.get();

(3)处理每个问题:

        while(n--):循环n次,每次循环处理一个问题。

        getline(cin, ask);:使用getline函数读取一行字符串作为问题,并存储在ask中。

        cout << ask << endl;:输出原始问题。

        ans = AI(ask);:调用AI函数处理ask,并将结果存储在ans中。

  1. getline(cin,ask);
  2. cout<<ask<<endl;
  3. ans=AI(ask);

(4)输出处理后的答案:

        cout << "AI: ";:输出提示信息。

        循环遍历ans中的每个字符,并输出:

                if(ans[i]==' ' && judge(ans[i+1])<=0):判断当前字符是否是空格,并且下一个字符是否为非字母数字字符(通过judge函数判断)。如果是,则跳过该空格不输出。

                else cout << ans[i];:否则,输出当前字符。

        cout << endl;:每个问题处理完后输出换行符。 

  1. cout<<"AI: ";
  2. for(int i=0;i<ans.size();i++)
  3. {
  4. //判断符号+空格+符号的特殊情况
  5. if(ans[i]==' '&&judge(ans[i+1])<=0)
  6. continue;
  7. else
  8. cout<<ans[i];
  9. }
  10. cout<<endl;

相关好用函数介绍: 

字符函数:

erase函数的三种使用方法:

(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符

(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)

(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)

  1. #include<string>
  2. #include<iostream>
  3. using namespace std;
  4. int main ()
  5. {
  6. string str ("This is an example phrase.");
  7. string::iterator it;
  8. //第(1)种方法
  9. str.erase (10,8);
  10. cout << str << endl; // "This is an phrase."
  11. //第(2)种方法
  12. it=str.begin()+9;
  13. str.erase (it);
  14. cout << str << endl; // "This is a phrase."
  15. //第(3)种方法
  16. str.erase (str.begin()+5, str.end()-7);
  17. cout << str << endl; // "This phrase."
  18. return 0;
  19. }

replace() 函数用法

(1)用str替换指定字符串从起始位置pos开始长度为len的字符 

 string& replace (size_t pos, size_t len, const string& str); 

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str = "he is@ a@ good boy";
  7. str=str.replace(str.find("a"),2,"#"); //从第一个a位置开始的两个字符替换成#
  8. cout<<str<<endl; //he is@ # good boy
  9. return 0;
  10. }

(2) 用str替换迭代器起始位置 和 结束位置 的字符           

string& replace (const_iterator i1, const_iterator i2, const string& str);

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str = "he is@ a@ good boy";
  7. str=str.replace(str.begin(),str.begin()+5,"#"); //用#替换从begin位置开始的5个字符
  8. cout<<str<<endl; //#@ a@ good boy
  9. return 0;
  10. }

(3)用substr的指定子串(给定起始位置和长度)替换从指定位置上的字符串

string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str = "he is@ a@ good boy";
  7. string substr = "12345";
  8. str=str.replace(0,3,substr,substr.find("2"),4); //用substr的指定字符串替换str指定字符串
  9. cout << str << endl; //2345 is@ a@ good boy
  10. //从 str 的开始位置(即 "he")提取前3个字符,
  11. //并用 "2345"(从 "12345" 的第2个字符开始,提取4个字符)进行替换。
  12. //所以,str 的新值变为 "2345 is@ a@ good boy"。
  13. return 0;
  14. }

(4)用重复n次的c字符替换从指定位置pos长度为len的内容 

string& replace (size_t pos, size_t len, size_t n, char c); 

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str = "he is@ a@ good boy";
  7. char str1 = '#';
  8. str = str.replace(0,6,3,str1); //用重复3次的str1字符替换的替换从位置0~6的字符串
  9. cout<<str<<endl; //### a@ good boy
  10. return 0;
  11. }

(5) 用重复n次的c字符替换从指定迭代器位置(从i1开始到结束)内容

string& replace (const_iterator i1, const_iterator i2, size_t n, char c); 

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str = "he is@ a@ good boy";
  7. char str1 = '#';
  8. str = str.replace(str.begin(),str.begin()+6,3,str1); //用重复3次的str1字符替换的替换从指定迭代器位置的内容
  9. cout<<str<<endl; //### a@ good boy
  10. return 0;
  11. }

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int judge(char c)
  4. { //判断传入的字符是什么
  5. if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
  6. return 1;//字母
  7. else if(c>='0'&&c<='9')
  8. return 2;//数字
  9. else if(c==' ')
  10. return 0;//空格
  11. else
  12. return -1;//标点符号
  13. }
  14. string AI(string ask)
  15. {//返回处理结果
  16. //删除行首空格
  17. while(ask[0]==' ')
  18. ask.erase(ask.begin());
  19. //删除行尾空格
  20. while(ask[ask.size()-1]==' ')
  21. ask.erase(ask.end()-1);
  22. for(int i=0;i<ask.size();i++)
  23. {
  24. //大写变小写
  25. if(ask[i]>='A'&&ask[i]<='Z'&&ask[i]!='I')
  26. ask[i]+=32;
  27. //?->!
  28. if(ask[i]=='?')
  29. ask[i]='!';
  30. //删除多余空格
  31. if(ask[i]==' ')
  32. {
  33. int j=i+1;
  34. while(ask[j]==' ') j++;
  35. ask.erase(ask.begin()+i+1,ask.begin()+j);//此处参数必须为迭代器,int不行
  36. }
  37. }
  38. //替换字符串
  39. for(int i=0;i<ask.size();i++)
  40. {
  41. if(i==0)
  42. {
  43. if(ask[i]=='I'&&(judge(ask[i+1])<=0||i+1==ask.size()))
  44. ask.replace(i,1,"you");
  45. else if(ask.substr(i,2)=="me"&&(judge(ask[i+2])<=0||i+2==ask.size()))
  46. ask.replace(i,2,"you");
  47. else if(ask.substr(i,7)=="can you"&&(judge(ask[i+7])<=0||i+7==ask.size()))
  48. ask.replace(i,7,"I can");
  49. else if(ask.substr(i,9)=="could you"&&(judge(ask[i+9])<=0||i+9==ask.size()))
  50. ask.replace(i,9,"I could");
  51. }
  52. if(judge(ask[i])<=0)
  53. {
  54. if(judge(ask[i+1])==1)//字母
  55. {
  56. if(ask[i+1]=='I'&&(judge(ask[i+2])<=0||i+2==ask.size()))
  57. ask.replace(i+1,1,"you");
  58. if(ask.substr(i+1,2)=="me"&&(judge(ask[i+3])<=0||i+3==ask.size()))
  59. ask.replace(i+1,2,"you");
  60. if(ask.substr(i+1,7)=="can you"&&(judge(ask[i+8])<=0||i+8==ask.size()))
  61. ask.replace(i+1,7,"I can");
  62. if(ask.substr(i+1,9)=="could you"&&(judge(ask[i+10])<=0||i+10==ask.size()))
  63. ask.replace(i+1,9,"I could");
  64. }
  65. }
  66. }
  67. return ask;
  68. }
  69. int main()
  70. {
  71. int n;
  72. string ask,ans;
  73. cin>>n;
  74. cin.get();
  75. while(n--)
  76. {
  77. getline(cin,ask);
  78. cout<<ask<<endl;
  79. ans=AI(ask);
  80. cout<<"AI: ";
  81. for(int i=0;i<ans.size();i++)
  82. {
  83. //判断符号+空格+符号的特殊情况
  84. if(ans[i]==' '&&judge(ans[i+1])<=0)
  85. continue;
  86. else
  87. cout<<ans[i];
  88. }
  89. cout<<endl;
  90. }
  91. return 0;
  92. }

测试结果: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/478861
推荐阅读
相关标签
  

闽ICP备14008679号