fundo
Eu tenho um monte de imagens em preto e branco antigas e granuladas. Alguns deles mostram videiras subindo em uma parede, outros não - sua tarefa é classificá-los para mim.
Entrada e saída
Sua entrada é uma matriz 2D retangular de bits A , fornecida em qualquer formato conveniente. Não ficará vazio, mas não é garantido que ele contenha 0 e 1. A matriz representa uma videira se as seguintes condições forem válidas:
- A linha inferior de A contém pelo menos um 1. Essas são as raízes da videira.
- Cada 1 em A é conectado à linha inferior por um caminho de 1s que só vai para a esquerda, direita e para baixo (não para cima nem para a diagonal). Esses caminhos são os ramos da videira.
Sua saída é um valor de verdade consistente se a entrada representar uma videira e um valor de falsy consistente caso contrário.
Exemplos
Essa matriz representa uma videira:
0 0 1 0 0 1
0 1 1 0 0 1
0 1 0 1 1 1
1 1 0 1 0 1
0 1 1 1 0 1
0 0 1 0 1 1
Essa entrada não representa uma videira, pois há um 1 no meio da borda direita que não está conectado às raízes por um ramo:
0 0 0 1 1 0
0 1 0 1 1 1
0 1 0 1 0 1
0 1 1 1 1 0
0 0 1 1 0 1
A matriz all-0 nunca representa uma videira, mas a matriz all-1 sempre representa.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Entradas verdadeiras:
1
0
1
1
01
11
0000
0111
1100
1001
1111
1111
1111
1111
001001
011001
010111
110101
011101
001011
1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101
0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100
Entradas falsas:
0
1
0
10
01
000
000
000
011
110
000
111111
000000
101011
111001
010010
001000
000010
110001
001100
111111
110101
010011
111011
000110
010111
010101
011110
001101
11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111
fonte
Respostas:
Caracóis ,
251917 bytesExperimente online!
Explicação
O Snails é uma linguagem de correspondência de padrões 2D inspirada no regex, que foi originalmente desenvolvida para o nosso desafio de design de linguagem de correspondência de padrões 2D .
O
&
Snails faz o teste do padrão a partir de todas as posições iniciais possíveis e imprime0
ou1
depende se o padrão falha em algum deles ou combina com todos eles.Agora o Snails pode trabalhar com parênteses implícitos, portanto, o padrão é uma abreviação para o seguinte:
O
,
age como um*
em regex (ie corresponder zero ou mais vezes), enquanto o+
é o mesmo que em regex (coincidir com uma ou mais vezes). Então começamos combinando\0z
quantas vezes for necessário, o que corresponde a um único0
e, em seguida, permite que o caracol redefina sua direção arbitrariamentez
. Isso permite zeros na entrada, desde que uma célula de videira válida possa ser encontrada em qualquer outro lugar.Em seguida, combinamos pelo menos um
\1dlr
, que corresponde a um único1
e, em seguida, permite que o caracol redefina sua direção para baixo, esquerda ou direita. Observe que, se a célula em que começamos contiver um1
, apenas corresponderemos a esta parte. Basicamente, permite que o caracol atravesse uma videira de um galho até as raízes.Finalmente, precisamos garantir que alcançamos o solo procurando uma célula fora dos limites (
~
) abaixo (d
).fonte
JavaScript (ES6), 135 bytes
Nota: Devido a limitações do tipo inteiro, funciona apenas para videiras com até 31 caracteres de largura. Explicação: Cada linha é AND AND bit a bit com a linha adjacente para determinar os pontos de conexão e, em seguida, a
g
função é usada para expandir recursivamente a linha horizontalmente até que não possa mais expandir. Por exemplo, se duas linhas adjacentes estiverem1110111
e, em1011100
seguida, os pontos de conexão estiverem,1010100
isso será expandido para1110110
e1110111
então descobrirá que a linha está conectada. Se ag
função falhar, retornará zero, o queg
fará com que todas as funções subsequentes falhem também, e o resultado será falso. Se ag
função for bem-sucedida, ela retornará a nova linha que será propagada através doreduce
teste da próxima linha.fonte
Python 2, 254 bytes
Nenhuma biblioteca
Observe que os recuos do segundo e terceiro nível são formados com guias na contagem de bytes.
Experimente online
fonte
Wolfram - 254
Passe algum tempo fazendo esse trabalho, então vou deixar aqui:
Basicamente, construo um gráfico de grade com as bordas direcionadas apontando para cima, remova os vértices que correspondem a 0s, verifico se os componentes inferiores do vértice contêm todos os vértices. Ridículo, eu sei ...
fonte
Python + NumPy
204202195 BytesEspera
A
ser uma matriz numpy 2D.Pega a matriz, apóia zero colunas à esquerda e à direita e nivela a matriz.
s
é um estêncil que aponta para o elemento esquerdo, direito e inferior. O loop verifica cada elemento, exceto a última linha, se for,1
e pelo menos um de seu estêncil é1
, retornaFalse
caso contrário. Depois, verifique se a última linha contém alguma1
.Dois casos de teste para você:
Edit1:
1<0
é menor queFalse
Edit2:
flat
é uma boa alternativa paraflatten()
e usando tabuladores para a segunda intenção no loopfonte