Dies ist die erste in einer Reihe von Island Golf Herausforderungen. Nächste Herausforderung
Wenn Sie eine Insel in ASCII-Kunst haben, geben Sie einen optimalen Pfad aus, um sie zu umrunden.
Eingang
Ihre Eingabe ist ein rechteckiges Raster aus zwei Zeichen, die Land und Wasser darstellen. In den folgenden Beispielen ist Land #
und Wasser .
, Sie können jedoch zwei beliebige Zeichen ersetzen.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Es wird immer mindestens ein Landplättchen geben. Die Landplättchen werden alle zusammenhängend sein (dh es gibt nur eine Insel). Die Wasserplättchen werden auch zusammenhängend sein (dh es gibt keine Seen). Der äußere Rand des Gitters besteht aus Wasserplättchen. Landplättchen werden nicht diagonal verbunden, dh Sie werden niemals so etwas sehen
....
.#..
..#.
....
Ausgabe
Ihr Code muss dasselbe Raster mit einer kürzesten Umrundung ausgeben . In den folgenden Beispielen wird der Umrundungspfad mit gezeichnet o
, Sie können jedoch jedes Zeichen ersetzen, sofern es sich von Ihren Land- und Wasserzeichen unterscheidet.
Eine Weltumsegelung ist eine einfache geschlossene Kurve, die vollständig auf Wasserplättchen gezeichnet ist und alle Landplättchen auf dem Gitter vollständig umgibt. Diagonale Verbindungen sind zulässig. Dies ist zum Beispiel eine Umrundung der obigen Insel (aber keine kürzeste):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
Die Länge einer Umrundung wird wie folgt berechnet: Addieren Sie für jedes Paar benachbarter Kacheln auf dem Pfad, wenn diese horizontal oder vertikal verbunden sind, 1; Wenn sie diagonal verbunden sind, fügen Sie √2 hinzu. Die Länge des obigen Pfades beträgt 22 + 7√2 (≈ 31.9).
Eine kürzeste Weltumsegelung ist eine Weltumsegelung mit möglichst kurzer Länge. Ihr Programm sollte einen Pfad ausgeben, der diese Bedingung erfüllt. Für die meisten Inseln gibt es mehrere mögliche Lösungen. Hier ist eine Lösung für die obige Insel mit einer Länge von 10 + 13√2 (≈ 28.4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
Einzelheiten
Ihre Lösung kann ein vollständiges Programm oder eine Funktion sein . Alle Standardeingabe- und -ausgabemethoden sind zulässig.
Ihre Eingabe und Ausgabe kann eine mehrzeilige Zeichenfolge oder eine Liste von Zeichenfolgen sein. Wenn Ihre Sprache einen Zeichentyp hat, der sich von Einzelzeichenfolgen unterscheidet, können Sie "Zeichenfolge" im vorherigen Satz durch "Zeichenliste" ersetzen. Wenn Ihre Sprache die Höhe und / oder Breite des Rasters eingeben muss, können Sie dies tun. Ihre Ausgabe kann (optional) eine einzelne nachgestellte Zeile enthalten. Wie oben erwähnt, können Sie drei verschiedene Zeichen anstelle von verwenden #.o
(bitte geben Sie in Ihrer Übermittlung an, welche Zeichen Sie verwenden).
Testfälle
A. Inseln mit einzigartigen kürzesten Umrundungen:
...
.#.
...
.o.
o#o
.o.
......
.####.
......
.oooo.
o####o
.oooo.
......
......
..##..
...#..
......
......
......
..oo..
.o##o.
..o#o.
...o..
......
.......
.#####.
...#...
...#...
.#####.
.......
.ooooo.
o#####o
o..#..o
o..#..o
o#####o
.ooooo.
.......
...#...
...#...
.#####.
...#...
...#...
.......
...o...
..o#o..
.o.#.o.
o#####o
.o.#.o.
..o#o..
...o...
.......
.#####.
.##..#.
..#..#.
.......
.ooooo.
o#####o
o##..#o
.o#..#o
..oooo.
B. Beispiel einer Insel mit mehreren möglichen Lösungen:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Mögliche Ausgaben:
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##.o..
..ooo...
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##.o..
..ooo...
Das ist Code-Golf : Der kürzeste Code in jeder Sprache gewinnt.
Antworten:
Mathematica (Version 9), 165 Bytes
Die nette, kurze
ConvexHullMesh
Funktion, die Greg Martin verwendete, wurde erst in Mathematica Version 10 eingeführt, und ich dachte, ich würde einen Versuch ohne sie mit meiner alten Mathematica Version 9 unternehmen. Ich habe es jedoch geschafft, sie etwas kürzer zu machen! Es ist eine Funktion , die nimmt und gibt eine Liste von Zeichenketten (mit.
,#
undo
wie die Symbole).Erläuterung:
Characters@# /. {"."->0, "#"->1}
schaltet die Eingabe in eine Matrix von0
s und1
s."o"MorphologicalTransform[MorphologicalComponents[#,Method->"ConvexHull"],Max[#(1-#[[2,2]])CrossMatrix@1]&]+"#"#
Dann nutzt Mathematica die leistungsstarken Bildverarbeitungsfunktionen (die jedoch extrem byteaufwändig sind…), um zuerst den konvexen Rumpf der Insel auszufüllen (die Form, die Sie erhalten würden, wenn Sie ein Stück Schnur darum spannen würden) und dann dessen Grenze zu erreichen. Wir multiplizieren diese Matrix dann mit der Zeichenfolge"o"
, um eine Matrix aus0
s und"o"
s zu erhalten (dank Mathematics beeindruckender Anpassungsfähigkeit in Bezug auf Typen), und addieren diese zu"#"
der Matrix der Insel.""<>#& /@ (... /. {0->"."})
macht diese Matrix"o"
s,"#"
S und0
S in eine Matrix von"o"
n,"#"
s und"."
s und verbindet jede Zeile in einen String.Wenn wir dies an Beispiel B testen , erhalten wir die Ausgabe
[Bearbeiten, danke an Greg Martin:] Wenn wir anstelle von Listen mit Strings Arrays von Zeichen verwenden dürfen, können wir dies auf 144 Bytes reduzieren:
quelle
MorphologicalComponents[#, Method->"ConvexHull"]
:) Sie können noch mehr Bytes sparen, indem Sie davon ausgehen, dass die Eingabe bereits in Zeichen aufgeteilt ist, und indem Sie auch ein 2D-Array von Zeichen zurückgeben.MorphologicalComponents
entweder bis heute!f[{"...",".#.","..."}]
einige Fehler zu bekommen.f
. (Genau genommen ist es das Zeug nach dem Semikolon.) Um die Funktion aufzurufen, geben Sie das Ganze in ein Mathematica-Fenster ein, gefolgt von[
Ihrer Eingabe, und]
so sollte es aussehenf@m_:=m(1-m[[2,2]]) . . . #/.{"."->0,"#"->1}]&[{"...", ".#.", "..."}]
(für Leerzeichen abgekürzt).(Aber stimme der Lösung von Notatree zu , es ist besser!)
Mathematica, 168 Bytes
Reine Funktion, die ein 2D-Array von Zeichen als Eingabe verwendet und ein 2D-Array von Zeichen zurückgibt. Eine leichter lesbare Version:
Linie 1 definiert eine Funktion
n
, die den (kleinsten) Abstand zwischen einem Punktx
in der Ebene und einer Mengey
anderer Punkte erzeugt. Zeile 2 initialisiert die Variablei
für die Eingabe, um eine auftretende Mehrdeutigkeit später aufzulösen und sie zu ändern, um die endgültige Ausgabe zu erhalten. Zeile 2 definiert auch eine Funktionp
, die die Koordinaten aller Vorkommen ihrer Eingabe in zurückgibti
.In Zeile 3 wird
p["#" | "."]
jede einzelne Koordinate aus der Eingabekarte dargestellt (da alle ihre Zeichen entweder"#"
oder sind"."
). Diest
ist auch eine Funktion, die nur die Koordinaten auswählt, die einer noch nicht festgelegten Eigenschaft entsprechen. In Zeile 4i~Part~## = "o"
wird eine Reihe von Einträgen füri
das Zeichen geändert"o"
. Diese Zeichen werden aus dem Satz möglicher Koordinaten gemäß den Angaben in den Zeilen 5-8 ausgewählt. Und Zeile 9 gibt die Antwort nur zurück, wenn sie berechnet wurde.Okay, Infrastruktur fertig, jetzt zur eigentlichen Berechnung.
ConvexHullMesh
ist in Mathematica integriert, um die konvexe Hülle einer Menge von Punkten zu berechnen (das kleinste konvexe Polygon, das diese Punkte enthält). Moralisch gesehen sollte dies die Buchten und Fjorde der Insel "ausfüllen"s = p@"#"
, um sie von unserer Weltumsegelung auszuschließen. Es gibt ein kleines Problem,ConvexHullMesh
wenn sich diese Punktmenge in einer Zeile befindet (danke, Testfall Nr. 2), das wir lösen, indem wirs
in Zeile 7 eine leicht versetzte Version von an sich selbst anhängen . Diese Ausgabe ist ein Polygon, also Zeilen 7 -9 (t[...~RegionMember~# &]
) erzeugt eine Liste der Punkte mit ganzzahligen Koordinaten in diesem Polygon. Schließlich berechnen die Linie 5 und das Ende der Linie 9 alle Punkte, die genau 1 (also nicht 0) von dieser Menge ganzzahliger Punkte entfernt sind. Diese Menge wird zum Umrundungspfad.Unten finden Sie die Ausgabe für den großen Testfall unter dem Link des OP. Beachten Sie oben links, dass die ungewöhnliche Wahl zwischen West und Südwest darauf hindeutet, dass eine unsichtbare Neigungslinie -2/3 zwischen zwei Halbinseln abgeschattet wird (wobei das Liniensegment Teil der Grenze der konvexen Hülle ist).
quelle
char
Typ hat, ist die Situation anders . In diesem Fallchar
könnte ein Array anstelle einer Zeichenfolge verwendet werden.Python 3, 779 Bytes (Einrücken mit Tabulatoren)
Das ist das ganze Programm. Es liest die Eingabe von stdin und druckt sie nach stdout. Stdin muss mit EOF enden. Beispiellauf mit der großen Eingabe: https://ideone.com/XIfYY0
Die Idee ist einfach: Sie berechnet kleinste achteckige Grenzen und zeichnet Zellen, die sich innerhalb aller berechneten Grenzen befinden und mindestens eine der Kanten schneiden.
quelle
sys.stdin
als Eingabe verwenden.input()
, immer mehrzeilig würde die Arbeit erledigen und weniger Bytes kostenR(0,x)
R(x)
P
und zu definierenf
.L(generator expression)
=>[generator expression]
;F
,r
UndB
erscheint nur einmal pro Person und damit inlined werden können verwendet werden.JavaScript (ES6),
369343 ByteErläuterung: Die Zeichenfolge ist in ein Zeichenarray aufgeteilt (mir ist nicht klar, ob die Eingabe eines Zeichenarrays zulässig ist). Das Array wird dann durchlaufen und die Positionen aller Landfelder werden lokalisiert. Die Begrenzungslinien durch die Gleichungen
x - y = o
,x = p
,x + y = q
,y = r
,y - x = t
,-x = u
,-x - y = v
,-y = w
sind so festgelegt , dass die maximal möglichen Parameter in dem alle über die Linie des Land liegt gewählt wird. Dies hat den Effekt, dass die Insel in einem Achteck eingeschlossen wird. Die Koordinaten der Ecken des Achtecks werden leicht aus den Parametern berechnet und die Zellen an seinem Rand werden ausgefüllt. Das Array wird dann wieder zu einer Zeichenfolge verbunden. Der Grund, warum ein Achteck ausreicht, ist folgender:Betrachten Sie eine Ecke des Achtecks. Irgendwann entlang der beiden Kanten wird der Pfad durch das Land begrenzt, da wir das Achteck so konstruiert haben, dass es das Land so genau wie möglich berührt. Wenn sich an der Ecke selbst kein Land befindet, kann der Pfad die rechts gezeigten alternativen Routen nehmen, aber das ist immer noch die gleiche Anzahl von orthogonalen und diagonalen Schritten, sodass der Abstand unverändert bleibt.
quelle
rest of arguments
Parameter....p
an verschiedenen Orten.) Die Destrukturierung ist etwas anderes (obwohl der Spread-Operator bei der Destrukturierung verwendet werden kann).Python 3.5,
224, 263, 234218 BytesWeitere 16 Bytes wurden entfernt, indem die verschachtelte Funktion entfernt und ein Einzeiler daraus gemacht wurde.
Ab 29 Bytes gespielt:
Die Eingabe ist eine einzelne Zeichenfolge mit '~' für Ozean, 'X' für Land und 'o' für die Grenze. (Mit 'X' wird ein Byte für '>' anstelle von '==' gespeichert.)
Weniger Golf Version mit Kommentaren:
quelle
C # 7 -
414369327 BytesEdit : auf 1D-Looping, Computing
i
undj
On-the-Fly umgestelltBearbeiten : Die Eingabemethode wurde geändert, die Nachschlagetabelle reduziert und zu genau definierten Anfangsgrenzen gewechselt ... und der sinnlose Raum in der letzten äußeren for-Schleife entfernt
Probieren Sie es online
Das Gesamtprogramm, nimmt die Eingabe zu Standard in, druckt er auf die Standardausgabe, Anwendungen
#
,.
undo
. Für jede Zelle wird ein 'Profil' berechnet (dies ist die Entfernung in 8 Richtungen (dies scheint aus praktischen Gründen eine Neunte zu sein, dies ist jedoch immer der Fall0
), und es wird jeweils ein Maximum von jeder dieser Zellen aufgezeichnet. Anschließend wird die gesamte Karte geschrieben Ersetzt jede Zelle, die sich an einer Grenze befindet und nicht außerhalb einer Zelle, durch ein 'o'. Der unten stehende kommentierte Code erklärt, wie alles funktioniert.Gemäß meiner Antwort auf Save the Geese from Extinction ergibt dies das kleinste Achteck (gültige Umrundung mit der größten Fläche), das die Insel begrenzt.
Hinweis : Ich verwende zum ersten Mal in meinem Leben etwas aus dem aktuellen Jahrzehnt, und für das Kompilieren dieses Codes ist C # 7 erforderlich. Wenn Sie nicht über C # 7 verfügen, muss eine Zeile ersetzt werden, die im Code deutlich gekennzeichnet ist.
Beispielverwendung und Ausgabe:
Formatierter und kommentierter Code:
quelle