CJam, 33 32 20 19 17 bytes
Versão revisada, com suporte massivo do @ Sp3000 e do @ MartinBüttner:
qN/_z]{:e`z,3<}/|
Experimente online
Contribuições
- O @ Sp3000 sugeriu uma simplificação crítica ao meu algoritmo original.
- @ MartinBüttner aplicou suas habilidades malucas de golfe à abordagem revisada, que quase certamente resultou em um código mais curto do que eu teria pensado mesmo depois de considerar a simplificação.
Algoritmo e Prova
A seguir, são apresentados os critérios para o quebra-cabeça se separar horizontalmente. O caso vertical pode ser determinado olhando para colunas em vez de linhas ou transpondo a matriz de caracteres e olhando para as linhas novamente.
Vou usar o termo "esticar" para uma sequência máxima das mesmas letras. Por exemplo, as seguintes linhas têm 1, 2 e 3 trechos, respectivamente:
AAAAAAAA
BBBAAAAA
AABBBAAA
Também usarei o termo "intertravado" para uma linha / quebra-cabeça que não pode se separar.
A observação principal é que o quebra-cabeça pode se separar se e somente se todas as linhas tiverem no máximo 2 trechos . Ou invertida, é intertravada se e somente se houver alguma linha com mais de 2 trechos .
O que se segue pode não se qualificar como uma prova matemática estrita, mas acredito que é uma explicação convincente do porquê disso.
É fácil ver que o quebra-cabeça está intertravado se tiver linhas de mais de 2 trechos. Olhando para uma linha com 3 trechos:
BBBAAB
é claro que impede que o quebra-cabeça se afaste porque o A
trecho está travado entre os B
trechos. Isso significa que a linha está intertravada, o que, por sua vez, torna todo o quebra-cabeça intertravado.
A direção oposta da prova não é tão óbvia. Precisamos mostrar que não há quebra-cabeças interligados em que todas as linhas tenham apenas 1 ou 2 trechos. Começando com algumas observações:
- Linhas com apenas 1 trecho não contribuem para o bloqueio de um quebra-cabeça, pois podem deslizar em qualquer direção sem colisões.
- Se todas as linhas com 2 trechos tiverem a mesma ordem de
A
e B
, o quebra-cabeça claramente não está intertravado. Nesse caso, todas as A
células são deixadas de todas as B
células, ou vice-versa, e não há colisões ao deslizar as duas peças.
O único caso complicado seria quebra-cabeças em que temos linhas com 2 trechos de ordem diferente. Vou mostrar que esses quebra-cabeças não existem sob as especificações fornecidas. Para mostrar isso, vejamos um quebra-cabeça parcial que possui essa configuração, onde .
estão os curingas:
.......
AAABBBB
.......
BBAAAAA
.......
Agora, a especificação diz que as células A
e B
são simplesmente conectadas em todos os quebra-cabeças válidos. Para fazer as A
células conectadas no quebra-cabeça parcial acima, temos duas opções:
Nós contornamos um dos trechos de B
, por exemplo:
..AAAAAA
AAABBBBA
.......A
BBAAAAAA
........
Para fazer isso, inevitavelmente estendemos uma das linhas para ter 3 trechos, portanto isso nunca nos dará um quebra-cabeça válido, onde todas as linhas têm no máximo 2 trechos.
Nós os conectamos em um caminho direto:
.......
AAABBBB
..A....
BBAAAAA
.......
As A
células agora estão simplesmente conectadas e ainda não há linhas com mais de 2 trechos. No entanto, as B
células também precisam ser simplesmente conectadas. O caminho direto agora está bloqueado pelas A
células conectadas e a única maneira de conectar as B
células é fazer um loop em torno de um dos trechos de A
células. Isso leva ao caso 1, onde não podemos fazer isso sem criar linhas de três trechos.
Para contar as extensões, a implementação usa o operador CJam RLE.
Explicação do Código
qN/ Get input and split at newlines.
_z Make a transposed copy.
] Wrap the original and transposed puzzle in an array so that we can
loop over the two.
{ Start of loop over original and transposed puzzle.
:e` Apply RLE to all rows.
z, Transpose the matrix with the RLE rows, and take the element count of the
result. Or in other words, take the column count. This will be the length
of the longest row after RLE.
3< Check the length for less than 3.
}/ End of loop over original and transposed puzzle.
| Or the results of the two.