L1-064 估值一亿的AI核心代码 (20 分) 样例1分析
摘要
Title: L1-064 估值一亿的AI核心代码 (20 分)
Tag: 栈、字符串、模拟
Memory Limit: 64 MB
Time Limit: 1000 ms
Powered by:NEFU AB-IN
L1-064 估值一亿的AI核心代码 (20 分)
-
题意
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了 I;
把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
把原文中所有独立的 I 和 me 换成 you;
把原文中所有的问号 ? 换成惊叹号 !;
在一行中输出替换后的句子作为 AI 的回答。 -
思路
首先,可以用正则表达式做,比较方便
这里基本思路是,用栈的方法处理字符串(受编译原理的熏陶)
-
首先对大写字母进行拦截
-
之后当出现非字母数字时,说明前面有一个单词已经产生了,那么就判断这个单词是否可替代即可
- 这里采用的方法是
- 当栈的长度大于需判断的字符长度时,并且改字符前的字符是 非字母数字,说明可以
- 当栈的长度等于需判断的字符长度时,说明也可以
之后处理多余空格
- 这里采用的方法是
-
最后一个单词需要额外判断,因为照我这个写法,它后面是没有非字母数字的,所以单独判断一下即可
样例一可能就是这么出错的,比如I
-
-
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49'''
Author: NEFU AB-IN
Date: 2022-04-18 15:38:29
FilePath: \ACM\GPLT\L1-064.PY
LastEditTime: 2022-04-18 16:59:59
'''
from string import ascii_letters, digits
for _ in range(int(input())):
stk = []
s = input()
print(s)
ss = ['can you', 'could you', 'I', 'me']
si = ['I can', 'I could', 'you', 'you']
s = list(s.strip())
i = 0
while i < len(s):
if s[i].isupper() and s[i] != 'I':
s[i] = s[i].lower()
if s[i] not in ascii_letters + digits:
for k in range(4):
if ((len(stk) > len(ss[k]) and stk[-len(ss[k]) - 1] == ' ') or
(len(stk) == len(ss[k]))) and "".join(
stk[-len(ss[k]):]) == ss[k]:
stk[-len(ss[k]):] = [si[k]]
if s[i] == ' ':
j = i
while j < len(s) and s[j] == ' ':
j += 1
i = j - 1
if s[i + 1] in ascii_letters + digits:
stk.append(s[i])
else:
if s[i] == '?':
stk.append('!')
else:
stk.append(s[i])
else:
stk.append(s[i])
i += 1
# 最后再判断最后单独的单词
if s and s[-1] in ascii_letters + digits:
for k in range(4):
if ((len(stk) > len(ss[k]) and stk[-len(ss[k]) - 1] == ' ') or
(len(stk) == len(ss[k]))) and "".join(
stk[-len(ss[k]):]) == ss[k]:
stk[-len(ss[k]):] = [si[k]]
print(f"AI: {''.join(stk)}")