Стрелка лабиринт побег

14

Вопрос

У вас есть 50 на 50 символов. Каждая ячейка имеет стрелку, указывающую в любом из четырех направлений. Ни одна клетка не пуста. При входе в ячейку вы должны выйти из нее в направлении, указанном стрелкой. Стрелка также может указывать в том же направлении, откуда вы пришли, что приводит к тупику.

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

Пример (фактический массив будет больше, чем этот)

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

Выход будет

1
как вы можете войти из <справа, что заставит вас выйти из нижней v по пути "<v v"

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

Вывод ИСТИНА и ЛОЖЬ вместо фактических цифр также допускается.

ghosts_in_the_code
источник
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.
Деннис
источник