Envisagez de représenter une courbe simple , ouverte et bidimensionnelle sur une grille de texte large de large par haute de H où Xrepré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 Xoù:
- Exactement deux
Xn'ont qu'un seul voisinX. Ce sont les points finaux de la courbe. - En
Xplus des points d'extrémité, chaque voisin a exactement deuxXs. 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.....XDe 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 Xs:
La distance entre deux
Xs orthogonalement voisins est de 1 unité.XXX XLa distance entre deux
Xs 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 Xest 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 Xs et .s, sortez la longueur de la courbe qu'il contient, ou bien sortez quelque chose comme -1ou Nullpour indiquer que la grille n'a pas de courbe.
Pour la saisie, vous pouvez utiliser d'autres caractères que Xet .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?
