L1-064 估值一亿的AI核心代码 (20 分) 样例1分析

摘要
Title: L1-064 估值一亿的AI核心代码 (20 分)
Tag: 栈、字符串、模拟
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

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)}")
使用搜索:谷歌必应百度