题目描述
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的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
Python极简解法
本题是对若干个字符串进行一系列操作。由于Python对于字符串的处理极其灵活,搭配正则表达式库re
能使代码更加简洁,因此选用了Python语言。
踩过的一些坑:
\b
的正则表达式匹配:\b
是正则表达式规定的一个元字符,代表着单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b
并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。- 第15和16行的字符串替换,在
I
前加了一个下划线,如果将下划线替换为其他内容(例如@
,#
等特殊字符)就会有一些测试点过不去。这应该也和正则表达式的匹配方式有关。
下面附上AC代码。
语言:Python 3
import re
n = int(input())
for i in range(n):
s = input()
print(s)
print('AI: ', end='')
s = re.sub(r'(\s+)', ' ', s)
s = list(s.strip().replace(' !', '!').replace(' ,', ',').replace(' .', '.').replace(' ?', '?').replace(' \'', '\''))
for i in range(len(s)):
if s[i].isupper() and s[i] != 'I':
s[i] = s[i].lower()
s = ''.join(s)
s = re.sub(r'(\bcan you\b)', '_I can', s)
s = re.sub(r'(\bcould you\b)', '_I could', s)
s = re.sub(r'(\bI\b)', 'you', s)
s = re.sub(r'(\bme\b)', 'you', s)
s = re.sub(r'(\?)', '!', s)
s = re.sub(r'(\b_I\b)', 'I', s)
print(s)