Sei mein Navigator

8

Oh nein, ich bin auf dem Weg zu den großen Schätzen von Marakov verloren! Und alles, was ich habe, sind diese nutzlosen Anweisungen, die aussehen S10R10D30... Ich habe keine Ahnung, was sie bedeuten! Können Sie mir helfen?

Herausforderung

Geben Sie bei gegebenen Anweisungen an N E S W U D L R 1 2 3 4 5 6 7 8 9 0, wie weit ich von meinem Ausgangspunkt entfernt sein werde, wenn ich diesen Anweisungen folge (dh euklidische Entfernung).

N E S W beziehe mich auf Nord, Ost, Süd und West;

U D L Rbeziehen sich auf mich drehe oben, unten, links und rechts (So NRist das gleiche wie E, und so ist SL, SLList das gleiche wie N). Up bedeutet weiterzumachen; Runter heißt umdrehen.

Nach jedem Buchstaben wird eine Zahl stehen, wie weit ich in diese Richtung gehen werde. N10E20bedeutet 10 Einheiten nach Norden, dann nach Osten und 20 Einheiten nach Osten.

Eingabedetails

  • Die Eingabe beginnt immer mit einem von NESW(daher müssen leere Eingaben nicht berücksichtigt werden).
  • Anweisungen mit zwei Buchstaben hintereinander sind zulässig. NEsollte interpretiert werden: "Biegen Sie nach Norden ab, dann sofort nach Osten". Es ist das gleiche wie gerade E. SLList "Biegen Sie nach Süden ab und dann sofort zweimal links ab". Es ist das gleiche wie N.
  • Alle Zahlen sind ganze Zahlen (beachten Sie, dass dies .nicht im Zeichensatz enthalten ist).
  • Eingang wird nur aus NESWUDLR1234567890(Wenn es braucht etwas anderes, wie ‚\ 0‘ in C, oder wenn Sie die Sprache des Eingabefunktion hat ein Newline, oder etwas, das ist in Ordnung.)

Ausgabe

  • Die Norm.
  • Wenn Sie eine Funktion verwenden, sollten Sie einen numerischen Datentyp oder eine Zeichenfolge ausgeben.
  • Muss auf 3 Dezimalstellen genau sein.

Testfälle

  • N10:: 10
  • N10E10:: 14.1421
  • N10S10:: 0
  • NSEWUDLR10:: 10
  • N100RR20E300D40L12:: 268.7452
  • ERR10LL20UN30D100:: 70.71067

Das einfallslose Python-Programm, mit dem ich diese erstellt habe.

Gewinnen

Dies ist Codegolf, also gewinnen die niedrigsten Bytes nach einer Woche!

Quelklef
quelle
@AdmBorkBork Richtig. Lass mich bearbeiten.
Quelklef
Verwandte
AdmBorkBork
@AdmBorkBork Auch dies , aber alle sind etwas anders.
Quelklef
Können wir annehmen, dass die Eingabe nur aus besteht NESWUDLR1234567890?
Darrylyeo
@ Darrylyeo Klar, lass mich bearbeiten.
Quelklef

Antworten:

2

(Los) Ruby , 111 Bytes

x=0
c=1,1i,-1,-1i
gs.sc(/(\w)(\d*)/){|o,a|x+=c.ro!('URDL'.ix(o)||'NESW'.ix(o)+c.ix(1)).fs*a.toi}
p Mh::hy *x.rc

Probieren Sie es online aus!

Nimmt Eingaben auf STDIN vor und gibt sie auf STDOUT aus.

Grundsätzlich werden bei diesem Ansatz komplexe Zahlen zum Speichern der aktuellen Position sowie ein Stack ( c) verwendet, der Offsets für jede Richtung enthält. Wenn eine Richtung in ist URDL, wird der Stapel um den Index der Richtung in dieser Zeichenfolge gedreht. Wenn die Richtung in ist NESW, wird sie um den Index der Richtung in dieser Zeichenfolge plus den Index von 1im Stapel gedreht. Dies wandelt eine Drehung relativ zur aktuellen Position in eine Drehung relativ zur Position 1 um. In jedem Fall wird die Oberseite des Stapels mit der Anzahl der Schritte in der Richtung multipliziert und zur aktuellen Position addiert.

