星球大战GPT
* * * *
拉格朗日计划
* * * *
星球大战GPT

每组输入都是由换行符分割的字符串,其中从字符串首到第一个换行符前是一段话(星球大战的台词),之后每个换行符后直到字符串都各是一个单词。

根据所给定的台词,输出每个给定的单词后最有可能出现的词,每个输出单独一行。

其中最有可能出现是指在此单词后出现的频率最高,若最高频率的词有多个,那么输出最先出现的一个。下面是一个例子:

输入:
aa bb aa bb aa cc bb cc bb cc
aa
bb
输出:
bb
aa
说明:本例中出现在单词aa后面的词有bb和cc,其中bb出现了2次,cc出现了1次,因此输出bb,因为其频率最高。出现在单词bb后面的词有aa和cc,且均出现了2次,但aa最先出现,因此输出aa。

注:单词中也可能包含单引号。

本题难度:



解答

本题看似实现了很高级的功能,实际只是正则表达式的简单应用。

用正则表达式(此处因涉及变量,故写成Python 3中f-string的形式) f"(?<=\s{给定的单词c}\s)[\w\']+(?=\s)" 即可匹配出现在给定的单词c后的单词。

其中第一部分"(?<=\s{给定的单词c}\s)"表示所有查找的内容前是空格+给定单词c+空格的形式,第二部分"[\w\']"表示所要查找的内容由字母和单引号组成,第三部分"(?=\s)"表示所要查找的内容后是空格。

为了能查找到匹配到句首和句尾,匹配时在台词前后各加一个空格。

最后将查找的词按词频和位置排序后输出满足要求的最值项即可。

最终代码有五行。

代码长度:186字节 vs. 全站第一:116字节。

import sys,re
for a in sys.argv[1:]:
  for c in(s:=a.split("\n"))[1:]:
  t=re.findall("(?<=\s"+c+"\s)[\w\']+(?=\s)"," "+s[0]+" ")
  print(min((-t.count(j),i,j)for i,j in enumerate(t))[2])