Escreva um programa ou função que receba uma grade retangular de texto em que cada célula seja um A
ou a B
. Todas as A
células formarão uma forma simplesmente conectada , ou seja, serão conectadas ortogonalmente sem furos (as letras vizinhas na diagonal não contam como conectadas). Da mesma forma, todas as B
células formarão outra forma simplesmente conectada. A grade sempre conterá pelo menos um A
e pelo menos um B
.
Imagine que a grade é na verdade dois pedaços de plástico fino em forma de bloco, representados pelas porções A
e B
. Se ela fosse colocada sobre uma mesa, as duas peças poderiam ser separadas, mantendo as duas completamente sobre a mesa?
Imprima ou retorne um valor verdadeiro se os dois A
e as B
formas puderem ser separados assim, simplesmente separando-os. Caso contrário, imprima ou retorne um valor falso .
Por exemplo, a entrada
AAA
ABB
AAA
é verdade porque a BB
seção pode ser deslizada para a direita, separando-a A
da:
AAA
A BB
AAA
No entanto, a entrada
AAAA
ABBA
ABAA
é falso porque não há como separar as partes A
e B
sem que elas se sobreponham.
O código mais curto em bytes vence. Se desejar, você pode usar dois caracteres ASCII imprimíveis no lugar de A
e B
.
Exemplos de verdade (separados por linhas vazias)
BBB
BAA
BBB
BA
A
B
AB
AB
AAA
BBB
AAAAB
ABBBB
ABBA
ABBA
AAAA
AAAAAABBBBBBBBB
AABBBBBBBBBBBBB
AAAAAAAAAABBBBB
AABBBBBBBBBBBBB
AAAAAAAAAAAAAAB
AAAAAAAAAAAA
ABABABABABAB
BBBBBBBBBBBB
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBABBBB
BBBBBBBB
BBBBBBBB
AAA
BAA
AAA
Exemplos de falsidade
BBBB
BAAB
BABB
BBBB
BAAB
AABB
BBBBBBB
BBBBBAB
AAAAAAB
BBBBBBB
BAAA
BABA
BBBA
AABA
AAAA
AAAAAAA
ABBBBBA
AAAAABA
BBBBBBA
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBAABBB
BBBBBBBB
BBBBBBBB
AAA
ABA
BBA
ABA
AAA
CJam,
3332201917 bytesVersão revisada, com suporte massivo do @ Sp3000 e do @ MartinBüttner:
Experimente online
Contribuições
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:
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:
é claro que impede que o quebra-cabeça se afaste porque o
A
trecho está travado entre osB
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:
A
eB
, o quebra-cabeça claramente não está intertravado. Nesse caso, todas asA
células são deixadas de todas asB
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:Agora, a especificação diz que as células
A
eB
são simplesmente conectadas em todos os quebra-cabeças válidos. Para fazer asA
células conectadas no quebra-cabeça parcial acima, temos duas opções:Nós contornamos um dos trechos de
B
, por exemplo: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:
As
A
células agora estão simplesmente conectadas e ainda não há linhas com mais de 2 trechos. No entanto, asB
células também precisam ser simplesmente conectadas. O caminho direto agora está bloqueado pelasA
células conectadas e a única maneira de conectar asB
células é fazer um loop em torno de um dos trechos deA
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
fonte
JavaScript (ES6),
108107989182 bytesDemonstração ao vivo . Testado no Firefox. Recebe a entrada como uma sequência delimitada por nova linha.
Edições:
\n
para uma nova linha literal.g
função e chamando RegExp diretamente na matriz em vez de usarfind
.Como funciona
Versão anterior:
a
e divida-a por novas linhas em uma matriz de cadeias.a
e armazene-oT
. Usemap
para iterar sobre cada elemento dea
, divida a sequência em uma matriz de caracteres e usemap
novamente para anexar oi
caractere na linha ài
linha th deT
. Como cada elemento deT
não é inicializado, ele acabará parecendo algo como"undefinedAAABBA"
, mas isso não importa.g
que corresponda ao padrão/AB+A|BA+B/
. Se corresponder, as peças serão bloqueadas na direção especificada, pois haverá um conjunto deB
s imprensado entre dois ou maisA
s ou vice-versa.g
de teste para testar todos os elementos do blocoa
e sua transposiçãoT
para uma correspondência usandofind
. Se os dois coincidirem, as peças serão bloqueadas nas duas direções; portanto, produza um valor falso, caso contrário, verdadeiro.fonte
Javascript (ES6), 118
Explicação:
fonte
JavaScript (ES6) 72
74Editar 2 bytes salvos thx @NotthatCharles
Tenho o entendimento intuitivo de que, se uma peça pode deslizar apenas uma fração do passo, ela é gratuita. Os casos de teste atuais confirmam isso.
Então eu verifico apenas um passo em cada direção.
Caracteres usados: 1 e 0
2 bytes a mais para usar quaisquer 2 caracteres imprimíveis como A e B
Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6 (compatível com o operador de propagação - IE Firefox)
fonte
s[p+o]=='0'
parece um pouco longo. Poderia ser substituído por1-s[p+o]
, ou pelo menoss[p+o]==0
?=='A'
pode ser substituído por<'B'
. O mesmo para=='B'
x+s[p+o]=='AB'
?Mathematica
10069 bytesCom enormes 31 bytes salvos, graças a @Martin Buttner,
Formata a entrada como uma matriz de caracteres; também faz uma transposição da matriz. Se a matriz ou sua transposição não tiver mais de 2 execuções por linha, o quebra-cabeça pode deslizar.
{a,a,b,b,b}
tem 2 séries de letras.{a,a,b,a,a}
tem 3 séries de letras.{a,a,b,a,a,a,b,b,b,b,b,b,b,b}
tem 4 séries de letras.fonte
Dyalog APL, 22 bytes
Experimente aqui. Essa é uma função que recebe uma matriz 2D de caracteres e retorna
1
para instâncias deslizantes e0
não instáveis. O algoritmo é semelhante à maioria das outras respostas: verifique a matriz e sua transposição para que nenhuma linha contenha mais de um par adjacente de letras diferentes. Para a matriz de entrada 4x3a função pode ser chamada como
o que resulta em
1
.Explicação
fonte
JavaScript (ES6), 94 bytes
Método alternativo do mesmo tamanho:
Isso retorna
1
para uma entrada0
verdadeira e para falsidade. Comecei a trabalhar nisso antes que outras respostas fossem postadas. Originalmente, também tentei usar as compreensões de matriz do ES7, mas isso acabou em cerca de 10 caracteres a mais que esse método.Experimente:
Sugestões são bem-vindas!
fonte