Contexte
J'ai un tas d'images anciennes et granuleuses en noir et blanc. Certains d'entre eux représentent des vignes grimpant sur un mur, d'autres non - votre tâche est de les classer pour moi.
Entrée et sortie
Votre entrée est un tableau 2D rectangulaire de bits A , donné dans n'importe quel format pratique. Il ne sera pas vide, mais il n'est pas garanti qu'il contienne à la fois des 0 et des 1. Le tableau représente une vigne si les conditions suivantes sont réunies:
- La rangée inférieure de A contient au moins un 1. Ce sont les racines de la vigne.
- Chaque 1 dans A est connecté à la rangée inférieure par un chemin de 1 qui ne va que vers la gauche, la droite et le bas (pas vers le haut et pas en diagonale). Ces chemins sont les sarments de la vigne.
Votre sortie est une valeur véridique cohérente si l'entrée représente une vigne, et une valeur de fausseté cohérente sinon.
Exemples
Ce tableau représente une vigne:
0 0 1 0 0 1
0 1 1 0 0 1
0 1 0 1 1 1
1 1 0 1 0 1
0 1 1 1 0 1
0 0 1 0 1 1
Cette entrée ne représente pas une vigne, car il y a un 1 au milieu de la bordure droite qui n'est pas connecté aux racines par une branche:
0 0 0 1 1 0
0 1 0 1 1 1
0 1 0 1 0 1
0 1 1 1 1 0
0 0 1 1 0 1
Le tableau tout-0 ne représente jamais une vigne, mais le tableau tout-1 le fait toujours.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
Entrées véridiques:
1
0
1
1
01
11
0000
0111
1100
1001
1111
1111
1111
1111
001001
011001
010111
110101
011101
001011
1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101
0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100
Entrées fausses:
0
1
0
10
01
000
000
000
011
110
000
111111
000000
101011
111001
010010
001000
000010
110001
001100
111111
110101
010011
111011
000110
010111
010101
011110
001101
11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111
Réponses:
Escargots ,
251917 octetsEssayez-le en ligne!
Explication
Snails est un langage de correspondance de motifs 2D inspiré de l'expression régulière, qui a été développé à l'origine pour notre défi de conception de langage de correspondance de motifs 2D .
Les
&
escargots font essayer le motif à partir de toutes les positions de départ possibles et s'impriment0
ou1
selon que le motif échoue dans l'un d'eux ou correspond à tous.Maintenant, les escargots peuvent fonctionner avec des parenthèses implicites, donc le modèle est un raccourci pour les éléments suivants:
Le
,
agit comme un*
dans regex (c'est-à-dire correspondre à zéro ou plusieurs fois), tandis que le+
est le même que dans regex (correspondre à une ou plusieurs fois). Nous commençons donc par faire correspondre\0z
aussi souvent que nécessaire, ce qui correspond à un seul0
, puis permet à l'escargot de réinitialiser arbitrairement sa direction avecz
. Cela permet des zéros dans l'entrée, à condition qu'une cellule de vigne valide puisse être trouvée ailleurs.Ensuite, nous correspondons à au moins un
\1dlr
, qui correspond à un seul1
, puis permet à l'escargot de réinitialiser sa direction vers le bas, la gauche ou la droite. Notez que si la cellule dans laquelle nous avons commencé contient un,1
nous ne faisons correspondre que cette partie. Il permet essentiellement à l'escargot de traverser une vigne d'une branche jusqu'aux racines.Enfin, nous devons nous assurer d'avoir atteint le sol en recherchant une cellule hors limites (
~
) sous (d
).la source
JavaScript (ES6), 135 octets
Remarque: En raison des limitations du type entier, ne fonctionne que pour les vignes jusqu'à 31 caractères de large. Explication: chaque ligne est AND au niveau du bit avec la ligne adjacente pour déterminer les points de connexion, puis la
g
fonction est utilisée pour développer récursivement la ligne horizontalement jusqu'à ce qu'elle ne puisse plus se développer. Par exemple, si deux lignes adjacentes le sont1110111
et que1011100
les points de connexion le sont1010100
et que cela est ensuite étendu à1110110
puis1110111
qui détecte alors que la ligne est connectée. Si lag
fonction échoue, elle renvoie zéro, ce qui entraîneg
également l'échec de toutes les fonctions suivantes , et le résultat est alors faux. Si lag
fonction réussit, elle renvoie la nouvelle ligne qui est ensuite propagée à travers lereduce
pour tester la ligne suivante.la source
Python 2, 254 octets
Pas de bibliothèques
Notez que les retraits de deuxième et troisième niveau sont formés avec des tabulations dans le nombre d'octets.
Essayez-le en ligne
la source
Wolfram - 254
Passez un peu de temps à faire ce travail, alors je vais le laisser ici:
Fondamentalement, je construis un graphique en grille avec des bords dirigés pointant vers le haut, supprime les sommets qui correspondent à 0, vérifie que les composants des sommets inférieurs contiennent tous les sommets. Ridicule, je sais ...
la source
Python + numpy
204202195 OctetsS'attend
A
à être un tableau numpy 2D.Prend la matrice, remplit les colonnes zéro à gauche et à droite et aplatit la matrice.
s
est un pochoir qui pointe vers l'élément gauche, droit et inférieur. La boucle vérifie chaque élément sauf la dernière ligne s'il l'est1
et au moins un de ses gabarits1
, renvoieFalse
sinon. Ensuite, vérifiez si la dernière ligne en contient1
.Deux tests pour vous:
Edit1:
1<0
est plus court queFalse
Edit2:
flat
est une bonne alternative àflatten()
et en utilisant des tabulateurs pour la deuxième intention dans la bouclela source