Stellen Sie eine einfache , offene , zweidimensionale Kurve in einem breiten x hohen Textgitter dar, in dem ein XTeil 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, Xwobei:
- Genau zwei
Xs haben nur einen NachbarnX. Dies sind die Endpunkte der Kurve. - Jeder
Xneben den Endpunkten Nachbarn genau zweiXs. 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.....XEbenso 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 Xs summieren :
Der Abstand zweier orthogonal benachbarter
Xs beträgt 1 Einheit.XXX XDer Abstand zwischen zwei diagonal benachbarten
Xs 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 Xist Null.
Wenn ein Gitter keine Kurve bildet, ist seine Länge nicht genau definiert.
Herausforderung
Bei einem vorgegebenen Textraster aus Xs und .s geben Sie die Länge der Kurve aus, die es enthält, oder geben Sie etwas wie -1oder ausNull um anzuzeigen, dass das Raster keine Kurve enthält.
Für die Eingabe können Sie andere Zeichen als Xund 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?
