Ваша задача заключается в вводе схемы расположения тюрьмы, чтобы определить, может ли кто-либо из заключенных сбежать.
вход
Ввод может быть в любом приемлемом формате, таком как строка, массив, массив массивов и т. Д. Ввод будет состоять из трех символов, в данном случае #
, P
и пробела. Ввод не обязательно будет содержать все три символа.
#
: СтенаP
: Заключенный- пространство: пустое пространство
Пример ввода будет выглядеть так:
#####
# #
# P #
# #
#####
Выход
Истинная / ложная ценность того, является ли тюрьма безопасной. Тюрьма безопасна только в том случае, если в ней могут содержаться все заключенные. Если любой заключенный может сбежать, это небезопасно.
Заключенный может сбежать, если он не полностью окружен стеной. Диагональное соединение полностью закрыто.
Контрольные примеры
############# Truthy
# P # P# #
# # # P #
#############
############# Truthy
# P P #
# # # P #
#############
############# Falsey
# P # P# #
# # # P #
########## ##
#### Truthy
# #
# #
# P ####
####
P Falsey
### Falsey
# #
# #
### P
code-golf
ascii-art
decision-problem
grid
path-finding
TheLethalCoder
источник
источник
Ответы:
Улитки , 13 байт
Попробуйте онлайн!
Отпечатки
0
для небезопасных тюрем и размер ограничительной рамки ввода для защищенных тюрем.Идея состоит в том, чтобы гарантировать, что мы не сможем найти путь от
P
ячейки a до границы (~
), движущейся только ортогонально (o
) через пробелы. Этоt
телепорт, так что независимо от того, где мы пытаемся найти совпадение, он пытается найти все возможные исходные позицииP
.источник
C # (.NET Core) ,
485 480 474 470 421408 байтАбсолютно неправильный инструмент и подход, но тем не менее ...
' '
с32
в сравнениях.Попробуйте онлайн!
По сути, я расширяю позиции P всякий раз, когда появляется белое пространство, пока оно не достигнет (или не достигнет) границы макета.
Некоторые лицензии:
char[][]
как вход для макета.0
как небезопасные и1
безопасные.источник
1>0
и1<0
корочеtrue
иfalse
.==0
стать<1
? У вас есть как минимум 1 байт ненужного пробела. Вы можете удалитьnew[]
S? (Не всегда работает, но иногда как вint[] n = {1,2,3};
).{m[x][y]= p; c.Push(new[]
->{m[x][y]=p;c.Push(new[]
char
s сint
s, поэтому я считаю, что вы можете заменить на==' '
to==32
для сохранения байтов. Вы должны быть в состоянии сделать это на аналогичных сравнениях.Perl 5 , 69 байт
-10 байт благодаря @Grimy .
-2 байта благодаря @Neil .
77 байт кода +
-p0
флаги.Попробуйте онлайн!
Несколько коротких объяснений:
Идея заключается в том, чтобы заключить
P
повсюду. Если кто-либоP
находится в первой / последней строке или в первом / последнем столбце, заключенные могут туда и обратно бежать, что означает, что тюрьма не защищена.s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s
заменяет пробел справа или ниже aP
наP
, или пробел слева или сверху aP
.Наконец,
/\A.*P|P.*\Z|^P|P$/m
проверяет, начинается ли строка или заканчивается ли онаP
или есть лиP
в первой или последней строке.источник
*
или+
, самое длинное совпадение, которое он может сделать, это размер строки ... Теперь, конечно, если вы сравните с подходом, более ручным, например, на основе массивов тогда да это совсем неэффективно!s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s
.s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s
.JavaScript (ES6),
134133 байтаПринимает ввод как массив массивов символов. Возвращает
0
(небезопасно) или1
(безопасно).Контрольные примеры
Показать фрагмент кода
источник
&&
быть, просто с&
?|
. Спасибо!JavaScript (ES6), 121 байт
Принимает ввод как разделенную новой строкой прямоугольную строку. Возвращает 0 для небезопасного и 1 для безопасного. Исходя из моего ответа « Обнаружить провальные замки» , хотя было бы более эффективно проверять сбежавшего заключенного на каждом этапе, а не после того, как они закончили исследовать тюрьму.
источник
Октава,
6455 байтПопробуйте онлайн!
или же
Проверьте все контрольные примеры!
Объяснение:
источник
APL (Dyalog Classic) , 40 байтов
Попробуйте онлайн!
'# '⍳⍵
кодирование'#'
,' '
,'P'
а 0 1 2(⌽1,⍉)⍣4
окружить с 1с(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡
Заполнение max-of-соседей ненулевых ячеек⊃2≠
у нас нет 2 вверху слева?источник
Stax , 35 байтов CP437
Попробуйте онлайн!
Конечно, язык игры в гольф без внутреннего, чтобы справиться с поиском пути, может сделать это также!
объяснение
Использует распакованный формат для объяснения.
источник
SmileBASIC,
154146 байтЯ надеялся, что ответ с использованием заливки будет короче, чем этот.
Заменить
31
на соответствующий символ ASCII.источник