Escreva um programa ou função que utilize uma sequência de linhas múltiplas de 0
's 1
' e 's. Nenhum outro caractere estará na string e a string sempre será retangular (todas as linhas terão o mesmo número de caracteres), com dimensões tão pequenas quanto 1 × 1, mas, caso contrário, os 0
's 1
' e 's podem ser organizados arbitrariamente.
Você pode assumir que a string possui uma nova linha à direita opcional e, se desejar, pode usar dois caracteres ASCII imprimíveis distintos no lugar de 0
e 1
.
Imprima ou retorne um valor verdadeiro se todas as regiões conectadas ao caminho de 0
's 1
' e 's na cadeia de caracteres forem retângulos sólidos , caso contrário, produz um valor falso .
Um caminho conectado à região de 0
significa que, de qualquer um 0
na região, todos os outros 0
podem ser alcançados movendo-se para cima, para baixo, esquerda e direita para os outros 0
(e não se movendo na diagonal, não se movendo para nenhum 1
, e não se movendo fora dos limites de cordas). A mesma idéia se aplica ao 1
caminho de regiões conectadas.
Um retângulo sólido de 0
's significa que toda a área do retângulo é preenchida com 0
' e 1
' não '. A mesma idéia se aplica a 1
retângulos sólidos.
O código mais curto em bytes vence. O desempatador é a resposta anterior.
(Observe que a corda não se enrola com as condições de contorno toroidais .)
Exemplos
1) Esta sequência de entrada possui 3 regiões conectadas ao caminho (2 para 0
e 1 para 1
). Apenas a 00
região inferior direita é um retângulo sólido, portanto a saída seria falsa.
0011
0111
0100
2) Esta sequência de entrada possui 4 regiões conectadas ao caminho (2 para ambos 0
e 1
). Todos eles são retângulos sólidos, portanto a saída seria verdadeira.
0011
0011
1100
3) Esta entrada possui 2 regiões conectadas ao caminho, mas apenas uma delas é um retângulo sólido, portanto a saída seria falsa.
00000000
01111110
00000000
4) Esta entrada possui apenas 1 região conectada ao caminho e é trivialmente um retângulo sólido, portanto a saída é verdadeira.
11111111
11111111
11111111
Casos de teste
Um T
logo abaixo da string de entrada F
significa verdade , significa falsidade.
0
T
1
T
00
T
01
T
10
T
11
T
0000000
T
1111111
T
011100100100101100110100100100101010100011100101
T
00
11
T
01
10
T
01
11
F
00
01
F
11
11
T
110
100
F
111
000
T
111
101
111
F
101
010
101
T
1101
0010
1101
0010
T
1101
0010
1111
0010
F
0011
0111
0100
F
0011
0011
1100
T
00000000
01111110
00000000
F
11111111
11111111
11111111
T
0000001111
0000001111
T
0000001111
0000011111
F
0000001111
1000001111
F
1000001111
1000001111
T
1110100110101010110100010111011101000101111
1010100100101010100100010101010101100101000
1110100110010010110101010111010101010101011
1010100100101010010101010110010101001101001
1010110110101010110111110101011101000101111
F
Ruby, 76
Em qualquer grade composta inteiramente de retângulos, cada linha deve ser idêntica à linha anterior ou ter todos os bits invertidos de 0 a 1 e vice-versa.
Isso é fácil de provar. Pegue um pedaço de papel e desenhe linhas arbitrárias verticais e horizontais até o fim. Agora pinte os retângulos usando apenas 2 cores. Você terminará com um tabuleiro de damas distorcido, onde todas as cores mudam em cada linha.
Deseja desenhar retângulos com linhas apenas parcialmente abertas? tente excluir um segmento de qualquer uma das suas linhas. Agora você precisará de mais de 2 cores para colorir seu design, porque você terá pontos em que 3 retângulos se encontram (2 cantos e uma aresta). Esses designs são, portanto, irrelevantes para esta pergunta.
Estou surpreso que as respostas até agora não tenham notado isso.
Eu acho que esse algoritmo deve ser muito menor em alguma outra linguagem.
Ungolfed in program program
fonte
s.scan(/^?.*\n/)
ajudaria a salvar bytes.Caracóis , 20 bytes
Imprime a área da grade se não houver um quadrado 2x2 com 3 zeros e um ou 3 unidades e um zero, ou
0
se esse quadrado 2x2 existir.fonte
MATL , 12 bytes
O mesmo algoritmo da ótima resposta do @ sp3000 .
Para permitir a entrada de várias linhas, o MATL precisa que a matriz de caracteres de linha (string) seja explicitamente criada usando o caractere
10
para nova linha. Portanto, a entrada dos quatro exemplos é (observe que[]
é concatenação, portanto, cada um deles é uma matriz de linhas de caracteres):e os três últimos casos de teste são
A saída de verdade é uma matriz que contém apenas um.
Experimente online!
Explicação
Este usa o fato de que a paridade de caracteres
'0'
e'1'
é a mesma que a de números0
e1
, portanto, não há necessidade de converter de char para o dígito que representa,fonte
['first line' 10 'second llne']
, onde10
é ASCII para nova linha. Isso é aceitável?'0011 0111 0100'
JavaScript (ES6), 69 bytes
Acredito que o critério do retângulo de conexão do caminho é equivalente a exigir que, dados os quatro pontos que formam os cantos de um retângulo arbitrário, exista um número par de
1
s. Observe que a paridade do retângulo (0, b), (x, y) é igual a (0, b), (a, y)^
(a, b), (x, y), portanto, só tenho que verificar aqueles retângulos cujo canto superior esquerdo está em (0, 0). Também pelas leis de De Morgan,!.some()
é o mesmo.every(!)
que me poupa alguns bytes.Edit: Percebo que a solução Jelly verifica a paridade dos cantos de todos os retângulos 2 × 2, que podem ser equivalentes.
fonte
JavaScript (ES6), 79
O mesmo algoritmo da resposta Jelly do @ Sp3000 (e feliz por não ter que provar que funciona). Apenas 8 vezes mais
Menos golfe
Suíte de teste
fonte
Grime v0.1, 31 bytes
Imprime
1
para correspondência e0
sem correspondência. Experimente online!Explicação
Grime é minha linguagem de correspondência de padrões 2D. Eu o modifiquei hoje, mas apenas para alterar o caractere de um elemento de sintaxe (em
`
vez de,
), para que não afete minha pontuação.Estou usando uma abordagem semelhante à do Sp3000 : uma entrada é falsa se contiver um retângulo 2 × N cuja linha contenha ambos
0
e1
, e a outra linha não.fonte
JavaScript (ES6), 64 bytes
Com base na observação de @ LevelRiverSt de que cada linha deve ser igual ou oposta à primeira.
fonte