パスと無駄な時間


22

前提

だから最近、私は予定の約30分早く、外で待つことにしました。また、家の前にじっと立っているだけでは奇妙に見えると判断しました。そのため、私は限られたエリア内で、早歩きすることにしました。また、もし私が円を歩き始めたら、それは私がwasしていることを明らかにするだろうと結論づけました。だから、最初のCode Golfチャレンジを作成することに触発されました。

仕様

リスト、エリアの地図が表示されます。これには、" "またはのいずれかが含まれます。これらは"#"、ある種の空きスペースと障害物を表します。空きスペースを横断できるのは1回のみで、横断するには1分かかります。あなたの初期位置は"@"ローグライクごとの伝統で表され、ターゲットは"$"そこで表されるでしょう。なぜならそれはそこであなたが失うことになるからです。また、まるであなたが侵入しているかのように見えなくなる前にあなたが無駄にしなければならない分数を表す整数が与えられます。着陸するとき"$"、正確な分数である必要があります(したがって、カウントダウンする場合、隣接するタイルでは1であり、タイルでは0である必要があります)。常に目的地に到着することが可能です。プログラムまたは関数は、可能な4つの方向を表すために、<、>、^、およびvを含む最短パスを示すリストを返す必要があります。

入力:

[[" ", " ", " ", " "],
 ["@", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

そして

5

出力:

[[">", ">", ">", "v"],
 ["^", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

入力:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

そして

7

出力:

[[" ", "#", " ", " ", " "],
 [" ", "#", ">", "v", " "],
 ["v", "#", "^", "$", " "],
 [">", ">", "^", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

入力:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

そして

17

出力:

[[" ", "#", " ", "v", "<"],
 [" ", "#", " ", "v", "^"],
 ["v", "#", " ", "$", "^"],
 [">", ">", "v", ">", "^"],
 [" ", "#", "v", "^", "<"],
 [" ", "#", ">", ">", "^"]]

ルール

  • 標準的な抜け穴が適用されます
  • 各タイルは1回だけ移動する必要があります
  • 正確な時間をボードに費やす必要があります
  • 複数のパスの場合、1つのパスのみを表示する必要があります
  • これはコードゴルフの質問なので、最短の回答が勝ちます
  • コメント内のuser202729の質問に従って、有効な入力を想定することができます。

さらに説明が必要な場合はコメントを追加してください


1
指定された時間内に目的地いつでも到達できる」ことが保証されていますか?
user202729

はい、そうです、複雑な場合でも常に方法があります
-LForchini

5
PPCGへようこそ!:)素敵な最初の挑戦。
ジュゼッペ

両端で30分に何が起こったのでしょうか?!(明らかでない場合は何も変更する必要はありません)
ジョナサンアラン

回答:


6

JavaScript(ES6)、171バイト

カリー化構文の入力を受け取ります(a)(n)。入力マトリックスを変更し出力します。

a=>g=(n,y=a[F='findIndex'](r=>~(i=r[F](v=>v>'?'))),x=i,R=a[y])=>!n--|[-1,0,1,2].every(d=>(R[x]='<^>v'[d+1],(c=(a[Y=y+~-d%2]||0)[X=x+d%2])<1?g(n,Y,X):n|c!='$')&&(R[x]=' '))

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

コメント済み

a =>                           // a[] = input matrix
g = (                          // g = recursive function taking:
  n,                           //   n = number of remaining moves
                               //   (x, y) = current coordinates, initialized as follows:
  y = a[F = 'findIndex'](r =>  //     y = index of the row containing the starting point,
    ~(i = r[F](v => v > '?'))  //         found by iterating over all rows r until we
  ),                           //         find some i such that r[i] > '?'
  x = i,                       //     x = index of the column of the starting point
  R = a[y]                     //   R[] = current row
) =>                           //
  !n-- |                       // decrement n; force failure if we're out of moves
  [-1, 0, 1, 2].every(d =>     // for each direction d, where -1 = left, 0 = up,
    (                          // 1 = right and 2 = down:
      R[x] = '<^>v'[d + 1], (  //   update the current cell with the direction symbol
        c = (                  //   c = content of the new cell at (X, Y) with:
          a[Y = y + ~-d % 2]   //     Y = y + dy
          || 0                 //     (use a dummy value if this row does not exist)
        )[X = x + d % 2]       //     X = x + dx
      ) < 1 ?                  //   if c is a space:
        g(n, Y, X)             //     we can go on with a recursive call
      :                        //   else:
        n | c != '$'           //     return false if n = 0 and we've reached the target
    ) &&                       //   unless the above result is falsy,
    (R[x] = ' ')               //   restore the current cell to a space
  )                            // end of every()

5

パイソン2310の、256バイト

ため@cairdcoinheringaahingおかげexcept:0-3バイト
バイトを-8おかげ@Mnemonicを
バイト分-3ありがとう@JonathanAllanを
-5バイトありがとう@ovsを

G,L=input()
R=[]
def S(x,y,G,c,R):
 try:
	if x>-1<y<G[y][x]in' @':i=0;exec"T=[r[:]for r in G];T[y][x]='<v^>'[i];S(x+~-i/2,y+~-(i^2)/2,T,c-1,R);i+=1;"*4
	R+=[G]*(0==c<'$'==G[y][x])
 except:0
for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
print R[0]

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

いくつかの説明:

try-except両方のことを、確実にするために使用されるxと、y座標が境界です。へのアクセス時に例外が発生しますG[y][x]。Pythonは非常に優れており、負のインデックスも許容されるため、チェックx>-1<yが追加されます。

T=[r[:]for r in G]Gby値のコピーの作成に使用

~-i/2そして、グリッド内を移動~-(i^2)/2するために使用されるペアを生成するために使用されます(まだ短い方法があるはずです!)(-1, 0), (0, 1), (0, -1), (1, 0)

R+=[G]*(0==c<'$'==G[y][x])チェック、'$'必要なステップ数で到達します。R再帰的な関数呼び出しからこの結果を取得するために使用されます。

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)見つかったxy'@'入力や通話機能にS

print R[0] R 複数のソリューションが含まれている可能性があるため、最初に出力する



1
で置き換えることif G[y][x]=='$':でバイトを保存できますif'$'==G[y][x]:

1
実際、その条件全体R+=(G[y][x]=='$')*(c==0)*[G]を別のバイトに置き換えることができます。

1
ええ、私が何を見ていたかわかりません。if(x>-1<y)*(G[y][x]in' @'):

1
あなたのための短い方法は次のようにy+cmp(i%2,i/2)なりますy+~-(i^2)/2。まだ短いかもしれません。
ジョナサンアラン

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