パスを再ルーティングする


9

方向のグリッドと開始位置と終了位置を指定して、2点間のパスを完了するために必要な方向グリッドの置換の最小数を決定します。グリッドは二重円筒形です。これは、例を挙げればより明確になります。

例として次のグリッドを見てみましょう:

>>>>v
>>>><
<<<<<

(座標がまたはで、最初の行と左の列がである)(1, 1)で開始して終了します。次に、1つの可能な解決策は、とをに置き換えることです。これにより、最終的なグリッドは次のようになります。(1, 3)(x, y)(col, row)1(1, 1)(1, 2)v

v>>>v
v>>><
<<<<<

から始まり(1, 1)、パスはにつながり(1, 3)ます。しかし、短いソリューションを交換することである、存在する(5, 2)v、最終的なグリッドはこれです:

>>>>v
>>>>v
<<<<<

から始めて(1, 1)、かなり長いパスがにつながり(1, 3)ます。

一番上の行の何かを^作品でも置き換えます(@Spitemasterに感謝します)。

入力

入力は、4つの可能な値の長方形グリッドと2つの座標で構成されます。グリッドは適切な形式で使用できます。たとえば、文字または整数の行列、文字列リストなど。グリッドの次元を要求することもできます。座標は適切な形式で取得できます。たとえば、整数ペア、複素数などです。0または1のインデックスを選択できます。

出力

出力は単一の整数であり、パスを最初から最後まで閉じるのに必要なグリッド置換の最小数である必要があります。

ルールと仕様

  • 標準抜け穴が適用されます
  • グリッドは二重円筒形です。つまり、上から上に移動すると下に移動し、左から左に移動すると右に移動します。

サンプルケース

サンプルケースは、文字行列と1インデックスの座標として与えられます。

事例1

入力

>>>>v
>>>><
<<<<<
1 1
1 3

出力

1

説明

例を参照してください。

事例2

入力

<<<<<
v>v>v
>>>>>
1 1
5 3

出力

1

説明

あなたはどちらか置き換えることができ(1, 1)vたり(2, 1)してv。最初のケースでは、から始まり(1, 1)、パスはまっすぐ下に行き、次に目的地まで右に行きます。2番目のケースでは、パスは左から右にループし、到達し(2, 1)、下に行き、右に行き、下に行き、目的地に到達するまで右に行きます。

事例3

入力

^^^^^^
><<>>>
vvvvvv
2 2
5 2

出力

2

説明

最良の変更は、中央の列を左からポイントまで折り返すことです。つまり、中央の行の最初と最後のアイテムを作成し<ます。また、作る2 23 2両方>

これは挑戦なので、最短のコードが勝ちます!


ex 2は、^またはのいずれかで一番上の行を変更して機能しますv
ジョナサンアラン

1つ以上の変更が必要な1つまたは2つのテストケースを追加することをお勧めします。
Jonathan Allan

3
ジョナサンの提案に+1-このような問題は、さまざまなエッジケースをカバーする5〜10のテストケースのようにふさわしいと思います。
ジョナ

あなたは何を持っ><ていますか(両方の位置に到達するように)それはピンポンを前後に動かしますか、それともそれらの間に壁があるようなものですか?
ジョナ

1
@Jonahそれはそれらの間でジャンプします(そうです、両方にヒットします)
HyperNeutrino

回答:


5

JavaScript(ES6)、 140  135バイト

入力は(a, width, height, x1, y1)(x0, y0)where a[]は整数の行列であり、すべての座標は0インデックスです。

2101

(a,w,h,X,Y)=>m=g=(x,y,n=0,r=a[y%=h],v=r[x%=w])=>x-X|y-Y?[-1,0,1,2].map(d=>r[v<2&&g(x+w+d%(r[x]=2),y+h+--d%2,n+(v!=d)),x]=v)|m:m=m<n?m:n

オンラインでお試しください!

どうやって?

バツyバツY

メートル


3

ゼリー73 72バイト

