Considere a possibilidade de representar uma curva bidimensional simples , aberta , em uma grade de texto com largura W de largura por H, onde X
representa 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 X
que:
- Exatamente dois
X
s têm apenas um vizinhoX
. Estes são os pontos finais da curva. - Cada
X
além dos endpoints vizinhos exatamente doisX
s. 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.....X
Da 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 X
s:
A distância entre dois
X
s ortogonais vizinhos é de 1 unidade.XX
X X
A distância entre dois
X
s 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 X
s e .
s, imprima o comprimento da curva que ela contém, ou imprima algo como -1
ou Null
para indicar que a grade não tem curva.
Para entrada, você pode usar outros caracteres além de X
e .
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?