亀がポータルを見つける


30

カメはグリッドに沿って移動して餌を取りたいと考えています。彼はそこに着くまでにどれだけの動きが必要かを知りたがっています。

同様に、彼は遅いので、彼は自分のドメインの周りにテレポーターをセットアップします。または、パスが長くなる場合は避けてください。

亀に会う

🐢

グリッド上のカメの生活

XXXXXXXXXXXX🐢XXXXXXXXXXXX
カメは、任意の隣接するマスに移動することができます...
バツバツバツバツバツバツバツバツ🐢バツバツバツバツバツバツバツバツ

しかし、カメは山の正方形に移動することはできません

X🌄XXXXXX🌄🐢XX🌄XX🌄XXX

カメは彼のイチゴを食べたい、それが彼のイチゴを取得するのにかかるどのくらい知っていただきたいと思い

X🌄🍓🐢🌄XX🌄XXXX
亀を取るだろう。この例で5ターン
X🌄🍓🌄🌄XX
幸いにも、カメはテレポーターを見つけました!グリッドには、相互にマップする2つのテレポートがあります。テレポーターを踏むと、すぐにカメが対応するテレポーターに移動します。テレポーターは非常に不安定で、一度使用すると消えてしまい、使用できなくなります。
🔵🌄🍓🐢🌄🔴X🌄XXXX
亀が二度上に移動することが高速化されました。今カメ最短パスは2
🔵🌄🐢🌄🔴バツ🌄バツバツバツバツ

チャレンジ

最初のグリッド構成出力が与えられると、移動回数により、カメがイチゴに到達するまでに時間がかかります。

ルール

  • 入力グリッドに解決策があると仮定することができます

  • 各グリッドには、1 つstrawberry、2つportals、1つのturtle

  • 入力グリッドは、任意の便利な形式で入力できます

  • あなたが扱う必要teleportersがあるのは使い捨てのアイテムです

  • カメがteleporter正方形に移動するターンでは、彼はすでに対応していteleporterます。彼は決して移動せずteleporter、移動のためにそこに留まります

  • 最短パスでポータルを使用する必要はありません

  • カメは山のタイルを通過できません

  • あなたが表現するために任意のASCII文字または整数を使用することができmountainsturtleempty grid squarestrawberry

  • 同じ文字または2つの異なるASCII文字または整数を使用してteleporterペアを表すことができます

  • グリッドには、同じ最短パス長を持つ複数のパスを含めることができます

  • これは

規則の明確化

  • teleporters使い捨てのアイテムを扱う必要があります。

推論:それはの場合との指摘があった

🐢バツ🔵バツ🍓🌄🌄🌄🌄🌄🔴バツバツバツバツ

ポータルを2回出入りすることでのみ解決できます。この明確化の時点で、両方の解決策は、それらが単一使用であるか、以前に使用された正方形を試す理由がないと仮定して行動しました。彼らの勤勉な解決策を壊さないようにするために、これはこのセットアップの最善の方法であると思われました。したがって、これは無効なグリッドと見なされます。

リストとしてフォーマットされたテストケース

