화살 미로 탈출


14

질문

50 x 50 문자 배열이 있습니다. 각 셀에는 네 방향 중 하나를 가리키는 화살표가 있습니다. 빈 셀이 없습니다. 셀을 입력 할 때 화살표로 지정된 방향으로 셀을 종료해야합니다. 화살표는 원래 방향과 같은 방향을 가리키고 막 다른 길로 이어질 수 있습니다.

미로의 가장 바깥 쪽 경계에있는 셀에서 시작하여 미로로가는 경로를 찾아 다른 셀에서 빠져 나갈 수 있습니다. 입력은 <,>, ^ 및 v를 포함하는 배열로 제공됩니다. 출력은 0 (작업이 불가능 함을 나타냄) 또는 1 (귀하가 있음을 나타냄)로 한 자리수 (부울, 정수 또는 문자, 무엇이든 상관 없음)가됩니다. 작업을 달성).

(실제 배열은 이것보다 큽니다)

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

출력은

1
오른쪽에있는 <를 입력하면 "<v v"경로를 사용하여 하단 v에서 빠져 나옵니다.

이 작업은 미로를 입력으로받을 수있는 가장 짧은 코드를 작성하고 규칙에 지정된대로 경로가 존재하는 위치를 결정하고 단일 숫자 0 또는 1을 출력하는 것입니다.

실제 숫자 대신 TRUE 및 FALSE를 출력 할 수도 있습니다.


6
실제 테스트 사례를 다루는 것이 좋을 것입니다
Liam

입력 값이 1 차원 배열입니까 아니면 2 차원입니까? 그리고 오른쪽으로 <만 입력해도되고 ^로도 입력 할 수 있습니까?
bobbel

@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.