グリッド上の単語を見つけよう!


8

開始座標と終了座標を使用してワードサーチから単語を抽出するプログラムまたは関数を記述します。

入力

プログラムまたは関数は、開始座標終了座標、および単語を抽出するワード検索の 3つのパラメーターを受け入れる必要があります。

  • 開始座標は、任意の形式で取り込むことができます。

    • 常に整数になります

    • グリッドの左下は(0、0)です

    • グリッドの境界の外にある座標は提供されません

    • (7、0)や(0、6)など、互いに垂直、水平、または完全に対角ではない座標は提供されません。

  • 端座標と同じ形式で撮影される開始座標

  • ワードサーチが可能になる、文字列、またはあなたの言語の最も近い同等

    • これは、各行が改行1 つのスペースで区切られた文字のグリッドになります。高さや幅は任意ですが、異なる場合もありますが、常に長方形になります。例えば:

      A G O A T C A T
      E A T M E N O W
      W O R D S E A R
      A K L L K J H G
      N P L F G H F D
      A S P L K J H G
      O P I L F G H J
      T F A S E J K L
      
      J H P B L D J L T
      F J L N F N P W H
      W P R D T F J R Q
      J L L L L J H H W
      N P L F H H F D S
      J T P L L J H H K
      P P J L F H H J N
      L F J T F J L L O
      

出力

あなたは、文字列、またはあなたの言語に最も近いものを出力するべきです。実際の単語検索では単一の文字を検索する必要がないため、座標が同じ場合は何も出力されません。

例とテストケース

上記の最初のグリッド:
(0、4)および(4、0)-> "APPLE"

(4、0)および(0、4)-> "ELPPA"

(1、7)および(4、7)-> "GOAT"

(0、5)および(7、5)-> "WORDSEAR"

(0、6)および(5、6)-> "EATMEN"

(0、6)および(0、7)-> "EA"

(7、0)および(0、7)-> "LHJGLRAA"

----------

上記の2番目のグリッド:
(1、0)および(8、7)-> "FJLHJJWT"


(1、4)および(4、4)-> "LLLL"

(1、4)および(1、4)-> "L"または ""


2
テストケースのフォーマットを変える必要があります。これは、繰り返しの多いテキストです。それらを2つのグリッドに分割して、(1,4),(4,4)「-> LLLL」のようなものに移動します
Denker

@DenkerAffe Done :)
2016年

wordsearchをlistoflistofcharsとして取得できますか?
CalculatorFeline

テストケース4は正しくありません。正しい出力は「WORDSEAR」です
CalculatorFeline

回答:


2

JavaScript(ES6)108

(x,y,t,u,g)=>eval("for(g=g.split`\n`.reverse(),r=g[y][2*x];x-t|y-u;)r+=g[y+=u<y?-1:u>y][2*(x+=t<x?-1:t>x)]")

ゴルフが少ない

(x,y,t,u,g)=>{
    g=g.split`\n`.reverse();
    for(r = g[y][2*x]; x-t | y-u; )
        r+=g[y += u<y ? -1 : u>y][2*( x += t<x ? -1 : t>x)];
    return r
}   

0

Numpyを使用するPython 3.5、251バイト:

def r(t,y,z):import numpy;l=numpy.array([[*i.split()]for i in z.split('\n')]);A,B,C,D=t[0],y[0],t[1],y[1];p=[1,-1];a=p[A>B];b=p[C>D];n=range(A,B+a,a);m=range(C,D+b,b);w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])];return w
  • 受け取りの入力を次の形式で:

    print(''.join(r((start1,start2),(end1,end2),'''grid''')))
    
  • APPLE上記の形式を使用して関数が呼び出される限り、文字列の形式(など)で出力します。それ以外の場合は、各文字を含むリスト(例:)['A','P','P','L','E']が返されます。

いつ、どこで、いつゴルフができるのか。

