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
quelle
[x.x,...,.x.]
ist keine gültige Kurve, oder?Antworten:
MATL ,
5251 BytesDie Eingabe ist eine Matrix aus Nullen und Einsen.
Ausgabe ist
B
dannA
. Nichtkurven ergeben ein NegativA
.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Bei der Berechnung der Länge der Kurve werden zwei 2D-Faltungen 1 verwendet : eine mit der Moore-Maske und eine mit einer Maske, die nur die diagonalen Nachbarn enthält. Das Ergebnis sind zwei Matrizen mit der gleichen Größe der Eingabe, die als M bzw. D bezeichnet werden. M gibt die Gesamtzahl der Nachbarn für jeden Punkt an, während D die Anzahl der diagonalen Nachbarn angibt.
Die Ergebnisse in M und D müssen gefiltert werden, um Punkte zu verwerfen, die nicht zur Kurve gehören. Außerdem müssen sie durch 2 geteilt werden, da "Nachbar sein von" eine symmetrische Beziehung ist, sodass jeder Punkt in der Kurve zweimal gezählt wird.
Das Ermitteln, ob die Kurve gültig ist, ist umständlicher als erwartet. Zu diesem Zweck testet der Code drei Bedingungen:
2
? (Das heißt, gibt es genau zwei Punkte mit einem einzigen Nachbarn?)2
minus2
? (Zusammen mit Bedingung 1 wird geprüft, ob alle Nicht-Null-Werte in M außer zwei von ihnen gleich sind.2
)Die Kurve ist gültig, wenn die Bedingungen 1 und 2 erfüllt sind oder Bedingung 3 erfüllt ist.
1 Faltung ist der Schlüssel zum Erfolg .
quelle
Python 3 ,
316315311 BytesIch denke, das deckt alle Fälle ab; Zumindest funktionieren die Testfälle .
Auch gibt es sicher noch viel zu golfen, wahrscheinlich am Anfang, wo die Edge Cases bearbeitet werden.
Probieren Sie es online!
Wie es funktioniert:
d,R,C
sind 1. eine Liste von Listen mit 1 als Kurve und 0 als Hintergrund, 2. Zeilen- und Spaltenanzahld
damit wir uns nicht um den Rand des 2d-Arrays kümmern müssenVielen Dank an @Helka Homba für den Hinweis auf einen fehlenden Fall. Vielen Dank an @TuukkaX und @Trelzevir für die Golftipps.
quelle
d=[[1,0,1],[0,1,0],[1,0,1]]
als würde dies fehlschlagen (Testfall hinzugefügt).s=sum
Spart 4 Bytes.Mathematica,
153150 BytesNimmt ein 2D-Array mit
0
s für.
s und1
s fürX
s. AusgängeNull
für Nichtkurven.In Mathematica sind 45 Byte integriert, es werden jedoch einige Zahlen für Nichtkurven und 1 / sqrt (2) für die Eingabe ausgegeben
{{1}}
. Das Korrigieren dieser Kosten kostet 105 Bytes (könnte Golf gespielt werden?).quelle