Imagine uma matriz bidimensional de valores booleanos, onde os 0s representam quadrados de grama em um terreno retangular e os 1s representam cercas.
Escreva uma função que aceite a matriz 2D como entrada e determine se você pode viajar de qualquer área de grama para qualquer outra área de grama, usando apenas movimentos norte / leste / oeste / sul, sem entrar em uma cerca.
Se qualquer área de grama na matriz estiver totalmente cercada por cercas (o que significa que você não pode viajar N / E / W / S para alcançar todas as outras áreas de grama na matriz) a função deve retornar false; caso contrário, ele deve retornar true.
Abaixo estão duas matrizes de amostra que você pode usar como entradas, embora sua função possa manipular não apenas essas, mas qualquer matriz 2D de valores booleanos:
0 0 0 0 0
0 1 0 0 0
0 1 1 1 1
0 0 0 0 0
0 0 0 1 1
(should return true)
0 1 0 1 0
0 1 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 1 1 0
(should return false, since the middle 0 in the top row is fully enclosed)
O menor código de trabalho vence. Eu escolherei o vencedor depois que uma semana se passou ou não houve novos envios dentro de 24 horas.
1 1 1
;1 0 1
;1 1 1
? Há uma célula de grama no centro. Visualmente, a célula de grama no centro é totalmente cercada por cercas, mas, por sua definição, não é.Respostas:
Matlab 45
fonte
input('');c=bwconncomp(~ans,4);c.NumObjects<2
Isso daria 45 caracteres.APL (39)
Uso:
fonte
Mathematica,
6058 caracteresUso:
fonte
f=Max@WatershedComponents[Image@#,CornerNeighbors->1>2]<2&
Ruby,
202198193Faz um preenchimento e depois verifica se há 0s restantes.
fonte
PHP 147
202177165149bytesEDIT Bati meu gzip hack com uma solução php real.
Um pouco longo .... insira como uma sequência de texto, sem espaços, linhas delimitadas por novas linhas. Ele é preenchido com
c
s e, em seguida, verifica se há zeros restantes. No loop, eu usoexp
como limite superior bruto no número de iterações necessárias. Aproveito a simetria para lidar com os casos duplicados em menos códigoAqui está um caso de teste não destruído:
fonte
Excel VBA,
305215 bytesSim, haha VBA , mas a natureza da matriz do problema sugere uma solução prática no Excel pode ser interessante (além disso, alguém já enviou uma resposta em meus outros idiomas!). Obviamente, o VBA não será o mais sucinto, mas acho que é razoável.
Essa inundação é preenchida a partir de um ponto de partida arbitrário e verifica se há alguma "grama"
R é um intervalo de planilha com 1 e 0 representando as cercas e a grama, conforme definido no problema. Bônus, o campo de jogo não precisa ser retangular nem contíguo.
Por exemplo, retornaria False. Os zeros à direita não podem ser alcançados a partir dos zeros à esquerda. O campo irregular não o quebra.
Algumas notas sobre o golfe.
Eu acho que alguns caracteres podem ser cortados se o requisito for invertido em relação a 1 e 0, mas não o suficiente para fazer com que valha a pena inverter.
O VBA insiste em muitos espaços em branco (a = b vs a = b), o que não ajuda na contagem de caracteres.
S precisa ser declarado explicitamente como um intervalo. Se for deixada uma variante, ela se transformará em um valor de intervalo, e não em um intervalo.
Talvez uma maneira melhor de ramificar o dilúvio? Não consegui criar um loop que salvasse caracteres para enviá-lo N / E / S / W
Edit: rethougt o caso base no preenchimento de inundação, conseguiu aparar bastante verificando se está em um caso base após a recursão, em vez de impedir a recursão.
fonte
Python (219 bytes)
Definitivamente não é o mais curto, mas é a minha primeira tentativa aqui, por isso estou orgulhoso disso:
Sua entrada deve ser uma String de 0s e 1s, onde as linhas são delimitadas por um caractere de nova linha (\ n).
Exemplo de uso:
fonte
and
, eu acho que salva alguns caracteresPython (196)
Enchimento padrão.
Leva a matriz através de STDIN com cada linha separada por um único espaço. Por exemplo "01010 01100 00000 00010 11110".
fonte
Mathematica 53
Chama a função interna
Image`MorphologicalOperationsDump`imageBinaryLabel
, que é semelhante aMorphologicalComponents
.fonte
PHP (286 caracteres)
Muito tempo, eu provavelmente fui o longo caminho.
Não-golfe:
fonte
C #, 235 bytes
Ele tenta preencher todas as células da placa de inundação, e faz com que apenas um preenchimento de inundação retorne verdadeiro.
fonte
Python 2.X + 3.X: 335 chararcters
Golfe:
Ungolfed:
fonte