ワード検索ソルバー


13

昨日、特定の単語検索をくまなく調べて答えを出力するプログラムを書くことができるかどうか疑問に思いました。実際、驚くほど簡単でした。今、私たちはどれだけ小さくできるのだろうか。

ルール

  • 最初の入力は、n行の文字列またはコレクションであり、各行はn文字の長さです
  • 2番目の入力は、パズルで見つけるための任意の形式の単語のリストです
  • 検索リスト内のすべての単語はパズルに含まれていることが保証されています
  • 単語は、4つの基本方向のいずれか、および前方と後方の両方に斜めに向けることができます。
  • 大文字の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

2
同様に、唯一の本当の違いは、出力に場所を含めることです。
FryAmTheEggman

@ NL628はい、すべての検索語がパズルに含まれることが保証されています。複数のオカレンスがある場合は、両方を出力するか、2番目を無視することができます。それはユーザー次第です。
morpen

@JonathanAllan素晴らしいアイデア。あなたの提案通りに更新します。
morpen

1
@RickHitchcockはい、そうする必要があります:)
morpen

回答:



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の3149の 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)] 検索対象の単語と同じ長さでスライスを切り取ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.