Stellen Sie eine einfache , offene , zweidimensionale Kurve in einem breiten x hohen Textgitter dar, in dem ein X
Teil der Kurve und ein .
leerer Raum dargestellt werden und keine anderen Zeichen verwendet werden.
Jeder Gitterplatz hat 8 benachbarte Gitterplätze, die Nachbarschaft Moore . Gitterbereiche außerhalb der Grenzen werden als leer betrachtet.
Ein Gitter enthält eine Kurve, wenn es genau ein X
ODER hat, wenn es mehr als ein hat, X
wobei:
- Genau zwei
X
s haben nur einen NachbarnX
. Dies sind die Endpunkte der Kurve. - Jeder
X
neben den Endpunkten Nachbarn genau zweiX
s. Diese bilden den Hauptteil der Kurve.
Zum Beispiel enthält dieses Raster mit W = 9 und H = 4 eine Kurve:
....X.... .X.X.X.X. X..X..X.X .XX.....X
Ebenso haben diese Gitter (W = 4, H = 3) Kurven:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
Diese Gitter enthalten jedoch keine Kurve:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Wir können die Länge einer Kurve ermitteln, indem wir die Abstände zwischen allen benachbarten Paaren von X
s summieren :
Der Abstand zweier orthogonal benachbarter
X
s beträgt 1 Einheit.XX
X X
Der Abstand zwischen zwei diagonal benachbarten
X
s beträgt √2 Einheiten.X. .X
.X X.
Zum Beispiel die Länge der Kurve im Raster
XXX. ...X ..X.
kann visualisiert werden als
wir können also sehen, dass es 1 + 1 + √2 + √2 = 4.828427 ist ...
Die Länge einer Kurve mit nur einer X
ist Null.
Wenn ein Gitter keine Kurve bildet, ist seine Länge nicht genau definiert.
Herausforderung
Bei einem vorgegebenen Textraster aus X
s und .
s geben Sie die Länge der Kurve aus, die es enthält, oder geben Sie etwas wie -1
oder ausNull
um anzuzeigen, dass das Raster keine Kurve enthält.
Für die Eingabe können Sie andere Zeichen als X
und verwenden .
, und H und W können bei Bedarf als Eingabe verwendet werden. Die Eingabe als verschachtelte Liste oder Matrix mit Einsen und Nullen anstelle einer Zeichenfolge ist ebenfalls in Ordnung.
Sie können einen Gleitkommawert für die Kurvenlänge oder alternativ zwei ganze Zahlen A und B ausgeben length = A + B*√2
.
Der kürzeste Code in Bytes gewinnt.
Testfälle
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.]
ist keine gültige Kurve, oder?