Wo bin Ich jetzt?
Bestimmen Sie anhand einer Zeichenfolge d
, die nur die Buchstaben enthält NSWE
, die Koordinaten, die ich zurückgelegt habe (von links nach rechts, verbraucht), und die endgültige Koordinate, in der ich mich befinde.
Die Regeln zum Lesen von Koordinaten von links nach rechts:
- Wenn das nächste Zeichen
N
oder istS
:- Wenn das Zeichen nach dem
N
oderS
ein anderes istN
oderS
:- Verbrauchen Sie nur die erste
N
oderS
. - Ausgabe
[0,1]
fürN
- Ausgabe
[0,-1]
fürS
- Verbrauchen Sie nur die erste
- Wenn das Zeichen nach dem
N
oderS
istW
oderE
:- Verbrauchen Sie sowohl das
N
oderS
als auch dasW
oderE
. - Ausgabe
[1,1]
bzw.[-1,1]
fürNE
undNW
. - Ausgabe
[1,-1]
bzw.[-1,-1]
fürSE
undSW
.
- Verbrauchen Sie sowohl das
- Wenn das Zeichen nach dem
- Wenn das Zeichen ein
E
oderW
voran nicht durch eineS
oderN
:- Verbrauchen die
E
oderW
. - Ausgabe
[1,0]
fürE
. - Ausgabe
[-1,0]
fürW
.
- Verbrauchen die
Gearbeitetes Beispiel
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Beachten Sie, dass dies in jedem Format sein kann. Hier sind andere Beispiele für eine gültige Ausgabe:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
Etc...
Mehr Beispiele
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NIEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
Nen
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
Regeln
- Sie können in jedem geeigneten Format ausgeben, das keine Regelungslücken verletzt.
- Sie müssen gierig konsumieren,
NWE
ist nieN,W,E
, es ist immerNW,E
.- Dies gilt für:
SW*
,SE*
,NW*
,NE*
. - Sie konsumieren gierig von links nach rechts.
- Dies gilt für:
- Das ist Code-Golf , die niedrigste Anzahl an Bytes gewinnt.
[4, 3]
würde es ein wenig einfacher machen zu sehen, was in der Testausgabe vor sich geht.1
,-1j
,(-1+1j)
etc ein gültiges Ausgabeformat?NE
ist doch einfachN+E
nicht egal?Antworten:
Python 2 , 116 Bytes
Probieren Sie es online!
Bei Ausgabe als
[(3+4j), 1, -1j, …]
91 BytesProbieren Sie es online!
Dieses Lambda gibt eine Liste von Gaußschen Ganzzahlen zurück : Die erste ist die endgültige Koordinate, und alle anderen sind die Schritte, die erforderlich sind, um dorthin zu gelangen.
quelle
Attache , 80 Bytes
Probieren Sie es online!
Dies ist eine anonyme Funktion, die ein String-Argument akzeptiert.
Erläuterung
Die erste Aufgabe besteht darin, die Analysephase dieser Frage zu implementieren. Ich fand es am kürzesten, einen einfachen Regex zu verwenden, um die Eingabe zu analysieren (
_
):Dies entspricht allen Vorkommen des regulären Ausdrucks
[NS][WE]|.
, wie in vielen anderen Antworten zu sehen ist. Dies ergibt gierig die angeforderten Richtungen.Jetzt wenden wir auf jede Richtung eine Hash-Funktion an. Wir nehmen die Codepunkte jeder Richtung und summieren sie. Dies ergibt das folgende Mapping:
Wir werden versuchen, diese Werte einer kleineren Domäne zuzuordnen. Modulo ist dafür nützlich, und wir können zeigen, dass das kleinste Modulo, das zu eindeutigen Werten für alle angegebenen Eingaben führt, 11 ist. Nach Resten sortiert ergibt dies die folgende Tabelle:
Jetzt haben wir eine Eingabekorrespondenz, als Kodierung von
Sum@Ords=>[...]%11
. Als nächstes müssen wir diese Reste in Punkte umwandeln. Wir werden versuchen, eine andere Zuordnung abzuleiten, was bedeutet, dass das Einfügen von "dünn besetzten Werten" in Hashes, die nicht den Anweisungen entsprechen, nützlich ist:Wir haben derzeit eine Reihe von Punkten, die eine durch den Hash indizierbare Liste ergeben können:
Nun werden wir dies komprimieren, da es nur aus
-1
s,0
s und1
s besteht. Da die Liste Paare darstellt, können wir die Liste reduzieren, ohne Daten zu verlieren. Wenn wir dann jede Zahl nehmenx
und berechnen1-x
, erhalten wir die folgende Liste:Wir können dies in eine Zahl zur Basis 3 umwandeln:
Umstellung auf Basis 10:
Zusammenfassend haben wir unsere Punkte genommen, sie entkoppelt, jedes Element
1
von der Basis subtrahiert und von ihr konvertiert3
, um sie zu erhalten22260446188
. Wir können als solche dekomprimieren:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
Dies gibt uns unseren ursprünglichen Satz von Paaren. Dann können wir die oben erwähnte Indizierung wie folgt durchführen:
Da die Indizierung durch ein Array in Attache alle Elemente zurückgibt, die diesen Indizes entsprechen. (Also
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
,.) Nun haben wir die Richtungen des Weges, den der OP gegangen ist. Was bleibt, ist die Berechnung der Summe.Also erfassen wir dieses Ergebnis in einem Lambda
{...}
und setzen es als erste Funktion in eine Funktionszusammensetzung (a##b
), wobei die zweite Funktion istV#Sum
. Dies ist eine Gabel, die sich bei Eingabe wie folgtx
erweitert:Sum
Wenn ein 2D-Array angegeben wird, summiert sich jede Spalte im Array (als Ergebnis einer vektorisierten Summierung). Auf diese Weise werden die Anweisungen mit dem endgültigen Ziel verknüpft, und wir haben unser endgültiges Ergebnis.quelle
JavaScript (ES6), 102 Byte
Gibt eine Zeichenfolge zurück.
Probieren Sie es online!
quelle
MATL , 45 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erklärung (mit Beispiel)
Betrachten Sie die Eingabe
'NSWE'
als Beispiel.quelle
Java (JDK 10) , 171 Byte
Probieren Sie es online!
Erklärungen
Dank
c=~-s[i]/6%4
wird das folgende Mapping durchgeführt:NS
wird geprüft , mitc<2
und zugeordnet+1
/-1
mit1-c*2
;EW
wird geprüft , mitc>1
und zugeordnet+1
/-1
mitc*2-5
.Credits
quelle
Retina 0.8.2 , 93 Bytes
Probieren Sie es online! Erläuterung:
Duplizieren Sie die Eingabe.
Teilen Sie die erste Kopie in Richtungen auf.
Entfernen Sie überflüssige Leerzeilen, die durch den obigen Vorgang erzeugt wurden.
Ändern Sie
W
in,J
so dass es zwischenE
und sortiertN
. (WechselnE
zwischenS
undW
würde auch funktionieren.)Sortieren Sie jede Zeile in der Reihenfolge.
Löschen Sie Paare entgegengesetzter Richtungen (dies betrifft natürlich nur die letzte Zeile).
Zählen Sie die Anzahl der horizontalen und vertikalen Bewegungen und fügen Sie gegebenenfalls Zeichen hinzu.
Diejenigen von euch, die die Unterschiede zwischen Retina 0.8.2 und Retina 1 kennen, werden darauf hinweisen wollen, dass ich in Retina 1 2 Bytes einsparen kann, weil es
*
anstelle von verwendet$*
. Während ich dort war, habe ich versucht, den Aufteilungsprozess zu vereinfachen, aber ich konnte die Byteanzahl nicht weiter reduzieren, ich konnte es nur so ausgleichen:quelle
Java 10,
269265243 BytesAuf jeden Fall nicht die richtige Sprache für diese Herausforderung.
Probieren Sie es online aus.
Erläuterung:
quelle
Perl 5
-n
, 94 BytesProbieren Sie es online!
quelle
JavaScript (ES6), 102 Byte
Gibt eine Zeichenfolge zurück.
quelle
Ruby ,
7571 BytesProbieren Sie es online!
-4 Bytes dank benj2240.
Da die Rückgabe komplexer Zahlen ein akzeptables Ausgabeformat zu sein scheint, wird es wohl nicht viel golfener, als nur die sehr nette Antwort von Lynn zu portieren .
quelle
map
und seinen Block direkt ansum
folgende Adresse übergebenF # (Mono) , 269 Bytes
Probieren Sie es online!
quelle
NSWE
Sie gerade ausgeben(0,1)
,(-1,-1)
sollte(1,0)
eine vierte Ausgabe die Summe dieser Koordinaten sein, also(0,0)
(weil0+-1+1 = 0
und1+-1+0 = 0
).sed, 125
Das Nehmen von Freiheiten mit Ausgabeformatversion :
Die Bewertung enthält +1 für den
-r
zu sedierenden Parameter.Probieren Sie es online aus .
Die Ausgabe ist wie folgt:
A
die + ve Ganzzahllen(string)
a
die Ganzzahl -ve-len(string)
0
Beispielsweise:
,
ist [0,0],AA
ist [0,2]aaa,
ist [-3,0]sed 4.2.2 einschließlich GNU exec extension , 147
Die sinnvolle Ausgabeformatversion :
Die Bewertung enthält +1 für den
-r
zu sedierenden Parameter.Die Ausgabe erfolgt als durch Leerzeichen getrennte Koordinaten, eine pro Zeile. Zwischen dem vorletzten und dem letzten Satz von Koordinaten gibt es einen zusätzlichen Zeilenumbruch - nicht sicher, ob das problematisch ist oder nicht.
Probieren Sie es online!
quelle
PHP, 153 Bytes
lass einen Regex die Aufteilung machen; Durchlaufen Sie die Übereinstimmungen, drucken Sie die Zwischenergebnisse aus und fassen Sie sie zusammen:
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle
C (gcc) 173 Bytes
Es ist interessant, dies in einer Sprache ohne Regex-Unterstützung zu tun!
Probieren Sie es online!
quelle