Contexte
Un polyomino est appelé L-convexe , s'il est possible de se déplacer d'une tuile à n'importe quelle autre par un chemin en forme de L, c'est-à-dire un chemin qui va dans les directions cardinales et change de direction au plus une fois. Par exemple, le polyomino de 1
s dans la figure
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
n'est pas convexe en L, car les deux trajets en forme de L du bas à gauche 1
vers le haut à droite 1
contiennent 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
Cependant, le polyomino de 1
s dans cette figure est L-convexe:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
Contribution
Votre entrée est un tableau 2D de bits au format natif de votre langue, ou en tant que chaîne délimitée par des sauts de ligne si notre langue manque de tableaux. Il est garanti d'en contenir au moins un 1
.
Production
Votre sortie doit être une valeur véridique si l'ensemble de 1
s est un polyomino L-convexe, et une valeur fausse dans le cas contraire. Ces sorties doivent être cohérentes: vous devez sortir la même valeur véridique pour toutes les entrées L-convexes, et la même valeur fausse pour les autres. Notez qu'un ensemble déconnecté de 1
s (qui n'est pas un polyomino) entraîne une sortie fausse.
Règles et notation
Vous pouvez écrire soit un programme complet soit une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Cas de test
Ces cas de test devraient également fonctionner si vous faites pivoter ou réfléchissez les tableaux, ou si vous ajoutez des lignes de 0
s à n'importe quelle bordure.
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Réponses:
Escargots ,
4524Juste après avoir publié ma solution initiale, j'ai réalisé qu'il y avait une bien meilleure façon. Le programme original a parcouru le carré formé par les chemins entre deux
1
s, testant la présence d'un 0 dans chaque paire de côtés. Il devait également avoir un cas particulier pour les trajets en ligne droite. La nouvelle version commence par la téléportation de l'un1
à l'autre, et teste l'absence d'un chemin droit ou en L de1
retour au début.la source
Matlab, 182 octets
Idée: répéter pour chaque
1
élément de la matrice polyomino:1
zéro donné mais le reste.1
dans cette nouvelle matrice (répétez jusqu'à ce que plus rien ne change)1
comme voisins dans la direction x s'il y a1
comme voisins dans le polynôme1
dans cette nouvelle matrice (répétez jusqu'à ce que plus rien ne change)1
comme voisins dans la direction x s'il y a1
comme voisins dans le polynômeMaintenant,
1
dans la nouvelle matrice devrait couvrir tout1
dans la polynomio-matrice qui sont accessibles à partir du point de départ donné en allant d'abord dans la direction x puis dans la direction y. Maintenant, nous pouvons répéter le même processus, mais en allant d'abord dans la direction y puis dans la direction x. Maintenant, chaque1
matrice polyomino doit être atteinte en une seule fois ou les deux fois. Sinon, nous avons trouvé une position dans la matrice polynomio qui ne peut pas être atteinte à partir de toutes les autres positions par unL
chemin.Golfé:
Avec commentaires:
Script de cas de test:
la source
Javascript ES6, 290 octets
D'accord, il ne gagnera peut-être pas de prix pour sa brièveté, mais il utilise une nouvelle approche. Voir la version non golfée pour savoir comment cela fonctionne.
La preuve de cette méthode peut être trouvée dans: Automates cellulaires et systèmes complexes discrets .
Non golfé:
la source
Mathematica,
129127 octetsExplication:
Premièrement, s'il y a
0
entre deux1
s sur la même ligne ou colonne, le tableau n'est pas L-convexe, car nous ne pouvons pas connecter les deux1
s.Après avoir exclu ce cas, tous les deux
1
s sur la même ligne ou colonne peuvent être connectés par un chemin droit. Nous pouvons générer un graphique, dont les sommets sont les positions de1
s dans le tableau, et les bords sont des paires de1
s sur la même ligne ou colonne. Le tableau est alors L-convexe si et seulement si le diamètre du graphique est inférieur à 3.la source
JavaScript (ES6) 174
En regardant la grille de cellules vides ou remplies, pour toute paire de cellules remplies, je vérifie les chemins horizontaux vers l'autre colonne de cellules (il peut y avoir 1 si les cellules sont sur la même ligne, sinon ou 2) et les chemins verticaux vers le autre ligne de cellules (il peut aussi y en avoir 1 ou 2). Si je trouve une cellule vide dans les deux chemins verticaux ou les deux chemins horizontaux, il ne peut pas y avoir de chemin en L entre les cellules.
(J'ai eu du mal à mettre en place cette explication - j'espère avoir été clair)
Testez l'exécution de l'extrait ci-dessous dans n'importe quel navigateur compatible EcmaScript 6
la source