Втеча з лабіринту стріли


14

Питання

У вас є масив 50 на 50. Кожна комірка має стрілку, що вказує в будь-якому з чотирьох напрямків. Жодна комірка не порожня. Увійшовши до комірки, ви повинні вийти з неї у напрямку, вказаному стрілкою. Стрілка також може вказувати в тому ж напрямку, з якого ви прийшли, що призведе до тупику.

Ви можете почати з будь-якої комірки на крайній межі лабіринту і знайти шлях, який веде вас у лабіринт, і змушує вас вийти в якусь іншу комірку. Вхід буде заданий у вигляді масиву, що містить <,>, ^ і v. Вихід буде одноцифровим (булевим, цілим чи символом, що завгодно) як 0 (що вказує на те, що завдання неможливо) або 1 (що означає, що у вас є досягли поставленого завдання).

Приклад (фактичний масив буде більшим за цей)

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

Вихід буде

1
як ви можете ввести з <праворуч, що змусить вас вийти знизу v по шляху "<v v"

Завдання полягає в тому, щоб написати найкоротший можливий код, який отримає лабіринт як вхід, і визначити, де в ньому існує шлях, як зазначено в правилах, і вивести одну цифру 0 або 1

Виводити TRUE та FALSE замість фактичних цифр також дозволяється.


6
Було б непогано працювати з деякими тестовими справами
Ліам

Чи є вхід одновимірним масивом або двовимірним? І чи можете ви вводити праворуч лише знаком <або ви також можете вводити через ^?
боббел

@bobbel Введення може бути задано як 1 або 2-мірний масив, залежно від того, що потрібно для коротшого коду. Навіть стрілки можна ввести як 1 2 3 4 замість <> ^ v, якщо це може скоротити код. І так, ви можете ввести через ^ також.
ghosts_in_the_code

1
Ймовірність того, що випадковий масив 50 на 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.