Головоломка
- Выведите 0, если лабиринт не может быть решен
- Выведите 1, если можно найти лабиринт n * m (одним или несколькими способами)
(поэтому я не спрашиваю пути, но если это возможно решить !!!)
Входной массив (2d):
[[0,0,0,0,0,0,1],[0,0,0,0,0,1,0],[0,0,0,0,1,0,0],[1,0,0,0,0,0,0]]
XXXXXXXXX
XS XX
X X X
X X X
XX FX
XXXXXXXXX
0 = can pass through
1 = can not pass trough
[0][n] is the last block of the first line
[m][0] is the first block of the last line
Правило Начальная позиция - 0,0, а конечная позиция - n, m. Вы можете перемещаться только по горизонтали и вертикали. Самый короткий код выигрывает
Ответы:
CJam,
4241393635 байтОсновано на идеях в этом ответе .
4 байта благодаря Оптимизатору.
Формат ввода:
источник
q2Wts~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=
- 36. Хотя предполагается, что первые три символа ввода будут[[0
Дьялог АПЛ, 27 знаков
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
оценил вклад. APL различает матрицу и вектор векторов. Эта программа предполагает, что ввод является матрицей.(~×⍳∘⍴)A
является вилкой, эквивалентной(~A) × ⍳⍴A
. Необходимо избегать упоминания⎕
дважды или введения переменной.⍴A
это формаA
. Для матрицы 4 на 7 форма имеет вид4 7
.⍳
это генератор индекса.⍳4
есть1 2 3 4
.⍳4 7
векторы,(1 1)(1 2)...(4 7)
расположенные в матрице 4 на 7.~A
переворачивает битыA
.×
умножая⍳⍴A
на перевернутые биты, мы сохраняем координаты всех свободных ячеек и превращаем все стены в0 0
.,
распределяет матрицу координатных пар, т.е. линеаризует ее в вектор. В этом случае вектор будет состоять из пар.∘.-⍨A
илиA∘.-A
вычитает элементыA
попарно. Обратите внимание, что здесь элементыA
сами являются парами.|
абсолютная величина+/¨
Суммируйте каждую пару абсолютных значений. Это дает нам сетку расстояний между каждой парой клеток в лабиринте, за исключением стен.1≥
нас интересуют только соседи на расстоянии не более 1, это тоже исключает стены. Теперь у нас есть матрица смежности графа.∨.∧⍨⍣≡
Флойд - алгоритм транзитивного замыкания Варшалла(f⍣n)A
(здесь не используется) гдеn
целое число - оператор степени. Это относитсяf
кA
n
времени:f f ... f A
.(f⍣g)A
гдеg
- функция, оператор с фиксированной запятой, он же «предел мощности». Он продолжает вычисления серииA
,f A
,f f A
, ... до((f⍣i)A) g ((f⍣(i+1))A)
возвращения верно для некоторыхi
. В этом случае мы используем match (≡
) какg
.∨.∧⍨A
илиA∨.∧A
это шаг в алгоритме Флойда.f.g
является обобщением матричного умножения (+.×
), здесь мы используем conunction (∧
) и disjunction (∨
) вместо+
и×
.⊃⌽
После того⍣≡
, как шаг был применен достаточно раз и достиг стабильного состояния, мы должны посмотреть в верхнем правом углу матрицы, чтобы получить результат, поэтому мы переворачиваем его (⌽
) и берем первый, левый верхний элемент (⊃
).Визуализация
⍣≡
шаговисточник
Python, 164 байта
Я неохотно писал об этом, потому что это практически то, как я обычно делаю заливку, просто слегка играю в гольф. Но здесь это все равно.
источник
Perl, 73 байта
69 байт кода + 4 байта для
-n0E
(не знаю, как подсчитывались теги в 2014 году, поэтому я посчитал их 4 вместо 2, но это не имеет большого значения).Попробуйте онлайн! (и если вы замените
1111011
строку на1111111
, лабиринт больше не будет разрешен, и результат будет0
вместо1
: Попробуйте онлайн! )Пояснения:
Этот код найдет каждую достижимую ячейку лабиринта (и пометит их с помощью a
A
): если ячейка касается ячейки, помеченной символом aA
, она достижима, и мы помечаем ееA
тоже; и мы делаем это снова (redo
). Это делается благодаря двум регулярным выражениям:s/(^0|A)(.{@{+}})?0/A$2A/s
проверяет, находится ли пробел справа или снизуA
, аs/0(.{@{+}})?A/A$1A/s
проверяет, находится ли пробел слева или сверху аA
. В конце, если в последней ячейке естьA
достижимость, в противном случае это не так (это то, чтоsay/A$/+0
проверяет;+0
здесь, чтобы убедиться, что результат будет0
или1
вместо пустой строки и1
).Обратите внимание, что
/.*/
будет соответствовать всей строке, таким образом, настройка@+
до индекса конца первой строки, который соответствует размеру строки, который позволяет использовать.{@{+}}
для соответствия ровно столько символов, сколько имеется в строке. (@{+}
эквивалентно@+
, но только первое может использоваться в регулярных выражениях)источник
1
.Рубин,
133130129 знаковВход на STDIN, выходы
1
или0
на STDOUT.Досадно долго. Он просто выполняет заливку
1
s из from(0, 0)
, а затем проверяет, является ли «конечный» квадрат a1
.источник
Java, 418 байт
Мой первый код гольф. Я не знаю, почему я выбрал Java - это так плохо для игры в гольф xD
Пример лабиринта будет введен через stdin следующим образом:
источник
String[]
иa
и получите ввод из аргументов командной строки, а не из StdIn, что разрешено.Питон 184
188Это заняло гораздо больше времени, чем я думал :( В любом случае, я добавлю объяснение, как только я больше не смогу играть в гольф.
источник
J, 75 символов
Включение матрицы смежности (очень мало времени и памяти). (Это называется powering на английском языке?)
Некоторые тестовые случаи:
источник
Python 3 , 147 байт
Попробуйте онлайн!
Порт моего ответа Найти кратчайший маршрут на дороге ASCII .
источник
Python 3 , 184 байта
Попробуйте онлайн!
источник