W,0+Ɱ⁴PṬ€×Ɱ3¤Ẏ¤,€ɗ/€Ẏ$‘ƭ€ịØ.,N;U$¤;ɗ/0ị+æ.Ɱ⁴‘Ṫịʋ¥Ɗ%⁴ṭƲ⁴P¤¡ŒHṪe¥/Ʋ€Ẹ¬Ɗ/¿Ṫ

オンラインでお試しください!

2つの変更が必要なケース3を使用した例(また、><v^数値に変換するフッターがあります)。

次の引数を期待する完全なプログラム:

  • 左:2つのリストのリスト。最初に、1 =右、2 =左、3 =下、4 =上としてエンコードされた平坦化された方向グリッド、続いてゼロインデックスとしての終了位置と開始位置のリスト[行、列]。最初の例では、[1,1,1,1,3,1,1,1,1,4,2,2,2,2,2],[[2,0],[0,0]]

  • 右:列数が後に続く行数のリスト。最初の例[3,5]

最初から最後まで取得するために必要な変更の数を返します。これが複数の変更である場合は遅くなります。TIOでは、3番目の例の場合、約かかります。完了するまで30秒。

以下の完全な説明ですが、概要は次のとおりです。

  1. カウンターをゼロに初期化します。
  2. row×colあなたメートル
  3. 終了位置が含まれているかどうかを確認します。
    • ×row×colあなたメートル
    • trueの場合、カウンターを終了して出力します

完全な説明:

W,0 | Wrap input in a list, and then pair with 0 (thus initialising the counter)


                                           Ɗ/¿ | While the following is true for the first item of the input pair (i.e. the list of all grids to be tested, paired with the end and start grid positions):
                                       Ʋ€      | - For each member of the list:
          ɗ/                                   |   - Reduce using the following as a dyad (so left argument is flattened grid and right is end/start positions)
ị       ¤                                      |     - Index into the following as a nilad
 Ø.                                            |       - [0, 1]
   ,N                                          |       - Pair with negative [[0, 1], [0, -1]]
     ;U$                                       |       - Concatenate to upended version of this [[0, 1], [0, -1], [1, 0], [-1, 0]]
         ;                                     |     - Concatenate (to end/start positions)
                            Ʋ⁴P¤¡              |   - Repeat the following links the number of times indicated by the product of the grid dimensions:
                        Ɗ                      |     - Following as a monad:
            0ị                                 |       - Last item (current grid position)
              +        ¥                       |       - Add to the following as a dyad:
               æ.Ɱ⁴                            |         - Dot product of current position with each of grid dimensions
                   ‘                           |         - Increase by 1
                    Ṫ                          |         - Tail (which is current position in flattened grid)
                     ị                         |         - index into flattened grid
                         %⁴                    |        - Mod grid dimensions
                           ṭ                   |        - Tack onto end of current grid/position list
                                 ŒH            |   - Split into halves (first half will be flattened grid and desired end position, second half will be all positions reached after moving through grid)
                                     ¥/        |   - Following as a dyad, with the first half from above step as left argument and the second half as right
                                   Ṫ           |     - Tail (i.e. the desired end position)
                                    e          |     - Exists within (the list of all positions reached)
                                         Ẹ¬    | - Not true for any of the input grids


                    ƭ€ | For each of the pair (list of grids, counter), do one of the following:
                  $    | - For the list of grids, do the following as a monad:
              ɗ/€      |   - Do the following as a dyad, with the flattened grid as the left argument and end/start positions as the right:
+Ɱ                     |     - Add to the flattened grid list each of:
           ¤           |       - The following as a nilad
         ¤             |         - The following as a nilad:
  ⁴P                   |           - The product of the grid dimensions
    Ṭ€                 |           - Convert each (using an implicit range from 1 to the grid dimension product) to a boolean list with a 1 at the relevant position (i.e. [[1], [0, 1], [0, 0, 1]...])
      ×Ɱ3              |           - Multiply by each of 1..3
          Ẏ            |        - Flatten to a single list of lists
            ,€         |    - Pair each with the end/start positions
                 Ẏ     |   - Tighten to a single list of grids paired with end/start positions
                   ‘   | - For the counter increment it


Ṫ | Finally, take the tail (which is the final value of the counter)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.