オンラインでお試しください!(イデオネ)(ここでは、グリッドを二重引用符("")で囲んで入力し\n、グリッドの各行の間にsを入れて1行で入力します。次に、ポイントは、 2行目で終わり、3行目で終わります。)

Ungolfedコードと説明

def r(t,y,z):
    import numpy
    l=numpy.array([[*i.split()]for i in z.split('\n')])
    A,B,C,D=t[0],y[0],t[1],y[1]
    p=[1,-1]
    a=p[A>B]
    b=p[C>D]
    n=range(A,B+a,a)
    m=range(C,D+b,b)
    w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]
    return w

この説明のために、このプログラムが入力((0,4),(4,0))と質問の最初のグリッドで実行されたと想定します。ここでは、コードの2つの主要部分について説明します。

  • l=numpy.array([[*i.split()]for i in z.split('\n')])

    ここでlは、入力の各行を個別の「リスト」に含む派手な配列です。たとえば、質問の最初のグリッドは次のとおりです。

    A G O A T C A T
    E A T M E N O W
    W O R D S E A R
    A K L L K J H G
    N P L F G H F D
    A S P L K J H G
    O P I L F G H J
    T F A S E J K L
    

    この派手な配列を返します:

    [['A' 'G' 'O' 'A' 'T' 'C' 'A' 'T']
     ['E' 'A' 'T' 'M' 'E' 'N' 'O' 'W']
     ['W' 'O' 'R' 'D' 'S' 'E' 'A' 'R']
     ['A' 'K' 'L' 'L' 'K' 'J' 'H' 'G']
     ['N' 'P' 'L' 'F' 'G' 'H' 'F' 'D']
     ['A' 'S' 'P' 'L' 'K' 'J' 'H' 'G']
     ['O' 'P' 'I' 'L' 'F' 'G' 'H' 'J']
     ['T' 'F' 'A' 'S' 'E' 'J' 'K' 'L']]
    
  • w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]

    これは、グリッド上の各ポイントに対応するすべての文字が検索される関数のメインリストです。ここで、iは、の各整数に対応しますn。これは、範囲内のすべての数値を、if またはifの逆がtrueの場合start1=>end1+1に増分して含む範囲オブジェクトです。ただし、に等しくない限り、これにのみ対応します。そうでなければ、多くの長さが倍として返され、範囲内の各整数を含む範囲の対象であると同じ条件とし、そして内のすべての整数に対応します。そうは言っても、今からこのステップをステップごとに見ていきましょう。+1start1<end1-1istart1end1start1mmstart2=>end2+1npm

    • l[:,i]基本的iに、配列の各列の行ベクトルを返しますl。たとえば、次l[:,0]を返します:

      ['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
      

      l[:,1] 戻ります:

      ['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
      

      などなど。このメソッドを含むnumpyでのさまざまなインデックス作成方法の詳細については、こちらをご覧ください

    • 次に、関数は返された各配列を逆にします。l[:,i][::-1]各配列には左から右にインデックスが付けられているためです0,0が、グリッドの左下隅にあるグリッド上の点から、各配列を逆にするとインデックス値が返されますまるで彼らが右から左へ捜されているかのように。たとえば、次l[:,0][::-1]を返します:

      ['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
      
    • この後、関数はその逆の配列を介してp、文字に対応するインデックス値のインデックスを作成し、作成中のリストに追加します。たとえば、l[:,0][::-1][4]ポイント(0,4)に対応するは、を返しAます。

    • このプロセスは、範囲オブジェクトがなくなるまで、リストに新しい値を繰り返し追加し続けます。

結局、リストwである出力が最終的に返されます。この場合、それはAPPLEwithで呼び出された場合、またはなしで呼び出されたprint(''.join(r((0,4),(4,0),'''The Grid''')))場合['A','P','P','L','E']です''.join()。いずれにせよ、それは正しい答えを返し、完了です!

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