Schreiben Sie ein Programm oder eine Funktion, die bei einer nicht leeren Folge von Rechts- oder Linkskurven die Länge des kürzesten selbstvermeidenden Pfades auf einem 2D-Gitter mit diesen Windungen ausgibt.
Die Eingabe sollte als String, wobei jedes Zeichen Befinden eingenommen werden R
oder L
jeweils für ein Rechts- oder Linksabbiegen.
Die Ausgabe sollte eine ganze Zahl sein, die Länge des kürzesten Pfades mit den gegebenen Windungen.
Dies ist ein Gode Golf - der kürzeste Code gewinnt.
Beispiel
Angesichts der Eingabe
LLLLLLLLLLRRL
Der kürzeste Weg ist der folgende (beginnend mit #
):
+-+-+-+-+-+-+
| |
+ . + +-+-+ +
| | | | |
+ +-+ + #-+ +
| | | |
+ +-+ +-+-+-+
| |
+-+-+ . . . .
Und die Gesamtlänge dieses Pfades ist 29
(Zählen der -
s und |
s, nicht der +
s).
Testfälle
L 2
RRRRRRRRRR 23
LRRLRLRRRRL 15
LLRRLRRRRLLL 17
LLRRRRRRLLLL 21
LLLLRLLRRLLRL 16
LRLRLRLLRLRRL 14
RLLRRRRLLRRLRL 17
RRRRLLRLLLRLRL 20
LLLLRRLRLRRRLRL 19
RRRLRRRLRRLRLRL 20
code-golf
path-finding
Pappkarton
quelle
quelle
Antworten:
Prolog, 284 Bytes
Dies ist eine ziemlich einfache Aussage des Algorithmus und ziemlich ineffizient (nicht alle Testfälle liefen in angemessener Zeit, obwohl die meisten dies taten). Es funktioniert durch Generieren aller möglichen Längen für die Ausgabe von 1 aufwärts (
n
); Erzeugen aller möglichen Sequenzen von links / vorwärts / rechts dieser Länge, die mit der Eingabe übereinstimmen (implementiert ine
; der neue Pfad wird aufgerufenX
); Suchen Sie dann nach dem ersten gültigen Pfad (c
derv
die Auswirkungen von Links- und Rechtskurven auf die x- und y-Deltas behandelt). Die Rücklauflänge ist die erste Ausgabe inL
. (+2 Strafe, wenn Sie verhindern möchten, dass die Funktion andere mögliche Ausgaben für die Länge zurückgibt, wenn Sie zurückverfolgen; es ist nie ganz klar, wie die eigenwilligen Funktionsrückgaben von Prolog gezählt werden sollten.)Hier gibt es nicht viel Golf-Tricks, aber es gibt einige.
n
wurde mit einem Constraint-Solver implementiert, da dadurch mehr Leerzeichen entfernt werden können, ohne den Parser zu verwirren. Dies kann die Verwendung von GNU Prolog erfordern, da Sie sich nicht sicher sind. (Ich konnte nicht das Gleiche tun,c
da es mit negativen Zahlen umgehen muss.) Die Implementierung vone
ist erheblich weniger effizient als nötig, da eine Liste auf mehrere Arten abgeglichen wird. Das effizienteree([],[]).
wäre sechs Bytes länger (es würde dasS=X;
Entfernen von Zeile 2 ermöglichen, aber das ist nur ein Gewinn von vier im Vergleich zu einem Verlust von zehn). Damit ich Koordinaten und Richtungen als Ganzes oder nur als TeilX/Y
abgleichen kann , stelle ich sie als (dh als nicht bewertete AST, die angepasst werden kann) dar, sodass ich die Infix-Notation verwenden kann.Prolog, 256 Bytes, zu ineffizient, um einfach getestet zu werden
Da dies Prolog ist, sind natürlich viele der Funktionen reversibel, z. B.
c
können sie verwendet werden, um alle Pfade vom Ursprung zu einem bestimmten Koordinatenpaar zu generieren. Darüber hinausc
erzeugt natürlich vom kürzesten zum längsten. Dies bedeutet, dass wir, anstatt explizit nach einer Mindestlänge zu fragen, einfach alle Pfadec
generieren können, die irgendwohin führen , und dann nach dem ersten suchen können, der mit der Eingabe übereinstimmt:Dies hat eine exponentielle Leistung (O (3 n ), wobei n die Ausgabe ist). Ich habe es jedoch geschafft, es bei einigen der kleineren Tests zu überprüfen (es dauert ungefähr 7 Sekunden, um 14 auszugeben, und ungefähr 20, um 15 auf meinem Computer auszugeben).
quelle
Pyth , 36 Bytes
Probieren Sie es online aus!
Dies ist ziemlich langsam, funktioniert aber und ist schnell genug für kurze Eingaben.
Das Programm stellt Richtungen als komplexe Einheiten (1, -1, i, -i) und Punkte als komplexe Zahlen dar. Zuerst konvertiere ich die Liste der Abbiegungen in eine Liste von Richtungen, generiere dann alle Listen von n Schritten, filtere nach denen mit mindestens einem Schritt zwischen jeder Abbiegung und konvertiere die Richtungen in eine Liste der besuchten Punkte und überprüfe, ob diese Liste vorhanden ist einzigartig. Ich inkrementiere n in einer Schleife, bis ich erfolgreich bin.
Zuordnung zu komplexen Zahlen:
Da
L
ASCII - Codepunkt 76 hat undR
ASCII - Codepunkt 82 hat, ordnet dieseL
zui
undR
zu-i
.Karte zu absoluten Richtungen:
Bilden Sie Listen mit n Schritten mit mindestens 1 Schritt zwischen den einzelnen Runden
Es sollte eine Bewegung mehr geben, als der Eingang dreht. Jede Bewegung verläuft in eine andere Richtung, daher sollte die Lauflängencodierung länger als die Eingabe sein.
Karte zu den besuchten Punkten:
Filter nach nicht sich selbst überschneidenden:
Finden Sie die erste,
T
wo dies erfolgreich ist :f
.quelle