[ ['T', 'X', 'X', 'S', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 3
[ ['T', 'M', 'X', 'S', 'X'], ['X', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'O'] ] --> 4
[ ['T', 'M', 'X', 'S', 'O'], ['O', 'M', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 2
[ ['T', 'M', 'X', 'S', 'X'], ['O', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'X'] ] --> 4
[ ['T', 'M', 'S', 'X', 'O'], ['X', 'M', 'M', 'M', 'M'], ['X', 'X', 'X', 'X', 'O'] ] --> 7
[ ['T', 'X', 'X', 'S', 'X'], ['O', 'M', 'M', 'M', 'X'], ['X', 'X', 'O', 'X', 'X'] ] --> 3

人間用にフォーマットされたテストケース

T X X S X
X X X X X
X X X X X --> 3

T M X S X
X M X X X
O X X X O --> 4

T M X S O
O M X X X
X X X X X --> 2

T M X S X
O M X X X
O X X X X --> 4

T M S X O
X M M M M
X X X X O --> 7

T X X S X
O M M M X
X X O X X --> 3

クレジット

設計と構造:Arnauldの空腹マウス

提案された課題の編集アドバイス:Kamil-drakaribeefster

一般的な編集アドバイス:okx nedla2004 mbomb007


2
テレポーターを使用すると時間がかかるテストケースを追加することをお勧めします。
Okx

@Okx今すぐ作成および追加。
アコジ

編集、ありがとう。
アコジ

1
@xnor私は、これが私の元のルールから抽象化されるかもしれないと感じています。それでは、おそらくポータルは使い捨てのアイテムの方が良いでしょうか?
アコジ

1
関連(私は思う)。
チャーリー

回答:


13

JavaScript(ES7)、 140 139  138バイト

次のマッピングを使用して、整数の行列として入力を受け取ります。

  • 1 =🔵(任意のポータル)
  • 0 = バツ (空の)
  • 1 =🌄(山)
  • 2 = 🐢 (turtle)
  • 3 = 🍓 (strawberry)
m=>(R=g=(t,X,Y,i)=>m.map((r,y)=>r.map((v,x)=>r[(u=0,t?v-t:(x-X)**2+(y-Y)**2<3?v-3?~v?v:u--:R=R<i?R:i:1)||g(u,x,y,u-~i,r[x]=1),x]=v)))(2)|R

Try it online!

How?

The main recursive search function g is able to either look for a specific tile t on the board (if it's called with t0) or for any tile at (x,y) which can be reached from the current position (X,Y).

It keeps track of the length of the current path in i and updates the best result R to min(R,i) whenever the turtle finds the strawberry.

It is first called with t=2 to find the starting position of the turtle.

It calls itself with t=1 if a portal is reached, so that the turtle is teleported to the other portal. We do not increment i during such an iteration.

Each visited tile is temporarily set to a mountain to prevent the turtle from moving twice on the same tile in the same path. If we get trapped in a dead-end, the recursion simply stops without updating R.

Commented

m => (                        // m[] = input matrix
  R =                         // initialize R to a non-numeric value
  g = (t, X, Y, i) =>         // g = recursive search function taking t = expected tile,
                              //     (X, Y) = current coordinates, i = path length
    m.map((r, y) =>           // for each row r[] at position y in m[]:
      r.map((v, x) =>         //   for each tile v at position x in r[]:
        r[                    //     this statement will eventually restore r[x] to v
          ( u = 0,            //     u = next tile to look for, or 0 if none
            t ?               //     if we're looking for a specific tile:
              v - t           //       test whether we've found it
            :                 //     else:
              (x - X) ** 2 +  //       compute the squared Euclidean distance between
              (y - Y) ** 2    //       (x, y) and (X, Y)
              < 3 ?           //       if it's less than 3 (i.e. reachable from (X, Y)):
                v - 3 ?       //         if v is not equal to 3:
                  ~v ?        //           if v is not equal to -1:
                    v         //             test if v = 0
                  :           //           else (v = -1):
                    u--       //             set u = -1 to find the other portal
                :             //         else (v = 3):
                  R = R < i ? //           we've found the strawberry: set R = min(R, i)
                      R : i   //
              :               //       else (this tile can't be reached):
                1             //         yield 1
          ) ||                //     if the above result is falsy:
          g(                  //       do a recursive call:
            u,                //         t = u
            x, y,             //         move to (x, y)
            u - ~i,           //         unless u is set to -1, increment i
            r[x] = 1          //         set this tile to a mountain
          ),                  //       end of recursive call
          x                   //     restore r[x] ...
        ] = v                 //     ... to v
    ))                        // end of both map() loops
)(2) | R                      // initial call to g with t = 2; return R

1
"Each visited tile is temporarily set to a mountain to prevent the turtle from moving twice on the same tile" What a lovely trick. Great answer, and as always I appreciate answers with explanations :)
akozi

5

Python 2, 441 431 341 bytes

from itertools import*
G=input()
W=len(G[0])
H=len(G)
A=[0]*5
E=enumerate
for y,r in E(G):
 for x,C in E(r):A[C]=[x,y]
for L in count():
 for M in product(*[zip('UDLR'*2,'LRDU    ')]*L):
  x,y=A[0]
  for m in M:
    x+='R'in m;x-='L'in m;y+='D'in m;y-='U'in m
    if(x,y)==A[3]:x,y=A[2]
    if 1-(W>x>-1<y<H)or G[y][x]>3:break
  if[x,y]==A[1]:exit(L)

Try it online!

Input as lists, but using numbers instead of characters (thanks to Quintec) and a seperate value for the destination of the teleporter. Those large indentations should be tab characters if Stack Exchange removes them. Any tips or ideas especially welcome, as I feel that this could get much somewhat shorter.

The table for characters used in the challenge to the numbers used for my program is below, but you can also use this program.

Challenge | My program
T         | 0
S         | 1
E         | 2
O         | 3
M         | 4
X         | -1

-10 bytes thanks to Quintec by changing the input from using characters to numbers.

-A lot of bytes thanks to Jonathan Frech, ElPedro, and Jonathan Allan.


2
各オブジェクトが文字列文字の代わりに数字で表されるリストを取得することで、おそらく数文字を削ることができます。
Quintec

@Quintec追加、ありがとう。方向についても同じことをしたいのですが、対角線は別々に行わなければなりません。それでも、それらを数字に移動することは可能かもしれません。
nedla2004


1
...と、他の10のための356
ジョナサン・アラン

2
@JonathanAllanとElPedroとJonathan French。皆様からの素晴らしいヒント、そして私はそれらを一緒に思いついたものをいくつか追加しました。(かなり遅れて)
nedla2004

2

Python 2、391 397 403 422バイト

M=input()
from networkx import*
a=b=c=d=0
N,h,w,S=[-1,0,1],len(M),len(M[0]),[]
for i in range(h):
 for j in range(w):
  I,m=(i,j),M[i][j]
  if m>7:c,d=a,b;a,b=I
  if m<0:Z=I
  if m==5:F=I
  S+=[I+I]
S+=[(a,b,c,d),(c,d,a,b)]
print len(shortest_path(from_edgelist([((A+p,B+q),(C,D))for A,B,C,D in S for p,q in[(p,q)for p in N for q in N]if-1<A+p<h and-1<B+q<w and M[C][D]*M[A+p][B+q]]),Z,F))-1

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

問題はグラフに変換され、解決策はカメからイチゴまでの最短経路を見つけることです。

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