Ecrivez un programme ou une fonction qui prend une grille de texte rectangulaire dans laquelle chaque cellule est un A
ou B
. Toutes les A
cellules formeront une forme simplement connectée , c'est-à-dire qu'elles seront toutes orthogonalement connectées sans trous (les lettres voisines en diagonale ne comptent pas comme connectées). De même, toutes les B
cellules formeront une autre forme simplement connectée. La grille contiendra toujours au moins un A
et au moins un B
.
Imaginez que la grille est en réalité constituée de deux morceaux de plastique mince en forme de bloc, représentés par les parties A
et B
. S'il était placé à plat sur une table, les deux pièces pourraient-elles être écartées tout en les maintenant complètement à plat sur la table?
Imprimer ou renvoyer une valeur de vérité si les deux A
etB
formes formes peuvent être séparées comme ceci en les séparant simplement. Sinon, imprimez ou renvoyez une valeur de fausseté .
Par exemple, l'entrée
AAA
ABB
AAA
est vrai parce que la BB
section peut être glissée vers la droite, en la séparant de celle de A
:
AAA
A BB
AAA
Cependant, l'entrée
AAAA
ABBA
ABAA
est faux car il n’ya aucun moyen de faire glisser les parties A
et B
sans les faire se chevaucher.
Le code le plus court en octets gagne. Si vous le souhaitez, vous pouvez utiliser deux caractères ASCII imprimables à la place de A
et B
.
Exemples de vérité (séparés par des lignes vides)
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
Exemples de fausseté
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 octetsVersion révisée, avec le support massif de @ Sp3000 et @ MartinBüttner:
Essayez-le en ligne
Contributions
Algorithme et Preuve
Ce qui suit explique les critères pour le puzzle se séparant horizontalement. Le cas vertical peut être déterminé en regardant les colonnes au lieu de lignes, ou en transposant la matrice de caractères et en regardant à nouveau les lignes.
Je vais utiliser le terme "stretch" pour une séquence maximale des mêmes lettres. Par exemple, les lignes suivantes ont respectivement 1, 2 et 3 tronçons:
Je vais aussi utiliser le terme "imbriqué" pour une ligne / puzzle qui ne peut pas se séparer.
L'observation clé est que le puzzle peut se séparer si et seulement si toutes les lignes ont au plus 2 étendues . Ou inversé, il est imbriqué si et seulement s'il y a une ligne avec plus de 2 tronçons .
Ce qui suit n’est peut-être pas considéré comme une preuve mathématique stricte, mais j’estime que cela fournit une explication convaincante de la nécessité de cela.
Il est facile de voir que le puzzle est imbriqué s’il a des rangées de plus de 2 tronçons. En regardant une rangée avec 3 étendues:
il est clair que cela empêche le puzzle de se séparer car l'
A
étirement est bloqué entre lesB
étirements. Cela signifie que la ligne est imbriquée, ce qui rend le puzzle entier imbriqué.Le sens opposé de la preuve n’est pas aussi évident. Nous devons montrer qu’il n’existe pas de casse-tête entremêlés dans lesquels toutes les lignes ne comportent qu’un ou deux tronçons. À partir de quelques observations:
A
etB
, le puzzle n'est clairement pas emboîté. Dans ce cas, toutes lesA
cellules sont laissées de toutes lesB
cellules, ou inversement, et il n'y a pas de collision lors du glissement des deux pièces.Le seul cas délicat serait des énigmes où nous avons des rangées avec 2 tronçons d’ordre différent. Je vais montrer que de tels casse - tête n'existent pas dans les spécifications données. Pour montrer cela, regardons un puzzle partiel qui a cette configuration, où
.
sont des caractères génériques:Maintenant, la spécification indique que les cellules
A
etB
sont simplement connectées dans tous les casse-têtes valides. Pour rendre lesA
cellules connectées dans le puzzle partiel ci-dessus, nous avons deux options:Nous passons en boucle sur l’un des tronçons de
B
, par exemple:Pour ce faire, nous étendons inévitablement l’une des rangées afin d’avoir 3 étendues. Cela ne nous donnera donc jamais un puzzle valide dans lequel toutes les lignes ont au plus 2 étendues.
Nous les connectons sur un chemin direct:
Les
A
cellules sont maintenant simplement connectées et il n'y a toujours pas de lignes de plus de 2 étendues. Cependant, lesB
cellules doivent également être simplement connectées. Le chemin direct est maintenant bloqué par lesA
cellules connectées et le seul moyen de connecter lesB
cellules consiste à effectuer une boucle autour de l'un des segments deA
cellules. Cela nous ramène au cas 1, où nous ne pouvons pas faire cela sans créer des rangées de 3 étendues.Pour compter les tronçons, l'implémentation utilise l'opérateur CJam RLE.
Explication du code
la source
JavaScript (ES6),
108107989182 octetsDémo en direct . Testé dans Firefox. Prend l'entrée en tant que chaîne délimitée par une ligne.
Modifications:
\n
pour un saut de ligne littéral.g
fonction et en appelant RegExp directement sur tableau au lieu d'utiliserfind
.Comment ça marche
La version précédente:
a
et scindez-la par des lignes nouvelles en un tableau de chaînes.a
et stocker dansT
. Utilisez cettemap
option pour parcourir chaque élément dea
, diviser la chaîne en un tableau de caractères et utiliser àmap
nouveau pour ajouter lei
e caractère de la ligne à lai
e ligne deT
. Étant donné que chaque élément deT
n'est pas initialisé, il ressemblera à quelque chose"undefinedAAABBA"
, mais cela n'aura pas d'importance.g
qui correspond au modèle/AB+A|BA+B/
. Si cela correspond, les pièces sont verrouillées dans la direction indiquée, car un ensemble deB
s est alors pris en sandwich entre deux ou plus,A
ou inversement.g
de test pour tester tous les éléments du bloca
et sa transpositionT
pour une correspondance à l'aide defind
. Si les deux correspondent, alors les pièces sont verrouillées dans les deux directions, donc une valeur de fausseté, sinon une valeur de vérité.la source
Javascript (ES6), 118
Explication:
la source
JavaScript (ES6) 72
74Éditez 2 octets enregistrés thx @NotthatCharles
J'ai la compréhension intuitive que si un morceau peut glisser seulement une fraction de pas, alors c'est gratuit. Les cas de test actuels le confirment.
Je vérifie donc juste un pas dans chaque direction.
Caractères utilisés: 1 et 0
2 octets en plus pour utiliser 2 caractères imprimables comme A et B
Testez l'exécution de l'extrait de code ci-dessous dans un navigateur compatible EcmaScript 6 (prenant en charge l'opérateur de diffusion - IE Firefox)
la source
s[p+o]=='0'
semble un peu long. Pourrait-il être remplacé par1-s[p+o]
, ou du moinss[p+o]==0
?=='A'
peut être remplacé par<'B'
. Pareil pour=='B'
x+s[p+o]=='AB'
?Mathematica
10069 octetsAvec une sauvegarde massive de 31 octets, grâce à @Martin Buttner,
Met en forme l'entrée sous forme de matrice de caractères; il fait également une transposition de la matrice. Si la matrice ou sa transposition ne comporte pas plus de 2 analyses par ligne, le puzzle peut alors glisser.
{a,a,b,b,b}
a 2 séries de lettres.{a,a,b,a,a}
a 3 courses de lettres.{a,a,b,a,a,a,b,b,b,b,b,b,b,b}
a 4 séries de lettres.la source
Dyalog APL, 22 octets
Essayez ici. C'est une fonction qui prend un tableau 2D de caractères, et retourne
1
pour les occurrences glissantes et0
pour les non glissantes. L'algorithme est similaire à la plupart des autres réponses: vérifiez la matrice et sa transposition pour qu'aucune ligne ne contienne plus d'une paire adjacente de lettres différentes. Pour la matrice de saisie 4x3la fonction peut être appelée en tant que
qui se traduit par
1
.Explication
la source
JavaScript (ES6), 94 octets
Méthode alternative de même taille:
This returns
1
for a truthy input and0
for falsy. I started work on this before any other answers had been posted. I also originally tried using ES7's array comprehensions, but that ended up about 10 chars longer than this method.Try it out:
Suggestions welcome!
la source