fundo
Um poliomino é chamado L-convexo , se for possível viajar de qualquer ladrilho para outro ladrilho por um caminho em forma de L, ou seja, um caminho que segue as direções cardinais e muda de direção no máximo uma vez. Por exemplo, o poliomino de 1
s na figura
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
não é L-convexo, pois os dois caminhos em forma de L do canto inferior esquerdo 1
para o canto superior direito 1
contêm um 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
No entanto, o poliomino de 1
s nesta figura é L-convexo:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
Entrada
Sua entrada é uma matriz 2D de bits no formato nativo do seu idioma ou como uma string delimitada por nova linha, se o nosso idioma não tiver matrizes. É garantido que contenha pelo menos um 1
.
Resultado
Sua saída deve ser um valor verdadeiro se o conjunto de 1
s for um poliomaino L-convexo e um valor falso se não. Essas saídas devem ser consistentes: você deve gerar o mesmo valor verdadeiro para todas as entradas L-convexas e o mesmo valor falso para outras. Observe que um conjunto desconectado de 1
s (que não é um poliomino) resulta em uma saída falsa.
Regras e Pontuação
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
Esses casos de teste também devem funcionar se você girar ou refletir as matrizes ou adicionar linhas de 0
s a qualquer borda.
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Respostas:
Caracóis ,
4524Logo após postar minha solução inicial, percebi que havia uma maneira muito melhor. O programa original percorreu o quadrado formado pelos caminhos entre dois
1
s, testando a presença de um 0 em cada par de lados. Ele também precisava ter um caso especial para caminhos de linha reta. A nova versão começa se teletransportando de um1
para o outro e testando a ausência de um caminho reto ou em forma de L de1
s de volta ao início.fonte
Matlab, 182 bytes
Idéia: Repita para cada um
1
na matriz polyomino:1
mas o restante zero.1
nesta nova matriz (repita até que nada mude mais)1
como vizinhos na direção x se houver1
como vizinhos no polinômio1
nesta nova matriz (repita até que nada mude mais)1
como vizinhos na direção x se houver1
como vizinhos no polinômioAgora,
1
na nova matriz, deve abranger todos1
os elementos da polinômio-matriz que são alcançáveis a partir do ponto de partida especificado, primeiro indo na direção x e depois na direção y. Agora podemos repetir o mesmo processo, mas primeiro indo na direção y e depois na direção x. Agora todas1
as matrizes polyomino devem ser alcançadas ao mesmo tempo ou nos dois momentos. Caso contrário, encontramos uma posição na matriz polynomio que não pode ser alcançada de todas as outras posições por umL
-path.Golfe:
Com comentários:
Script de casos de teste:
fonte
Javascript ES6, 290 bytes
Ok, talvez não ganhe nenhum prêmio por concisão, mas usa uma abordagem inovadora. Veja a versão ungolfed para saber como funciona.
A prova desse método pode ser encontrada em: Autômatos celulares e sistemas complexos discretos .
Ungolfed:
fonte
Mathematica,
129127 bytesExplicação:
Primeiro, se houver
0
entre dois1
s na mesma linha ou coluna, a matriz não é L-convexa, porque não podemos conectar os dois1
s.Após excluir este caso, a cada dois
1
s na mesma linha ou coluna pode ser conectada por um caminho reto. Podemos gerar um gráfico, cujos vértices são as posições de1
s na matriz e as arestas são pares de1
s na mesma linha ou coluna. Então a matriz é L-convexa se e somente se o diâmetro do gráfico for menor que 3.fonte
JavaScript (ES6) 174
Observando a grade de células vazias ou preenchidas, para qualquer par de células preenchidas, verifico os caminhos horizontais para a outra coluna da célula (pode haver 1 se as células estiverem na mesma linha, mais ou 2) e os caminhos verticais para o outra linha da célula (também pode haver 1 ou 2). Se eu encontrar uma célula vazia nos caminhos verticais ou horizontais, não poderá haver um caminho em forma de L entre as células.
(Foi difícil tentar explicar essa explicação - espero ter ficado claro)
Teste a execução do trecho abaixo em qualquer navegador compatível com EcmaScript 6
fonte