Considere a possibilidade de representar uma curva bidimensional simples , aberta , em uma grade de texto com largura W de largura por H, onde Xrepresenta parte da curva e .representa o espaço vazio e nenhum outro caractere é usado.
Todo espaço de grade possui 8 espaços de grade vizinhos, seu bairro Moore . Espaços de grade além das bordas são considerados vazios.
Uma grade contém uma curva se tiver exatamente um X OU se tiver mais de um em Xque:
- Exatamente dois
Xs têm apenas um vizinhoX. Estes são os pontos finais da curva. - Cada
Xalém dos endpoints vizinhos exatamente doisXs. Estes formam a maior parte da curva.
Por exemplo, esta grade em que W = 9 e H = 4 contém uma curva:
....X.... .X.X.X.X. X..X..X.X .XX.....XDa mesma forma, essas grades (W = 4, H = 3) têm curvas:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....Essas grades, no entanto, não contêm uma curva:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Podemos encontrar o comprimento de uma curva somando as distâncias entre todos os pares vizinhos de Xs:
A distância entre dois
Xs ortogonais vizinhos é de 1 unidade.XXX XA distância entre dois
Xs diagonalmente vizinhos é √2 unidades.X. .X.X X.
Por exemplo, o comprimento da curva na grade
XXX. ...X ..X.pode ser visualizado como
então podemos ver que é 1 + 1 + √2 + √2 = 4.828427 ...
O comprimento de uma curva com apenas uma Xé zero.
Quando uma grade não forma uma curva, seu comprimento não está bem definido.
Desafio
Dada uma grade de texto de Xs e .s, imprima o comprimento da curva que ela contém, ou imprima algo como -1ou Nullpara indicar que a grade não tem curva.
Para entrada, você pode usar outros caracteres além de Xe .se desejar, e H e W podem ser considerados como entrada, se necessário. A entrada como uma lista ou matriz aninhada preenchida com 1s e 0s em vez de uma sequência também é boa.
Você pode emitir uma flutuação para o comprimento da curva ou, alternativamente, dois números inteiros A e B, onde length = A + B*√2.
O código mais curto em bytes vence.
Casos de teste
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ão é uma curva válida, certo?
