Seu desafio recebe uma entrada de um layout da prisão para determinar se algum dos presos pode escapar.
Entrada
A entrada pode estar em qualquer formato razoável, como uma sequência, matriz, matriz de matrizes etc. A entrada será composta por três caracteres, neste caso #
, P
e espaço. A entrada não conterá necessariamente os três caracteres.
#
: Uma paredeP
: Um prisioneiro- espaço: um espaço vazio
Um exemplo de entrada será semelhante a:
#####
# #
# P #
# #
#####
Resultado
Um valor verdadeiro / falso de se a prisão é segura ou não. A prisão só é segura se puder conter todos os presos. Se qualquer prisioneiro puder escapar, não é seguro.
Um prisioneiro pode escapar se não estiver totalmente cercado por um muro. Uma junção diagonal é totalmente fechada.
Casos de teste
############# 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
fonte
fonte
Respostas:
Caracóis , 13 bytes
Experimente online!
Imprime
0
para prisões inseguras e o tamanho da caixa delimitadora da entrada para prisões seguras.A idéia é garantir que não possamos encontrar um caminho de uma
P
célula para fora dos limites (~
) movendo-se apenas ortogonalmente (o
) pelos espaços. Ot
é um teletransporte para que, independentemente de onde tentemos a partida, tente todas as posições iniciais possíveis para encontrar aP
.fonte
C # (.NET Core) ,
485 480 474 470 421408 bytesA ferramenta e abordagem absolutamente erradas, mas mesmo assim ...
' '
por32
nas comparações.Experimente online!
Basicamente, expanda as posições dos Ps sempre que houver um espaço em branco até atingir (ou não) a borda do layout.
Algumas licenças:
char[][]
como entrada para o layout.0
como inseguro e1
seguro.fonte
1>0
e1<0
são mais curtos quetrue
efalse
.==0
se tornar<1
? Você tem pelo menos 1 byte de espaço em branco irrelevante. Você pode remover osnew[]
? (Nem sempre funciona, mas às vezes gosta deint[] n = {1,2,3};
).{m[x][y]= p; c.Push(new[]
->{m[x][y]=p;c.Push(new[]
char
s deint
s então eu acredito que você pode substituir as==' '
de==32
bytes para salvar. Você também deve fazer isso em comparações semelhantes.Perl 5 , 69 bytes
-10 bytes graças a @Grimy .
-2 bytes graças a @Neil .
77 bytes de código +
-p0
sinalizadores.Experimente online!
Algumas breves explicações:
A idéia é colocar um
P
lugar onde os prisioneiros possam ir. Se houver algumP
na primeira / última linha, ou na primeira / última coluna, os presos podem ir até lá e fugir, o que significa que a prisão não é segura.s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s
substitui um espaço à direita de ou abaixo de aP
por aP
, ou um espaço à esquerda ou em cima de aP
.Por fim,
/\A.*P|P.*\Z|^P|P$/m
verifica se uma linha começa ou termina com aP
ou se existe umaP
na primeira ou na última linha.fonte
*
ou+
, a correspondência mais longa que pode ser feita é o tamanho de uma linha ... Agora, é claro, se você comparar com uma abordagem mais manual, baseada em matrizes, por exemplo , sim, é bastante ineficiente!s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s
.s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s
.JavaScript (ES6),
134133 bytesRecebe a entrada como uma matriz de matrizes de caracteres. Devoluções
0
(inseguras) ou1
(seguras).Casos de teste
Mostrar snippet de código
fonte
&&
s podem ser apenas&
?|
. Obrigado!JavaScript (ES6), 121 bytes
Recebe a entrada como uma string retangular delimitada por nova linha. Retorna 0 para inseguro e 1 para seguro. Com base na minha resposta para Detectar castelos fracassados , embora fosse mais eficiente testar um prisioneiro escapado a cada passo, em vez de eles terminarem de explorar a prisão.
fonte
Oitava,
6455 bytesExperimente online!
ou
Verifique todos os casos de teste!
Explicação:
fonte
APL (Dyalog Classic) , 40 bytes
Experimente online!
'# '⍳⍵
codificar'#'
,' '
,'P'
como 0 1 2(⌽1,⍉)⍣4
surround com 1s(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡
número máximo de vizinhos de preenchimento de células diferentes de zero⊃2≠
não temos um 2 no canto superior esquerdo?fonte
Stax , 35 bytes CP437
Experimente online!
Certamente, uma linguagem de golfe sem um interno para lidar com a localização de caminhos também pode fazer isso!
Explicação
Usa o formato descompactado para explicar.
fonte
SmileBASIC,
154146 bytesEu esperava que uma resposta usando preenchimento fosse mais curta que isso.
Substitua
31
pelo caractere ASCII correspondente.fonte