Tutleman
quelle
Was ist "(Go) Ruby"?
Carcigenicate
@Carcigenicate Es ist Ruby, wo der Dolmetscher mit einer speziellen Flagge zusammengestellt wurde, die ihn besser zum Golfen geeignet macht. Unter anderem können Sie Methodennamen abkürzen und das Verhalten bestimmter integrierter Funktionen ändern. Wenn Sie meinen TiO-Link besuchen, wird der Code in der Kopfzeile angezeigt. Dies ist die Mehrzahl der vorgenommenen Änderungen.
Tutleman
4

Python 3 , 137 Bytes

v=n=0
d=1
for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
print(abs(v))

Probieren Sie es online aus!

-9 Bytes dank Jonathan Allan

HyperNeutrino
quelle
Sie können sechs Bytes mit der else-Klausel speichern: else:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)- Beachten Sie, dass Lhier das Ende der Suchzeichenfolge entfernt werden kann, da -1%2equals 7%2and 1j**(-1)equals 1j**3.
Jonathan Allan
@ JonathanAllan Schöne Tricks! Vielen Dank!
HyperNeutrino
Speichern Sie weitere drei, indem Sie das für:for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
Jonathan Allan
@ JonathanAllan Hey cool, danke!
HyperNeutrino
Versuchte meine eigene Hand bei einer Python-Antwort, konnte nicht unter 179 Bytes kommen. Bravo.
Quelklef
2

JavaScript (ES6), 148 142 140 138 137 134 Bytes

s=>s.replace(/\d+|./g,_=>~(i='NESW'.search(_))?d=i:~(i='URDL'.search(_))?d+=i:a[d&3]+=+_,a=[0,0,0,0])&&Math.hypot(a[1]-a[3],a[0]-a[2])

-2 Bytes: Verwenden Sie .search()anstelle von .indexOf()( @Shaggy )

-1 Byte: Programm neu anordnen , um umschließende Klammern zu entfernen ( @Shaggy )

-3 Bytes: Verwenden Sie .replace()anstelle von .match().map()( @ThePirateBay )

darrylyeo
quelle
Für den vorletzten Test erhalten wir unterschiedliche Antworten.
Quelklef
@Quelklef behoben.
Darrylyeo
Können Sie ein paar Bytes mit searchanstatt speichern indexOf?
Shaggy
Ich glaube , Sie auch ein Byte , indem speichern können ain dem map, ersetzt die ,zuvor Mathmit &&und Entfernen der umschließenden Klammern.
Shaggy
@ Shaggy Super, danke!
Darrylyeo
0

Perl 5 , 149 + 1 (-p) = 150 Bytes

while(s/(\D+)(\d+)//){$p=/N/?0:/E/?1:/S/?2:/W/?3:/L/?$p-1:/R/?$p+1:/D/?$p+2:$p for split//,$1;$m[$p%4]+=$2}$_=sqrt(($m[0]-$m[2])**2+($m[1]-$m[3])**2)

Probieren Sie es online aus!

Erklärt:

# Each direction is assigned a number:
#
#     0     North
#     1     East
#     2     South
#     3     West
#
# Variables:
#     $p     present direction
#     @m     total movement in each direction
# Inside loop:
#     $1     a set of direction instructions
#     $2     distance

while(s/(\D+)(\d+)//)    # Remove and preserve the first direction set and distance
   for split//,$1        # Loop through individual letters to set new direction
      $p=/N/?0:          # North
         /E/?1:          # South
         /S/?2:          # East
         /W/?3:          # West
         /L/?$p-1:       # Turn left
         /R/?$p+1:       # Turn right
         /D/?$p+2:       # Turn around
         $p              # Do not change direction
   $m[$p%4]+=$2          # Add the directional movement to previous movements

   $_=sqrt(              # Calculate distance
       ($m[0]-$m[2])**2  # Net North/South movement
      +($m[1]-$m[3])**2  # Net East/West movement
      )
Xcali
quelle