Considere la posibilidad de representar una curva bidimensional simple , abierta en una cuadrícula de texto de ancho W por alto H donde Xrepresenta parte de la curva y .representa el espacio vacío y no se utilizan otros caracteres.
Cada espacio de cuadrícula tiene 8 espacios de cuadrícula vecinos, su vecindario Moore . Los espacios de cuadrícula más allá de los bordes se consideran vacíos.
Una cuadrícula contiene una curva si tiene exactamente una X O si tiene más de una Xdonde:
- Exactamente dos
Xs tienen solo un vecinoX. Estos son los puntos finales de la curva. - Todos,
Xademás de los puntos finales vecinos, exactamente dosXs. Estos forman la mayor parte de la curva.
Por ejemplo, esta cuadrícula donde W = 9 y H = 4 contiene una curva:
....X.... .X.X.X.X. X..X..X.X .XX.....XDel mismo modo, estas cuadrículas (W = 4, H = 3) tienen curvas:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....Sin embargo, estas cuadrículas no contienen una curva:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Podemos encontrar la longitud de una curva sumando las distancias entre todos los pares vecinos de Xs:
La distancia entre dos
Xs adyacentes ortogonalmente es 1 unidad.XXX XLa distancia entre dos
Xs adyacentes en diagonal es √2 unidades.X. .X.X X.
Por ejemplo, la longitud de la curva en la cuadrícula
XXX. ...X ..X.se puede visualizar como
entonces podemos ver que es 1 + 1 + √2 + √2 = 4.828427 ...
La longitud de una curva con solo uno Xes cero.
Cuando una cuadrícula no forma una curva, su longitud no está bien definida.
Desafío
Dada una cuadrícula de texto de Xsys ., muestre la longitud de la curva que contiene, o bien, muestre algo como -1o Nullpara indicar que la cuadrícula no tiene curva.
Para la entrada, puede usar otros caracteres que Xy .si lo desea, y H y W pueden tomarse como entrada si es necesario. La entrada como una lista anidada o matriz llena de 1s y 0s en lugar de una cadena también está bien.
Puede generar un flotante para la longitud de la curva o, alternativamente, dos enteros A y B donde length = A + B*√2.
El código más corto en bytes gana.
Casos de prueba
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.]No es una curva válida, ¿verdad?
