Haftungsausschluss: Die Geschichte, die in dieser Frage erzählt wird, ist vollständig fiktiv und wurde ausschließlich zum Zweck der Bereitstellung eines Intro erfunden.
Mein Chef hat einen neuen Spielzeugroboter bekommen und möchte, dass ich ihn programmiere. Er möchte in der Lage sein, einfache Pfeilanweisungen einzugeben, um es zum Bewegen zu bringen. Diese Anweisungen lauten: ^ (vorwärts bewegen) <(links abbiegen) und> (rechts abbiegen). Jetzt, da ich den Roboter programmiert habe, möchte er zusätzliche Funktionen. Er möchte, dass ich jede Folge von Pfeilen, die er eingibt, transformiere, damit der Roboter den angezeigten Pfad nicht nimmt, sondern sich an den gewünschten Ort bewegt, der durch den Ort angegeben wird, an dem er enden würde, wenn er den eingegebenen Pfad genommen hätte, so effizient wie möglich. Ich appelliere an Sie, die Mitglieder von PP & CG, mir bei dieser Aufgabe zu helfen.
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, um eine Zeichenfolge aus Pfeilen in eine Zeichenfolge umzuwandeln, die so schnell wie möglich an die von der Eingabe angegebene Position gelangt. Das Drehen dauert genauso lange wie das Vor- oder Zurückbewegen.
Eingang:
Eine Reihe von Pfeilen, wie oben angegeben. Wenn Sie möchten, können die Pfeile durch andere Zeichen ersetzt werden. Achten Sie jedoch darauf, dass Sie dies in Ihre Antwort einbeziehen. In allen Testfällen werden die Pfeile normalerweise verwendet.
Ausgabe:
Eine Reihe von Pfeilen (oder Ihren entsprechenden Zeichen), die den Roboter so effizient wie möglich zum gewünschten Ziel bringen.
Testfälle:
Beachten Sie, dass die angebotenen Lösungen nur Möglichkeiten sind und dass andere Lösungen möglicherweise gültig sind.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Wertung:
Der Arbeitsspeicher des Roboters ist begrenzt, daher muss Ihr Programm die niedrigstmögliche Bytezahl haben.
quelle
^<^^<^^<^^^^
->>^^>^
?Antworten:
Retina ,
1037471 BytesProbieren Sie es online! Link enthält Testfälle. Erläuterung:
Biegen Sie links in dreifache Rechtskurven ab.
Reduzieren Sie alle Umdrehungen modulo 4.
Bewegungen in entgegengesetzte Richtungen aufheben.
Dreimal rechts in links abbiegen. Dies behandelt auch den Fall, der werden
>>^>^
muss<^<^
.Löschen Sie unnötige Schleppkurven.
quelle
Mathematica, 135 Bytes
Nimmt eine
List
der Zeichenfolgen als Eingabe.Erläuterung
Auf
j
0 undi
auf 1 setzen.Für jedes eingegebene Zeichen ...
Wenn das Zeichen ist
>
, multiplizieren Siei
mit der imaginären Einheit. Wenn das Zeichen ist>
, dividieren Siei
durch die imaginäre Einheit. Wenn das Zeichen^
, fügen Siei
zuj
.Nehmen Sie die realen und imaginären Teile von
j
. Dies gibt die kartesische Koordinate des Roboters an.Wenden Sie auf dieses Ergebnis Folgendes an:
Eingestellt
a
auf eine Funktion , die eine Zeichenfolge mit erzeugt(input)
oder0
Zeichen^
s, je nachdem , was größer ist.Ein
List
bestehend aus ...a
angewendet auf den ersten Eingang (Realteil vonj
)Wenn der zweite Eingang (imaginärer Teil
j
) größer ist als0
,>
. Ansonsten<
. Aufs
das resultierende Zeichen setzen.a
wird auf den absoluten Wert der zweiten Eingabe angewendet.Wenn der erste Eingang kleiner als 0,
s
. Ansonsten leere Zeichenfolge.Anwenden
a
auf die Eingabe mal negativ.Verbinde die Saiten.
quelle
Mathematica 119 Bytes
JungHwans endgültige Position zum Pfadcode war kürzer als meine. Ich denke, es gibt wahrscheinlich einen noch kürzeren Weg, dies zu tun ...
Ich benutze die eingebaute
AnglePath
Funktion, um die endgültige Position zu bestimmen. Ich definiere auch die Symbole L, F und R für "<", "^" und ">", um ein paar Anführungszeichen zu speichern.Verwendung:
Ausgabe:
quelle
Ruby , 130 Bytes
Wie es funktioniert
Probieren Sie es online!
quelle
J, 90 Bytes
Lösung
Erläuterung
Es gibt einen tollen Trick mit komplexen Zahlen (Multiplizieren mit i bedeutet eine Drehung um 90 Grad nach links und -i ergibt eine Drehung nach rechts).
Also nehmen wir unsere Eingabe als komplexe Zahlen: Eine 1 steht für "Schritt vorwärts" und i / -i für Links- und Rechtskurven.
Die endgültige Position wird mit dieser Darstellung mühelos berechnet. Beachten Sie, dass dies der erste (am weitesten rechts stehende) Teil meines obigen endgültigen Ausdrucks ist:
Diese kurze Zeile oben löst das Problem. Alles andere überlegt nur, wie die Antwort formatiert werden soll, und könnte mit Sicherheit deutlich besser abschneiden.
Um die kurze Zeile oben zu verstehen, beachten Sie, dass
*/\
(der Scan der Teilprodukte) Ihnen eine Liste der Positionen gibt, denen Sie bei jedem Index in der Eingabe gegenüberstehen: i ist Nord, 1 und -1 sind Ost und West, und -i ist Süd . Aber da wir beginnen, nach Norden zu blicken, müssen wir alle mit i multiplizieren, was in J dargestellt wird durchj.
(kauen Sie einen Moment auf diesen Satz).Wir "bewegen" uns nur, wenn die ursprüngliche Eingabe 1 ist, und multiplizieren das Ergebnis dann elementweise mit dem booleschen Array 1, wobei die ursprüngliche Eingabe 1 und 0 ist
=&1*
. Das Ergebnis dieser Multiplikation ist eine Anordnung von "Richtungsschritten". Unsere endgültige Position ist einfach die Summe dieser Schritte:+/
testen
Leider funktioniert dies in TIO aus irgendeinem Grund nicht, aber wenn Sie Folgendes in die J-Konsole einfügen, wird überprüft, ob es funktioniert:
quelle
C # (.NET Core) , 349 Byte
Probieren Sie es online!
Nimmt einen String als Eingabe und gibt den kürzesten Pfad aus, den die Eingabe nehmen würde.
Ungolfed & Kommentiert
quelle
JavaScript (Node.js) , 187 Byte
Probieren Sie es online!
Golf Version mit Leerzeichen
-14 Bytes von @Neil
Ungolfed:
quelle
t&3
anstelle von,t%4
weil das mit Negativ funktioniert,t
damit Sie das4+
und das()
s entfernen können .(x?"":t)+t
kann(x?t:t+t)
für eine 1-Byte-Einsparung geschrieben werden. Der Richtungscode sieht viel zu lang aus. Auch ich denke du solltest wohlindexOf
undMath.abs
durch Vergleiche ersetzen .indexOf
durch einen Vergleich eingehen?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 BytesBearbeiten Sie 1: -5 Bytes, indem Sie zulassen, dass die Richtung außerhalb des Bereichs 0-3 liegt, und Leerzeichen entfernen.
Bearbeiten Sie 2: -4 Bytes, indem Sie die Eingabe in (1, 2, 3) anstatt in (<, ^,>) ändern, da dies vom OP zugelassen wurde. Ändern Sie auch mein Koordinatensystem, um die Entfernungsberechnung zu reduzieren.
Probieren Sie es online!
Ermittelt die endgültigen Koordinaten anhand der auszuführenden Wörterbuchwerte und gibt dann nur den direkten Pfad zum Endziel aus.
quelle
Perl 5 , 185 + 1 (-p) = 186 Bytes
Probieren Sie es online!
quelle
JavaScript (document.getElementById () Art), 343 Zeichen
erweitert:
}
Verwendung:
Warnungen:
>^^>^
Ein Roboter mit Rückwärtsgang wäre sinnvoll gewesen.
quelle