Défi
Étant donné une matrice binaire et une chaîne binaire, déterminez si cette chaîne binaire peut être trouvée en commençant à n'importe quel point de la matrice et en se déplaçant dans n'importe quelle direction à tout point suivant pour former la chaîne binaire. Autrement dit, la chaîne peut-elle être trouvée repliée à l'intérieur de la matrice?
La chaîne ne peut être pliée qu'à 90 degrés ou 180 degrés (connexions latérales; Manhattan Distance 1) et ne peut se chevaucher à aucun moment.
Exemple
Prenons l'exemple suivant:
Matrix:
010101
111011
011010
011011
Snake: 0111111100101
Ceci est un cas de test véridique. On peut voir le serpent replié dans la position suivante:
0-1 0 1 0 1
|
1 1 1-0 1 1
| | | |
0 1 1 0-1-0
| |
0 1-1 0 1 1
Règles
- Les échappatoires standard s'appliquent
- Vous pouvez prendre la longueur de la chaîne et la largeur et la hauteur de la matrice en entrée si vous le souhaitez
- Vous pouvez prendre la matrice binaire et la chaîne binaire comme une chaîne multiligne / un tableau de chaînes / une chaîne jointe à une nouvelle ligne / toute autre chaîne jointe à une autre et une chaîne
- Vous pouvez prendre les dimensions comme un tableau plat au lieu de plusieurs arguments
- Votre programme doit se terminer pour n'importe quelle matrice 5 x 5 avec une chaîne d'une longueur maximale de 10 en moins d'une minute
Limites
- La matrice n'est pas nécessairement carrée
- La chaîne sera non vide
- La chaîne peut avoir une longueur de 1
- La chaîne ne contiendra pas plus de carrés que disponible (c'est-à-dire,
len(string) <= width(matrix) * height(matrix)
Cas de test
Vérité
01010
10101
01010
10101
01010
0101010101010101010101010
01110
01100
10010
10110
01101
011111000110100
0
0
10
01
1010
100
010
001
100010001
Falsy
00000
00000
00000
00000
00000
1
10101
01010
10101
01010
10101
11
100
010
001
111
10001
01010
00100
01010
10001
1000100010001000101010100
code-golf
decision-problem
binary-matrix
HyperNeutrino
la source
la source
Réponses:
Python 2 ,
275271264249 octets-1
avecH
et en supprimant une opération de tranchage ([:]
).[:]
), utiliser l'affectation de cibles multiples pour donner à une entrée visitée une valeurv not in "01"
(S=S[1:];M[y][x]=H;
->S=M[y][x]=S[1:];
) et passer d'un ternaire if / else à un simple logique ou (any(...)if S else 1
->not S or any(...)
).ZeroDivisionError
) lorsque le serpent est trouvé et retourne une liste vide ([]
) lorsqu'il n'y a pas de serpent à trouver, qui sont deux comportements distincts.not S or
au golf àS<[1]or
~S==[]or
.Essayez-le en ligne!
Explication
Fonction lambda qui prend la matrice comme une liste bidimensionnelle de chaînes (soit
"0"
ou"1"
), le serpent comme une liste unidimensionnelle et les dimensions de la matrice comme deux entiers.La fonction lambda recherche dans la matrice des entrées qui correspondent au premier élément du serpent. Pour chaque correspondance trouvée, il appelle
H
avec une copie profonde de la matrice, pas de copie du serpent, les dimensions de la matrice et la position de la correspondance.Quand
H
est appelé, il supprimeS
la première entrée et définit l'entrée de matrice de la position donnée sur autre chose que"0", "1"
. SiS
'length est nul, il retourneTrue
; comme il s'appelle récursivement, le serpent a été trouvé quelque part dans la matrice.Si la
S
`` longueur n'est pas nulle, elle parcourt les quatre directions cardinales, teste si cette position est dans la matrice, compare l'élément de la matrice à cette position avec le premier élément deS
et - s'il correspond - s'appelle récursivement.H
Les valeurs de retour de sont dirigées vers le haut des cadres de pile, vérifiant toujours si au moins une fonction a trouvé un serpent possible.Sortie formatée
J'ai augmenté mon programme pour afficher également le chemin des glisseurs de serpent (s'il y en a un). Il utilise la même conception de sortie ASCII que la question. Lien TIO .
la source
m[:]for
~>m*1for
? Pourrait fonctionner.JavaScript (ES6),
138134Pas si différent de @ Neil's, mais quoi d'autre pourrait-il être?
Entrée: matrice sous forme de chaîne de plusieurs lignes, chaîne binaire, largeur (sans compter la nouvelle ligne)
NB: la logique de la fonction récursive
r
est quelque peu inversée pour économiser quelques octetsMoins golfé
Tester
la source
JavaScript (ES6), 149 octets
Prend la matrice comme une chaîne délimitée par des sauts de ligne, le serpent comme une chaîne et la largeur (comme un entier). Librement basé sur la réponse de @ JonathanFrech.
la source
Mathematica,
180156141 141153138136104 octetsExemple d'entrée
Explication
GridGraph@{##4}
est unGraph
objet pour une grille de sommets avec des sommets adjacents reliés par des arêtes, avec des dimensions{##4}
- c'est-à-dire,{#4,#5}
ou{width,height}
.x
(numérotés1
à1##4 = width*height
), tous les sommets de finy
et tous les cheminsp
de longueur au plus#3
dex
ày
.""<>Part[Join@@#,p]
extrait les caractères correspondants de la matrice et les place dans une chaîne.s
, en recherchant à tous les niveaux, car il s'agit d'une liste très multidimensionnelle que nous avons créée.Remarque: Le remplacement
#3
par{#3-1}
inFindPath
, afin que nous ne trouvions que des chemins exactement de la bonne longueur, est une énorme amélioration en termes de vitesse - mais coûte 4 octets de plus.-24 octets: prendre les dimensions des choses en entrée
-15 octets: utiliser
StringPart
etStringJoin
correctement+12 octets: correction du cas de longueur 1
-15 octets: ...
-2 octets: prendre la taille de la matrice en entrée sous forme de tableau
-32 octets: utiliser
Table
pour itérer sur le chemin nous permet d'éviter d'utiliserFunction
, et l'utilisationMemberQ[...,s,All]
nous permet simplement de coller la matrice sur la table lorsqu'il s'agit de serpents de longueur 1.la source
C # (.NET Core) ,
346341336302297 octetsEssayez-le en ligne!
5 octets enregistrés en jouant à l'
p
incrément5 octets économisés en prenant la longueur du serpent et en commençant par sa queue, et en supprimant un espace inutile
34 octets économisés en lisant correctement le défi et en voyant que je peux prendre en compte la hauteur et la largeur de la matrice
5 octets enregistrés, le cas de test d'un seul élément a échoué et le correctif a été bénéfique
Ungolfed
la source
if(...)return true;
->return ...;
.b[y,x]
doit être réinitialisé à un moment donné. (Aussi désolé d'avoir mal orthographié votre nom dans ma réponse.)if(N(x,y,0)>0)return 0<1;
; la première apparition dereturn
.Kotlin , 413 octets
Embellie
Tester
la source