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
[x.x,...,.x.]
n'est pas une courbe valide, non?