Manhattan Abstand der Rotationssequenz

9

Ich dachte, das wäre eine gute Herausforderung: http://adventofcode.com/2016/day/1

Aufgabenbeschreibung

Geben Sie bei einer Folge von Rotationen und Abständen nach dem Muster (L | R) [1-9] [0-9] * den Manhattan-Abstand zwischen Start- und Endpunkt an, dh die minimale Anzahl vertikaler und horizontaler Bewegungen ein Gitter.

Beispiele

Wenn wir beispielsweise annehmen, dass Sie nach Norden ausgerichtet sind:

Nach R2 verlässt Sie L3 2 Blocks östlich und 3 Blocks nördlich oder 5 Blocks entfernt. R2, R2, R2 lässt Sie 2 Blocks südlich Ihrer Startposition, die 2 Blocks entfernt ist. R5, L5, R5, R3 lassen Sie 12 Blocks entfernt.

Technische Details

Sie können das Trennzeichen zwischen den Zügen auswählen (z. B. "\ n", "," oder ","). Sie müssen die Antwort als Ganzzahl in Basis 10 angeben.

Kein Duplikat!

Es ist aus mehreren Gründen kein Duplikat:

  • Die Bewegungen sind nicht gleich. Hier sind es Rotationen , keine Richtungen.
  • Ich möchte die Manhattan-Distanz, nicht den Euklidian.
Labo
quelle
3
Sie sollten eine Beschreibung der Entfernung von Manhattan in Ihre Frage aufnehmen. Nur einen Link zu posten ist etwas heikel.
Gabriel Benamy
2
Es ist ganz anders ! Wir haben nur Rotationen!
Labo
1
@ Labo stimme ich zu. Es geht nicht nur darum, dass die Antwort hier in Manhattan-Entfernung ist, während die andere in euklidischer Entfernung ist. Dies hat eine Bewegung im Schildkrötenstil, während die andere die Kompassrichtungen NSEW angibt (die Tatsache, dass sie UDLR genannt werden, ist irrelevant.)
Level River St
2
Bitte nutzen Sie die Sandbox in Zukunft, um Feedback zu Ihren Herausforderungen zu erhalten, bevor Sie sie auf der Hauptseite veröffentlichen.
Mego
2
@Labo Das ist in Ordnung, wir erwarten nicht, dass neue Benutzer alle Vor- und Nachteile dieser Website sofort kennen. Es ist nur ein sanfter Vorschlag für das nächste Mal. :)
Mego

Antworten:

4

Python 3, 109 99 104 101 Bytes

Dies ist eine einfache Antwort, die komplexe Zahlen verwendet, wobei die Eingabe als durch Leerzeichen getrennte Zeichenfolge oder als durch Zeilenumbrüche getrennte Zeichenfolge erfolgt. Golfvorschläge willkommen!

Bearbeiten: -13 Bytes dank Labo. +5 Bytes für die Konvertierung in ein int.

d=p=0
for r in input().split():d+=1-2*(r<'R');p+=1j**d*int(r[1:])
print(int(abs(p.real)+abs(p.imag)))

Ungolfing

def manhattan_rotation(seq, nsew=0, pos = 0):
    for rot in seq.split():
        # change direction
        if rot[0] == "L":
            nsew += -1 
        else:
            nsew += 1
        # move in that direction rot[1:] times
        pos += 1j ** nsew * int(rot[1:])
    return int(abs(pos.real)+abs(pos.imag))
Sherlock9
quelle
1-2 * (r [0] <'R') spart Ihnen 2 Bytes :)
Labo
Machen Sie keine Funktion, wenn Sie von der Eingabe lesen, sparen Sie mehr Zeichen!
Labo
Weisen Sie 2 Variablen in derselben Zeile zu, um 2 Bytes zu speichern: d = p = 0
Labo
Ich habe deine Antwort noch einmal gespielt und es macht 99 Zeichen! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo
2
@ Labo Ich bin nicht sicher, ob Sie die Spezifikation so bearbeiten können, dass vorhandene Antworten ungültig werden, aber lassen Sie mich einige Mods fragen.
Sherlock9
2

PHP, 93 Bytes

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

