Écrivez un programme ou une fonction qui accepte une chaîne multiligne de 0
«et 1
». Aucun autre caractère ne sera dans la chaîne et la chaîne sera toujours rectangulaire (toutes les lignes auront le même nombre de caractères), avec des dimensions aussi petites que 1 × 1, mais sinon les 0
'et 1
' peuvent être arrangés arbitrairement.
Vous pouvez supposer que la chaîne a un retour à la ligne facultatif et si vous le souhaitez, vous pouvez utiliser deux caractères ASCII imprimables distincts à la place de 0
et 1
.
Affiche ou retourne une valeur vraie si toutes les régions connectées au chemin des deux 0
et 1
de la chaîne sont des rectangles pleins , sinon émettent une valeur fausse .
Un chemin région connectée de 0
« les moyens de qu'à partir de l' une quelconque 0
de la région, tous les autres 0
» s peut être atteint que par le déplacement de haut en bas, à gauche et à droite avec une autre 0
« s (et ne se déplaçant en diagonale, pas se déplacer l' une quelconque 1
, et ne se déplace pas en dehors des limites de la chaîne). La même idée s'applique aux 1
régions connectées au chemin.
Un rectangle plein de 0
«s» signifie que toute la zone du rectangle est remplie de 0
«et de non 1
». La même idée s'applique aux 1
rectangles pleins.
Le code le plus court en octets gagne. Tiebreaker est une réponse antérieure.
(Notez que la chaîne ne s'enroule pas avec des conditions aux limites toroïdales .)
Exemples
1) Cette chaîne d'entrée a 3 régions connectées au chemin (2 pour 0
et 1 pour 1
). 00
Cependant, seule la région inférieure droite est un rectangle plein, donc la sortie serait fausse.
0011
0111
0100
2) Cette chaîne d'entrée a 4 régions connectées au chemin (2 pour les deux 0
et 1
). Tous sont des rectangles pleins donc la sortie serait véridique.
0011
0011
1100
3) Cette entrée a 2 régions connectées à un chemin, mais une seule d'entre elles est un rectangle plein, donc la sortie serait fausse.
00000000
01111110
00000000
4) Cette entrée n'a qu'une seule région connectée par chemin et est trivialement un rectangle plein, donc la sortie est véridique.
11111111
11111111
11111111
Cas de test
Un T
juste en dessous de la chaîne d'entrée signifie véridique, F
signifie fausseté.
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
Rubis, 76
Dans toute grille composée entièrement de rectangles, chaque ligne doit être identique à la ligne précédente, ou avoir tous les bits inversés de 0 à 1 et vice versa.
C'est facile à prouver. Prenez un morceau de papier et tracez des lignes verticales et horizontales arbitraires tout le long. Maintenant coloriez les rectangles en utilisant seulement 2 couleurs. Vous vous retrouverez avec un damier déformé, où toutes les couleurs basculent à chaque ligne.
Vous voulez dessiner des rectangles avec des lignes à mi-chemin? essayez de supprimer un segment de l'une de vos lignes. Vous aurez maintenant besoin de plus de 2 couleurs pour colorer votre design, car vous aurez des points où 3 rectangles se rencontrent (2 coins et un bord.) De tels designs ne sont donc pas pertinents pour cette question.
Je suis surpris que les réponses jusqu'à présent ne l'aient pas remarqué.
Je pense que cet algorithme devrait être beaucoup plus court dans une autre langue.
Non testé dans le programme de test
la source
s.scan(/^?.*\n/)
aiderait à économiser des octets.Escargots , 20 octets
Imprime la zone de la grille s'il n'y a pas de carré 2x2 avec 3 zéros et un ou 3 uns et un zéro, ou
0
si un tel carré 2x2 existe.la source
MATL , 12 octets
Même algorithme que la grande réponse de @ sp3000 .
Pour autoriser la saisie multiligne, MATL a besoin que le tableau de caractères de la ligne (chaîne) soit explicitement construit à l'aide de caractère
10
pour la nouvelle ligne. Donc, l'entrée des quatre exemples est (notez que[]
c'est la concaténation, donc chacun d'eux est un tableau de caractères):et les trois derniers cas de test sont
La sortie véridique est un tableau n'en contenant que des uns.
Essayez-le en ligne!
Explication
Cela utilise le fait que la parité des caractères
'0'
et'1'
est la même que celle des nombres0
et1
, donc il n'est pas nécessaire de convertir de char au chiffre qu'il représente,la source
['first line' 10 'second llne']
, où10
est ASCII pour la nouvelle ligne. Est-ce acceptable?'0011 0111 0100'
JavaScript (ES6), 69 octets
Je crois que le critère du rectangle de connexité de chemin équivaut à exiger que, compte tenu des quatre points qui forment les coins d'un rectangle arbitraire, il existe un nombre pair de
1
s. Notez que la parité du rectangle (0, b), (x, y) est la même que (0, b), (a, y)^
(a, b), (x, y) donc je n'ai qu'à vérifier ces rectangles dont le coin supérieur gauche est à (0, 0). Aussi par les lois de De Morgan,!.some()
est la même que celle.every(!)
qui me fait gagner quelques octets.Edit: je remarque que la solution Jelly vérifie la parité des coins de tous les rectangles 2 × 2, qui peuvent être équivalents.
la source
JavaScript (ES6), 79
Même algorithme de réponse Jelly de @ Sp3000 (et heureux de ne pas avoir à prouver que cela fonctionne). Seulement 8 fois plus
Moins golfé
Suite de tests
la source
Grime v0.1, 31 octets
Imprime
1
pour correspondance et0
pour aucune correspondance. Essayez-le en ligne!Explication
Grime est mon langage de correspondance de motifs 2D. Je l'ai modifié aujourd'hui, mais uniquement pour changer le caractère d'un élément de syntaxe (
`
au lieu de,
), donc cela n'affecte pas mon score.J'utilise une approche similaire à celle de Sp3000 : une entrée est fausse si elle contient un rectangle 2 × N dont une ligne contient à la fois
0
et1
et l'autre pas.la source
JavaScript (ES6), 64 octets
Basé sur l'observation de @ LevelRiverSt que chaque ligne doit être identique ou opposée à la première.
la source