Envisagez de représenter une courbe simple , ouverte et bidimensionnelle sur une grille de texte large de large par haute de H où X
représente une partie de la courbe et .
représente un espace vide et aucun autre caractère n'est utilisé.
Chaque espace de grille a 8 espaces de grille voisins, son quartier Moore . Les espaces de grille au-delà des frontières sont considérés comme vides.
Une grille contient une courbe si elle en a exactement un X
OU si elle en a plusieurs X
où:
- Exactement deux
X
n'ont qu'un seul voisinX
. Ce sont les points finaux de la courbe. - En
X
plus des points d'extrémité, chaque voisin a exactement deuxX
s. Ceux-ci forment l'essentiel de la courbe.
Par exemple, cette grille où W = 9 et H = 4 contient une courbe:
....X.... .X.X.X.X. X..X..X.X .XX.....X
De même, ces grilles (W = 4, H = 3) ont des courbes:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
Ces grilles, cependant, ne contiennent pas de courbe:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Nous pouvons trouver la longueur d'une courbe en additionnant les distances entre toutes les paires voisines de X
s:
La distance entre deux
X
s orthogonalement voisins est de 1 unité.XX
X X
La distance entre deux
X
s diagonalement voisins est de √2 unités.X. .X
.X X.
Par exemple, la longueur de la courbe dans la grille
XXX. ...X ..X.
peut être visualisé comme
donc on peut voir que c'est 1 + 1 + √2 + √2 = 4.828427 ...
La longueur d'une courbe avec un seul X
est nulle.
Lorsqu'une grille ne forme pas de courbe, sa longueur n'est pas bien définie.
Défi
Étant donné une grille de texte de X
s et .
s, sortez la longueur de la courbe qu'il contient, ou bien sortez quelque chose comme -1
ou Null
pour indiquer que la grille n'a pas de courbe.
Pour la saisie, vous pouvez utiliser d'autres caractères que X
et .
si vous le souhaitez, et H et W peuvent être pris en entrée si nécessaire. L'entrée sous forme de liste imbriquée ou de matrice remplie de 1 et de 0 au lieu d'une chaîne convient également.
Vous pouvez sortir un flottant pour la longueur de la courbe ou alternativement deux entiers A et B où length = A + B*√2
.
Le code le plus court en octets gagne.
Cas de test
XXX.
...X
..X.
2 + 2*√2 = 4.828427...
....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...
....
....
..X.
0 + 0*√2 = 0
.X..
X..X
.XX.
1 + 3*√2 = 5.242640...
....
..X.
.X..
0 + 1*√2 = 1.414213...
....
XX..
....
1 + 0*√2 = 1
.X.X
X.X.
....
0 + 3*√2 = 4.242640...
....
....
....
....
-1
.XX.
X..X
.XX.
-1
...X
..XX
.X..
-1
....
.X.X
...X
-1
X.X.
.X..
X.X.
-1
la source
[x.x,...,.x.]
n'est pas une courbe valide, non?Réponses:
MATL ,
5251 octetsL'entrée est une matrice de zéros et de uns.
La sortie est
B
alorsA
. Les non courbes donnent un négatifA
.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Le calcul de la longueur de la courbe utilise deux convolutions 2D 1 : une avec le masque de Moore et une autre avec un masque contenant uniquement les voisins diagonaux. Les résultats sont deux matrices avec la même taille d'entrée, qui seront notées respectivement M et D. M donne le nombre total de voisins pour chaque point, tandis que D donne le nombre de voisins diagonaux.
Les résultats en M et D doivent être filtrés pour éliminer les points qui n'appartiennent pas à la courbe. De plus, ils doivent être divisés par 2, car "être voisin de" est une relation symétrique, donc chaque point de la courbe est compté deux fois.
Déterminer si la courbe est valide est plus lourd que ce à quoi je m'attendais. Pour ce faire, le code teste trois conditions:
2
? (Autrement dit, y a-t-il exactement deux points avec un seul voisin?)2
moins2
? (Avec la condition 1, cela teste si toutes les valeurs non nulles dans M sauf deux d'entre elles sont égales2
)La courbe est valide si les conditions 1 et 2 sont vraies, ou si la condition 3 l'est.
1 La convolution est la clé du succès .
la source
Python 3 ,
316315311 octetsJe pense que cela couvre tous les cas; au moins les cas de test fonctionnent.
De plus, il reste encore beaucoup à jouer, probablement au début où les cas de bord sont traités.
Essayez-le en ligne!
Comment ça fonctionne:
d,R,C
sont 1. une liste de listes avec 1 comme courbe et 0 comme arrière-plan, 2. nombre de lignes et de colonnesd
pour ne pas avoir à vous soucier du bord du tableau 2DMerci à @Helka Homba d'avoir signalé un cas manquant. Merci à @TuukkaX et @Trelzevir pour les conseils de golf.
la source
d=[[1,0,1],[0,1,0],[1,0,1]]
échouera ici (cas de test ajouté).s=sum
enregistre 4 octets.Mathematica,
153150 octetsPrend un tableau 2D, avec
0
s pour.
s et1
s pourX
s. SortiesNull
pour les non courbes.Mathematica a une fonction intégrée de 45 octets pour cela, mais il génère des nombres pour les non-courbes et 1 / sqrt (2) pour l'entrée
{{1}}
. La correction de ces coûts coûte 105 octets (pourrait-on jouer au golf?).la source