幅W x高さHのテキストグリッド上に、曲線の一部を表し、空のスペースを表し、他の文字は使用されていない、シンプルでオープンな 2次元曲線を描くことを検討してください。X
.
すべてのグリッドスペースには、8つの隣接するグリッドスペース(ムーア近傍)があります。境界線を超えるグリッドスペースは空と見なされます。
グリッドに曲線が含まれるのは、正確に1つある場合、X
または複数のX
場所がある場合です:
- 正確には2つ
X
のsには1つの隣接しかないX
。これらは曲線の終点です。 X
エンドポイント以外のすべては、正確に2X
秒に隣接しています。これらは曲線の大部分を形成します。
たとえば、W = 9およびH = 4のこのグリッドには曲線が含まれます。
....X.... .X.X.X.X. X..X..X.X .XX.....X
同様に、これらのグリッド(W = 4、H = 3)には曲線があります。
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
ただし、これらのグリッドには曲線が含まれていません。
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
X
sのすべての隣接ペア間の距離を合計することにより、曲線の長さを見つけることができます。
直交する2つ
X
のs 間の距離は1単位です。XX
X X
対角線上にある2つ
X
のs 間の距離は√2単位です。X. .X
.X X.
たとえば、グリッド内の曲線の長さ
XXX. ...X ..X.
として視覚化することができます
1 + 1 +√2+√2= 4.828427であることがわかります...
1つだけの曲線の長さX
はゼロです。
グリッドが曲線を形成しない場合、その長さは明確に定義されていません。
チャレンジ
X
sと.
sのテキストのグリッドが与えられた場合、それに含まれる曲線の長さを出力するか、グリッドに曲線がないことを示すために-1
またはなどの何かを出力Null
します。
入力のためには、以外の文字を使用することができますX
し、.
必要に応じて、必要に応じてHとWは、入力として取ることができます。文字列ではなく、1と0で埋められたネストされたリストまたは行列としての入力でも問題ありません。
曲線の長さ、または2つの整数AとBの浮動小数点を出力できますlength = A + B*√2
。
バイト単位の最短コードが優先されます。
テストケース
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.]
有効な曲線ではありませんか?