Labirin panah melarikan diri

14

Pertanyaan

Anda memiliki array karakter 50 kali 50. Setiap sel memiliki panah yang menunjuk ke salah satu dari empat arah. Tidak ada sel yang kosong. Saat memasuki sel, Anda harus keluar ke arah yang ditentukan oleh panah. Panah mungkin juga menunjuk ke arah yang sama dengan tempat Anda berasal, menghasilkan jalan buntu.

Anda dapat mulai dari sel mana saja di perbatasan terluar dari labirin dan menemukan jalan yang membawa Anda ke labirin, dan menyebabkan Anda keluar di sel lain. Input akan diberikan sebagai array yang berisi <,>, ^ dan v. Output akan menjadi satu digit (Boolean, integer atau karakter, apa pun akan dilakukan) sebagai 0 (menunjukkan bahwa tugas tidak mungkin) atau 1 (menunjukkan bahwa Anda memiliki mencapai tugas).

Contoh (array aktual akan lebih besar dari ini)

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

Output akan menjadi

1
karena Anda dapat masuk dari <di sebelah kanan, yang akan menyebabkan Anda keluar dari bawah v melalui jalur "<v v"

Tugasnya adalah menulis kode sesingkat mungkin yang akan menerima labirin sebagai input, dan menentukan di mana ada jalur di dalamnya sebagaimana ditentukan dalam aturan dan menghasilkan satu digit 0 atau 1

Menghasilkan TRUE dan FALSE sebagai ganti digit yang sebenarnya juga diperbolehkan.

ghosts_in_the_code
sumber
6
Akan menyenangkan untuk memiliki beberapa test case yang sebenarnya untuk bekerja dengan
Liam
Apakah input array satu dimensi atau dua dimensi? Dan bisakah Anda masuk di sebelah kanan dengan <atau bisakah Anda juga masuk dengan ^?
bobbel
@bobbel Input dapat diberikan sebagai array 1 atau 2 dimensi, mana yang diperlukan untuk kode yang lebih pendek. Bahkan panah dapat dimasukkan sebagai 1 2 3 4 bukannya <> ^ v jika itu dapat mempersingkat kodenya. Dan ya, Anda bisa masuk melalui ^ juga.
ghosts_in_the_code
1
Kemungkinan array acak, 50 kali 50, tidak akan memiliki solusi hanya sekitar 0. Akan lebih baik jika Anda mengharuskan solusi memiliki setidaknya beberapa langkah tertentu atau pengguna menentukan jalur solusi.
DavidC
1
Ini seharusnya disebut "Pelarian panah" ... Masih memikirkan solusi.
gelas kimia

Jawaban:

6

CJam, 89 81 byte

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

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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.
Dennis
sumber