Meus filhos têm um tapete de alfabeto para brincar, algo assim:
Depois de meses com os ladrilhos do tapete dispostos aleatoriamente, cansei-me e coloquei todos os ladrilhos do tapete agrupados por seções, de acordo com as cores de fundo. Então, se as letras representam a cor de fundo, eu tenho um tapete como este:
AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC
Portanto, para as cores A, B, C, D e E, sempre há uma maneira de conectar todos os ladrilhos com a mesma cor de fundo na horizontal ou na vertical no tapete. É o que chamo de um tapete adequadamente agrupado por cores . Você pode ver os grupos do exemplo anterior nas seguintes tabelas:
AA
A
A
AA
AAAA
AAAAAA
BB
BB
B
C
CCC
CCCC
CCC
CCCC
CCC
DDD
D
DD
DD
E
EE
E
EE
E
Além disso, existe apenas um grupo para cada cor, portanto, isso não seria válido:
ABA
ABA
Como os blocos de cores A não são agrupados em apenas um grupo. Isso também não seria válido porque os blocos não se conectam horizontal ou verticalmente:
AB
BA
O desafio
Dada uma matriz bidimensional de caracteres no intervalo ASCII imprimível (não precisa ser um quadrado desde que o tamanho de ambas as dimensões seja igual ou superior a 1), verifique se a matriz representa um tapete adequadamente agrupado por cores (cada caractere diferente na matriz representa uma cor diferente). A entrada pode estar em qualquer formato razoável, desde que represente uma matriz bidimensional de caracteres (matriz de caracteres 2D, matriz de seqüências de caracteres do mesmo comprimento etc.) e a saída deve ser um par de valores de verdade e falsey (0 / 1, 't' / 'f', verdadeiro / falso, desde que algo seja retornado e os valores de retorno sejam consistentes nas entradas).
Este é o código-golfe, portanto, pode ganhar o programa / função / método / lambda mais curto para cada idioma!
Exemplos
A truthy
AB
AB truthy
AB
BA falsey
ABCDE truthy
ABCDC falsey
**::dd22
***:d222
*:::::22 truthy
$$$%%%&&
$$%%&&&&
&&$$$%&& falsey
AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC truthy
AABB
ABBA
AAAA truthy
AAAB
AAAA
AAAA truthy
Meu tapete adequadamente agrupado por cores
(Eu ainda tenho que consertar essas fronteiras ...)
Respostas:
MATL ,
1615 bytesEntrada é uma matriz de caracteres 2D (com linhas separadas por
;
). A saída é0
se a entrada for qualificada ou1
não.Experimente online! Ou verifique todos os casos de teste .
Explicação
O código verifica essencialmente se cada caracter na entrada possui apenas um componente conectado, considerando a conectividade 4 (ou seja, sem diagonais).
Caracteres repetidos são processados repetidamente (que é mais golfista do que com desduplicação).
fonte
Befunge-93, 317 bytes
Editar: corrigido para contagem de bytes adequada. Também poderia ser jogado ainda mais
Imprime 1 como a verdade, 0 como a falsey
Experimente Online
Aqui está uma visualização do caminho que o ponteiro leva
Nota: isto é para uma versão antiga
Como funciona
Aqui estão alguns pseudocódigos rápidos e sujos
Basicamente, depois de armazenar a entrada, ela passa por tudo, verificando cada espaço. Quando encontra um espaço com um caractere, ele adiciona as coordenadas à pilha. Em seguida, verifica os espaços ao redor do mesmo caractere recursivamente, definindo cada espaço como 0. Quando a seção desse personagem estiver esgotada, ele verifica se esse personagem já teve uma seção. Nesse caso, retorne 0. Caso contrário, adicione-o à matriz de caracteres. Depois de percorrer toda a grade sem duplicatas, ele retorna 1.
Para pessoas familiarizadas com o Befunge, aqui está uma versão espaçada do código
fonte
J, 66 bytes
c
define um verbo que informa se uma matriz de zeros e uns é c onnected. Trata os únicos como um caso especial de verdade. Caso contrário, é necessária uma contagem ortogonal de vizinhos de cada célula, o sinal dessa contagem e a multiplicará pela matriz original: se esse produto for igual à matriz original, ele será conectado.A contagem de vizinhos é obtida deslocando-se nas 4 direções e somando. A mudança de direção é alcançada usando o recurso "
x
-arg can by a table" de rotação / mudança|.
Finalmente, a resposta em si foi obtida através da criação de uma matriz uns / zeros para cada elemento exclusivo
~.
da entrada e, em seguida, garantindo que todas essas matrizes estejam conectadas. Este é o verbo na segunda linha.Experimente online!
fonte
JavaScript (ES6), 114 bytes
Recebe entrada como uma matriz de seqüências de caracteres. Retorna
0
ou1
.Casos de teste
Mostrar snippet de código
Formatado e comentado
fonte
Wolfram Language (Mathematica) , 96 bytes
Experimente online!
Recebe a entrada como uma lista 2D de caracteres: por exemplo
{{"A","B"},{"C","D"}}
,.O
personagem é\[Transpose]
.Como funciona
Para cada personagem
c
na entrada, leva oSubgraph
doGridGraph
do mesmoDimensions
como a entrada que corresponde a cadaPosition
em quec
ocorre, e verifica se é umaConnectedGraphQ
.fonte
Python 2 , 247 bytes
Experimente online!
fonte
JavaScript (ES6), 181 bytes
Sempre que um novo bloco de cores for encontrado, preencha os conectados com cadeias de caracteres vazias. Se o tapete estiver adequadamente agrupado por cores, todos os ladrilhos deverão ser preenchidos com cadeias vazias.
Código de teste
Mostrar snippet de código
fonte