Schreiben Sie eine Funktion oder ein Programm, um die endgültige Position eines Flugzeugs nach diesen Signalen zu berechnen, wenn eine Zeichenfolge eine Reihe von Handzeichen für das Rangieren von Flugzeugen darstellt.
NB: Die Koordinaten in dieser Herausforderung sind als ein Paar kartesischer Koordinaten dargestellt wird , sowie eine Kompassrichtung heading: (x, y, h)
wo x
ist die x-Koordinate, y
die Y-Koordinate, und h
eines von N
, E
, S
oder W
.
Sie starten mit einem Flugzeug in (0, 0, N)
einem imaginären Raster, bei ausgeschaltetem Motor. Ihre Eingabe ist eine Zeichenfolge, die durch Kommas getrennte Zeichenpaare enthält, wobei jedes Paar ein Marshalling-Signal darstellt. Sie müssen nacheinander jedem Rangiersignal folgen und die Koordinaten in (x, y, h)
Form der Endposition des Flugzeugs ausgeben .
Wenn ein Signal erfordert, dass sich Ihr Flugzeug bewegt, nehmen Sie an, dass es für jedes Signal dieses Typs, das es empfängt, eine Einheit in die erforderliche Richtung bewegt . Wenn ein Signal erfordert, dass sich Ihr Flugzeug dreht, nehmen Sie an, dass es sich für jedes Signal dieses Typs, das es empfängt, um 90 Grad in die erforderliche Richtung dreht.
Ein Flugzeug kann sich nicht bewegen, wenn die Triebwerke ausgeschaltet sind. Wenn die Triebwerke Ihres Flugzeugs ausgeschaltet sind und Sie einen Bewegungs- / Blinker erhalten, wenden Sie die Bewegung / Drehung nicht an.
Signale
Jedes Rangiersignal wird durch ein Zeichenpaar dargestellt. Der erste des Paares repräsentiert die Position des linken Arms des Marshallers aus Sicht des Flugzeugs und der zweite den rechten Arm aus derselben POV. Diese handliche Signalübersicht kann hilfreich sein.
o/ — START ENGINES (no movement, no turn)
-/ — CUT ENGINES (no movement, no turn)
-~ — TURN LEFT (no movement, left turn)
~- — TURN RIGHT (no movement, right turn)
~~ — COME FORWARD (forward movement, no turn)
:: — MOVE BACK (backward movement, no turn)
/\ — NORMAL STOP (no movement, no turn)
Dies ist nicht die vollständige Liste der Marshalling-Signale, aber alles, was Sie unterstützen müssen.
Eingang
Die Eingabe ist eine durch Kommas getrennte Zeichenfolge, die Zeichenpaare enthält. Diese Zeichenfolge ist immer gültig - Sie müssen die Eingabe nicht validieren.
Ausgabe
Die Ausgabe ist ein Satz von Koordinaten wie oben beschrieben. Sie können dies in jedem geeigneten Format zurückgeben. Wenn Ihre Sprache mehrere Rückgabewerte unterstützt, können Sie dies verwenden. Alternativ können Sie eine Zeichenfolge (die Klammern um die Koordinaten sind nicht obligatorisch), ein Array, ein Tupel, eine Liste oder was auch immer Sie sonst noch für zweckmäßig halten, verwenden. Die einzige Regel ist , dass es enthalten muss x
, y
und h
Werte, die in dieser Reihenfolge.
Testfälle
Input — Output
o/,~~,~~,~-,:: — (-1, 2, E)
::,~-,o/,/\,~~,-~,~~,~~,~~ — (-3, 1, W)
o/,::,-/,~~,o/,~-,~~,~~,~- — (2, -1, S)
o/,~-,~-,::,::,~-,~~,-~ — (-1, 2, S)
~-,~-,o/,::,::,-/,~~,-~ — (0, -2, N)
Antworten:
Java 8, 505 Bytes
Golf (mit Hilfe von @ masterX244 zum Rasieren eines großen Stücks)
Mehr lesbar
quelle
class f{static boolean T(String u,String v){return u.equals(v);}public static void main(String[]a){java.util.Scanner q=new java.util.Scanner(System.in);String s=q.nextLine();int x=0;int y=0;int d=0;int[][]v={{0,1},{-1,0},{0,-1},{1,0}};int b=1;for(String r:s.split(",")){if(T(r,"o/")||T(r,"-/"))b*=-1;if(b<0){if(T(r,"~-"))d=(d+3)%4;if(T(r,"-~"))d=(d+1)%4;if(T(r,"~~")){x+=v[d][0];y+=v[d][1];}if(T(r,"::")){x-=v[d][0];y-=v[d][1];}}}System.out.print("("+x+","+y+","+"NWSE".charAt(d)+")");}}
Befunge,
201185 BytesProbieren Sie es online aus!
Befunge hat keinen String-Typ als solchen. Um den Vergleich der Signale zu erleichtern, wird jedes Zeichenpaar mithilfe der Formel in eine Ganzzahl konvertiert
(c1 - 45)/3 + c2 - 47
. Dies kann bedeuten, dass bei ungültigen Eingaben falsche Übereinstimmungen angezeigt werden. Dies spielt jedoch keine Rolle, wenn die Eingabe garantiert gültig ist.Der Rest des Codes basiert auf der Manipulation von vier „Variablen“: der Motor Zustand (1 oder 0), die Position (0 bis 3 für NESW) und die x und y - Positionen. Die Berechnungen für jedes Signal sind dann wie folgt:
Motor starten:
engine = 1
Motor
engine = 0
abstellen : Links abbiegen:
heading = (heading - engine + 4) % 4
Rechts abbiegen:
heading = (heading + engine) % 4
Bewegung: (wobei dir 1 für vorwärts und -1 für rückwärts ist)
y += dir*engine*(1-heading)*!(heading%2)
x += dir*engine*(2-heading)*(heading%2)
Sobald wir das Ende der Eingabesequenz erreicht haben, müssen nur noch x , y und die Überschrift ausgegeben werden (konvertiert in ein Zeichen mit einer einfachen Tabellensuche).
quelle
Python 2.7.12, 295 Bytes
Die erste Einrückungsstufe nach der
for
Verwendung einer einzelnen\s
. Die Einrückung der zweiten Ebene verwendet eine einzelne\t
. (Das Wysiwyg wird\t
durch mehrere Leerzeichen ersetzt. Bitte beachten Sie dies beim Testen der Größe.)quelle
raw_input()
.TypeError: Argument to map() must support iteration
fehlerhaft : (Ich verwende Python 2.7.12).Python 2, 142 Bytes
Beispiel:
Dies druckt komplexe Zahlen, was sollte in Ordnung sein, denke ich? Die
x
,y
,h
ist , um immer noch da, und das'j'
verursacht keine Verwirrung. Sag mir, ob ich es ändern soll.quelle