Mũi tên mê cung thoát


14

Câu hỏi

Bạn có một mảng 50 x 50 ký tự. Mỗi ô có một mũi tên chỉ theo một trong bốn hướng. Không có ô nào là trống. Khi vào một ô, bạn phải thoát nó theo hướng được chỉ định bởi mũi tên. Mũi tên cũng có thể chỉ theo cùng một hướng bạn đến, dẫn đến ngõ cụt.

Bạn có thể bắt đầu từ bất kỳ ô nào ở biên giới ngoài cùng của mê cung và tìm một con đường đưa bạn vào mê cung và khiến bạn phải thoát ra ở một số ô khác. Đầu vào sẽ được cung cấp dưới dạng một mảng chứa <,>, ^ và v. Đầu ra sẽ là một chữ số duy nhất (Boolean, số nguyên hoặc ký tự, mọi thứ sẽ làm) là 0 (chỉ ra rằng nhiệm vụ là không thể) hoặc 1 (chỉ ra rằng bạn có đạt được nhiệm vụ).

Ví dụ (mảng thực tế sẽ lớn hơn thế này)

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

Đầu ra sẽ là

1
vì bạn có thể nhập từ <bên phải, điều này sẽ khiến bạn thoát khỏi đáy v theo đường dẫn "<v v"

Nhiệm vụ là viết mã ngắn nhất có thể sẽ nhận mê cung làm đầu vào và xác định nơi tồn tại một đường dẫn trong đó như được chỉ định trong quy tắc và xuất ra một chữ số 0 hoặc 1

Đầu ra TRUE và FALSE thay vì chữ số thực cũng được cho phép.


6
Thật tuyệt khi có một số trường hợp thử nghiệm thực tế để làm việc với
Liam

Là đầu vào một mảng một chiều hay hai chiều? Và bạn chỉ có thể nhập bên phải bởi một <hoặc bạn cũng có thể nhập bằng ^?
bobbel

@bobbel Đầu vào có thể được cung cấp dưới dạng mảng 1 hoặc 2 chiều, tùy theo yêu cầu đối với mã ngắn hơn. Ngay cả các mũi tên có thể được nhập là 1 2 3 4 thay vì <> ^ v nếu điều đó có thể rút ngắn mã. Và vâng, bạn có thể nhập thông qua ^.
ghosts_in_the_code

1
Khả năng một mảng ngẫu nhiên, 50 x 50, sẽ không có giải pháp chỉ là khoảng 0. Sẽ tốt hơn nếu bạn yêu cầu giải pháp có ít nhất một số bước nhất định hoặc người dùng chỉ định đường dẫn giải pháp.
DavidC

1
Điều này nên được gọi là "Một mũi tên thoát" ... Vẫn đang cân nhắc một giải pháp.
cốc

Câu trả lời:


6

CJam, 89 81 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.