矢印迷路脱出


14

質問

50 x 50文字の配列があります。各セルには、4つの方向のいずれかを指す矢印があります。空のセルはありません。セルに入ると、矢印で指定された方向にセルを出る必要があります。矢印は、あなたが来たのと同じ方向を指し、行き止まりになることもあります。

迷路の最も外側の境界にあるセルから開始し、迷路にあなたを導くパスを見つけて、他のセルで終了させることができます。入力は、<、>、^、およびvを含む配列として与えられます。出力は、0(タスクが不可能であることを示す)または1(持っていることを示す)として1桁(ブール、整数または文字、何でも可能)になりますタスクを達成しました)。

(実際の配列はこれより大きくなります)

^ v < >
> < v <
v > v ^

出力は

1
右側の<から入力できるため、パス「<v v」によって下のvから終了します。

タスクは、入力として迷路を受け取る最短のコードを記述し、ルールで指定されているようにパスが存在する場所を特定し、1桁の0または1を出力することです。

実際の数字の代わりにTRUEとFALSEを出力することもできます。


6
動作する実際のテストケースがあればいいと
リアム

入力は1次元配列ですか、それとも2次元ですか?また、右側に<でしか入力できませんか、^でも入力できますか?
ボベル

@bobbel入力は、1次元配列または2次元配列のうち、短いコードに必要なものとして指定できます。コードを短縮できる場合は、矢印を<> ^ vの代わりに1 2 3 4として入力することもできます。はい、^からも入力できます。
ghosts_in_the_code

1
ランダムな50 x 50の配列に解がない可能性は約0です。解に少なくとも一定のステップ数を持たせるか、ユーザーが解のパスを指定する必要がある場合は、より良いでしょう。
DavidC

1
これは「矢印エスケープ」と呼ばれるべきでした...まだ解決策を検討しています。
ビーカー

回答:


6

CJam、89 81バイト

q~"><v^":A2/{f{\*}z}/sA[1W52-52]er:T,,{[52md]51f%0e=1=},:E{[2704{__T=+}*]\-E&},,g

CJamインタプリタでオンラインで試してください。

使い方

q~        e# Read and evaluate all input. This pushes an array of strings.
"><v^":A  e# Push that string and save it in A.
2/        e# Split it into ["><" "v^"].
{         e# For each chunk:
  f{      e#   For each input string, push the string and the chunk; then:
    \*    e#     Join the chunk, using the string as separator.
  }       e#
  z       e#   Transpose rows and columns.
}/        e#
s         e# Flatten the resulting array of strings.
A         e# Push "><v^".
[1W52-52] e# Push [1 -1 52 -52].
er        e# Perform transliteration.
:T        e# Save the result in T.
,,        e# Push [0 ... 2703].
{         e# Filter; for each integer I in [0 ... 2703]:
  [52md]  e#   Push [I/52 I%52].
  51f%    e#   Take both integers modulo 51 to map 51 to 0.
  0e=     e#   Count the number of resulting zeroes.
  1=      e#   Check if the count is 1.
},        e# If it is, keep I.
:E        e# Save the filtered array in E.
{         e# For each integer I in E:
  [2704{  e#   Do 2704 times:
    __    e#     Push two copies of the integer on the stack.
    T=    e#     Select the corresponding element from T.
    +     e#     Add it to the first copy.
  }*]     e#   Collect all results in an array.
  \-      e#   Remove I from that array.
  E&      e#   Intersect with E.
},        e# If the intersection is non-empty, keep the integer.
,g        e# Push the sign of the length of the filtered array.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.