Nervenzusammenbruch

while($m=$argv[++$i])       // loop through arguments:
    ${                      // 5. use as variable name
        chr(                // 4. cast to character (P,Q,R,S) 
        80|                 // 3. add 80
        3&                  // 2. modulo 4
        $d+=(P<$m)-(M>$m)   // 1. change direction depending on letter
    )}+=substr($m,1);       // 6. add number to variable
echo abs($P-$R)+abs($Q-$S); // calculate distance, print
Titus
quelle
2

Python 2, 86 Bytes

x=y=0
for d in input().split():c=cmp(d,'M');x,y=int(d[1:])-y*c,x*c
print abs(x)+abs(y)

Verfolgt den Strom xund die yKoordinaten. Drehen Sie beim Drehen den aktuellen Wert, anstatt die Richtung zu aktualisieren, sodass die Bewegung immer in x-positiver Richtung erfolgt. Komplexe Zahlen waren zu kostspielig, um die Koordinaten daraus zu extrahieren.

xnor
quelle
1

Python 2, 103 102 Bytes

l=c=0
for i in input().split():c+=cmp(i[0],'N');l+=1j**c*int(i[1:])
print int(abs(l.imag)+abs(l.real))

repl.it

Die Eingabe ist eine Folge von durch Leerzeichen getrennten Richtungen, z "R5 L5 R5 R3".
Druckt die Manhattan-Entfernung zwischen dem Startort und dem Ziel aus.

Wie?

Beginnt am Ursprung der komplexen Ebene l=0;

Mit einem kumulierten Viertel-Rechts-Abbiegezähler c=0;

Für jeden Befehl wird idie Drehung durch Vergleichen des ersten Zeichens der Richtung mit dem Zeichen analysiert 'N'und centsprechend angepasst.

Die Entfernung zum Reisen wird analysiert int(i[1:])und die Anweisung wird ausgeführt, indem so viele blockgroße Schritte in die Richtung ausgeführt werden, die durch die cPotenz von 0+1jmit gegeben ist 1j**c.

Die endgültige Entfernung nach Manhattan ist die Summe der absoluten Entfernungen vom Ursprung in zwei Richtungen - imaginär und real; erreicht mitabs(l.imag)+abs(l.real)

Jonathan Allan
quelle
1
@ Sherlock9 - Oh, ähm Antwort Konvergenz. Sparen Sie 2 Bytes, indem Sie zu Python 2 wechseln und cmpwie meine Antwort verwenden. Lassen Sie es mich wissen und ich werde löschen.
Jonathan Allan
0

JavaScript (ES2016), 98 100

2 Bytes gespeichert thx @Neil

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x*x)**.5+(y*y)**.5

100 Bytes für ES6

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

Weniger Golf gespielt

d => d.replace(/.(\d+)/g,
  (d,l)=>( // L or R in d, distance in l
    o += d>'M' || 3, // orientation in o, used %4
    l *= ~-(o&2), // convert to number and change sign if needed
    o&1 ? x -= l : y += l // move based on orientation
  ), x = y = o = 0)
&& (x>0?x:-x) + (y>0?y:-y)

Test (ES6)

F=
d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

function update() {
  O.textContent=F(I.value)
}

update()
<input id=I value='R5, L5, R5, R3' oninput='update()'><pre id=O></pre>

edc65
quelle
1
Meine ES6-Antwort war ursprünglich 106 Bytes; Durch das Kopieren Ihrer Zwischenvariablen habe ich 3 Bytes gespart. Durch das Umschalten von Übereinstimmung auf Ersetzen wurden mir 2 Bytes gespart, und durch gleichzeitiges Kopieren der Verarbeitung von Richtung und Entfernung wurde mir ein letztes Byte erspart, was dazu führte s=>s.replace(/.(\d+)/g,(c,n)=>(d+=c<'R'||3,n*=~-(d&2),d&1?x+=n:y+=n),x=y=d=0)&&(x<0?-x:x)+(y<0?-y:y), dass es dank der c<'R'||3und n*=~-(d&2)Tricks jetzt zwei Bytes kürzer ist als Ihre ES6-Antwort .
Neil