グリッド上のあいまいな場所


11

4つの距離センサーを備えた小さなロボットがあります。部屋のレイアウトは知っていますが、グリッドの方向に固定できること以外の方向感覚はありません。読み取り値に基づいてロボットがどこにあるかを見つけたいが、センサーが限られているためあいまいになる可能性があります。

チャレンジの説明

部屋のレイアウトと時計回りの4つの距離測定値が表示され、あなたと壁の間のセル数が示されます。部屋の中央に壁があり、グリッドの端も壁です。ロボットを壁の上に置くことはできません。

あなたの目的は、ロボットがそこにいる可能性のある部屋内のすべての場所をリストし、与えられた読み取り値を与えることです。ロボットには向きの感覚がないため(グリッド上の90度の角度にロックされていることを除きます。つまり、ロボットが斜めになったり、他のスキュー角度になることはありません)、[1、2、3、 4]は、たとえば、[3、4、1、2]と同じです。

これらの例では、セル座標は、左上のセルから0のインデックス(x、y)のペアとして与えられます。読み取り値は、角括弧で囲まれたリストで時計回りに表示されます。レイアウトでは、空のセルを表すために、壁やその他の文字(通常はドット)にポンド記号を使用します。

事例1

. . . .
. . . .
. . # .
. . . .
  • [1、0、2、3] ==>(1、0)、(3、1)
  • [0、0、3、3] ==>(0、0)、(3、0)、(0、3)、(3、3)
  • [2、1、1、0] ==>(0、2)、(2、1)
  • [1、1、2、2] ==>(1、1)

事例2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0、0、1、1] ==>ドットであるグリッド上のすべての位置
  • [1、0、0、0] ==>グリッド上のすべてのa

事例3

.
  • [0、0、0、0] ==>(0、0)

事例4

. # #
. . .
  • [1、2、0、0] ==>(0、1)
  • [0、1、2、0] ==>(0、1)
  • [0、0、1、0] ==>(0、0)
  • [1、0、1、0] ==>(1、1)
  • [0、1、0、1] ==>(1、1)

事例5

. # . .
. . . .
. . # .
. . . .
  • [2、1、1、0] ==>(0、2)、(2、1)
  • [0、2、2、1] ==>(1、1)
  • [1、0、2、2] ==>(1、1)
  • [0、3、0、0] ==>(0、0)
  • [1、0、1、1] ==>(1、2)

その他の規則

  • 入力は任意の便利な形式にすることができます。入力は、壁とスペースのグリッド、および時計回りの4つの距離のリストです。
  • 出力は、読み取り値を満たすすべてのセルのリスト、または読み取り値を満たすセルを示すグリッドの修正バージョンのいずれかです。出力の正確な形式は、妥当で一貫している限り重要ではありません。有効な出力形式には次のものが含まれますが、これらに限定されません
    • 各セル座標の行を順序付きペアとして印刷する
    • グリッドの印刷.#および!それぞれ、スペース、壁、そして可能な位置のために。
    • 順序付けられたペアのリストを返す
    • インデックスのリストを返す
    • スペース、壁、および可能な場所に異なる値を使用してリストのリストを返す
    • 読み取りが発生するセルを表すために1を使用して、0と1のマトリックスを返す/印刷します。(壁を含める必要はありません)
    • 繰り返しますが、このリストは完全ではないため、他の表現は一貫性があり、グリッドまたはリスト内のすべての有効な場所を表示している限り有効です。確信が持てない場合は、コメントを残してください。明確に説明させていただきます。
  • 読み取り値は、グリッド上の少なくとも1つの場所に対応すると想定できます。
  • 入力グリッドのサイズは少なくとも1x1で、少なくとも1つの空きスペースがあると想定できます。
  • 入力グリッドは、各次元で256セル以下であると想定できます。
  • 入力グリッドは常に完全な長方形であり、ギザギザではないと仮定できます。
  • プログラムが無効な入力に対して正常な出力を行う場合、ペナルティやボーナスはありません。
  • これはコードゴルフなので、最短のコードが勝ちます。

のテストケースCase 5はまったく正しくないようです。私が取得(0,2),(2,1)(1,3)(1,3)、とnothing
TFeld

@TFeldありがとう。修繕。
ビーフスター

1
@Arnauldは私には理にかなっているようです。これをすでに網羅されていないリストに追加します。
ビーフスター

回答:


3

JavaScriptの(ES6)、 130の128 126  125バイト

(m)(l)m01l

1

m=>l=>m.map((r,y)=>r.map((v,x)=>v&!!([...'3210321'].map(d=>(g=X=>(m[Y+=~-d%2]||0)[X+=(d-2)%2]?1+g(X):0)(x,Y=y))+g).match(l)))

オンラインでお試しください!(読みやすいように後処理された出力を使用)

コメント済み

m => l =>                         // m[] = layout matrix; l[] = list of distances
  m.map((r, y) =>                 // for each row r[] at position y in m[]:
    r.map((v, x) =>               //   for each cell v at position x in r[];
      v &&                        //     yield 0 if v = 0
      !!(                         //     otherwise, test whether we can find l[] within a
        [...'3210321']            //     list containing twice the results of the sensors
        .map(d =>                 //       for each direction d:
          (g = X => (             //         g = recursive function taking X
              m[Y += ~-d % 2]     //         add dy[d] to Y
              || 0                //         use a dummy object if we're out of the board
            )[X += (d - 2) % 2] ? //         add dx[d] to X; if (m[Y] || 0)[X] is equal to 1:
              1 +                 //           add 1 to the final result
              g(X)                //           and do a recursive call
            :                     //         else:
              0                   //           yield 0 and stop recursion
          )(x, Y = y)             //         initial call to g with X = x and Y = y
        )                         //       end of map() over directions
        + g                       //       coerce the result to a comma-separated string,
                                  //       followed by harmless garbage
      ).match(l)                  //     test whether l[] can be found in this string
                                  //     (l[] is implicitly coerced to a string as well)
    )                             //   end of map() over r[]
  )                               // end of map() over m[]


1

、42バイト

PθFθ¿⁼¶ι⸿¿№E⁴E⁴⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#η!ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。木炭は何らかの理由で出力にパディングを追加するようです。炭のバグだと思います。説明:

Pθ

カーソルを動かさずに地図を印刷します。

Fθ

マップ内の各キャラクターをループします。

¿⁼¶ι⸿

改行の場合は、カーソルを次の行の先頭に移動します。

⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#

方向の壁までの距離を見つけますk+m

¿№E⁴E⁴...η!ι

4つの開始方向すべてをループしk、時計回りの4つすべての方向を覗きm、結果に2番目の入力が含まれている!場合は、現在の文字を印刷します。

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