单词搜索求解器


13

我昨天想知道我是否可以编写一个程序来梳理给定的单词搜索并输出答案。实际上,这非常简单。现在我想知道我们能得到多小。

规则

  • 您的第一个输入是一个字符串或n行的集合,每行长度为n个字符
  • 您的第二个输入是要在拼图中找到的任何格式的单词列表
  • 搜索列表中的所有单词都一定会在拼图中
  • 单词可以在四个基本方向中的任何一个方向上定位,也可以对角线前后移动
  • 拼图中仅包含大写AZ字符
  • 您的代码必须找到搜索字符串中的每个单词,并输出起始字母的坐标位置,其中0,0是左上角的字符。
  • 如果您找到同一单词的多个实例,则可以根据需要进行处理。多次输出或仅输出一次,由您决定

示例/测试用例

鉴于以下董事会:

ABCD
EFGH
IJKL
MNOP

以及以下搜索字符串:

ABCD,CGKO,POMN,NJF,AFKP,CFI,LGB,MJGD

您的程序应以任何顺序输出以下内容:

ABCD at 0,0
CGKO at 0,2
PONM at 3,3
NJF at 3,1
AFKP at 0,0
CFI at 0,2
LGB at 2,3
MJGD at 3,0

一如既往,最短答案胜出


6
欢迎来到PPCG!不错的第一个挑战!
AdmBorkBork '18

2
类似地,唯一的真正区别似乎是在输出中包含位置。
FryAmTheEggman '18

@ NL628是的,保证所有搜索词都在拼图中。如果出现多个事件,则可以两次输出它,或者第二次忽略它,这取决于您。
morpen '18

@JonathanAllan好主意。我会按照您的建议进行更新。
morpen '18

1
@RickHitchcock是的,应该:)
morpen '18

Answers:



3

Python 2,213字节

lambda a,W:[(w,i,j)for w in W for i in R(L(a))for j in R(L(a[0]))for U in R(9)if U-4and g(i,j,U/3-1,U%3-1,a).find(w)==0]
g=lambda i,j,u,v,a,s='':L(a)>i>=0<=j<L(a[0])and g(i+u,j+v,u,v,a,s+a[i][j])or s
L=len;R=range

在线尝试!

g采取起始位置i,j和方向,u,v并通过递归提取在该方向上从该位置开始的字符串。

f然后访问每个起始位置i,j和方向,U/3-1,U%3-1并检查每个单词w以查看结果字符串是否以开头w


2

Python 3中149个 147字节

def g(b,w):h=b.find('\n')+1;return[f'{y} at {i//h},{i%h}'for y in w for i in range(len(b))for d in(1,h+1,h,h-1,-1,~h,-h,1-h)if y==b[i::d][:len(y)]]

在线尝试!

非高尔夫版本

def g(b,w):
    h = b.find('\n') + 1                              # width of a row plus the '\n'
    a = []
    for y in w:                                       # iterate over the words
        for i in range(len(b)):                       #   iterate over the game board
            for d in(1,h+1,h,h-1,-1,~h,-h,1-h):       #     for each possible direction
                if y==b[i::d][:len(y)]:               #       see if the word matches
                    a.append(f'{y} at {i//h},{i%h}')
    return a

主要思想是b[i::d]从游戏板上选择一个片段。切片从位置开始i并沿方向延伸d。例如,d = h+1对应于东南对角线,而d = ~h与相同-h-1,对应于西北对角线。 [:len(y)] 切成与要搜索的单词相同长度的片段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.