Zusammenfassung
Die Aufgabe besteht darin, den Marsrover zu navigieren und seine endgültigen Koordinaten und Richtungen anzugeben.
Eingang:
Erste Eingabe:
Zuerst muss Ihr Programm die Eingabe in folgendem Format vornehmen:
[X-Coordinate],[Y-Coordinate],[Direction]
Die Richtung muss sein: N
oder S
oder E
oder W
(Anfangsbuchstaben von Nord, Süd, West, Ost)
Beispiel: 10,20,N
(x = 10, y = 20, Richtung = N (Nord))
Zweiter Eingang:
Der zweite Eingang besteht aus Reihe von R
, L
, M
für rechts, links und jeweils bewegen.
Für R
und L
(rechts und links) muss sich die Richtung des Rovers entsprechend ändern.
Denn M
der Rover muss 1 Einheit in der Richtung vorausfahren, in der er sich vor der Bewegung befand.
Regeln zur Koordinatenberechnung:
N = Y + 1
E = X + 1
S = Y - 1
W = X - 1
Ausgabe:
Die endgültigen Koordinaten und die aktuelle Richtung des Rovers.
Beispiel:
Enter initial data: 1,2,N
Enter the instructions: MRMLM
Output: 2,4,N
Die Koordinaten können eine beliebige Ganzzahl sein und können negativ sein .
Alle Standardlücken sind nicht erlaubt. Wenn die Bereitstellung einer Demo auf Websites wie http://ideone.com usw. möglich ist, tun Sie dies bitte, damit ich dies überprüfen kann :)
Dies ist ein Beliebtheitswettbewerb, also sei kreativ!
Nach den Ratschlägen anderer entscheide ich mich, dies zu einem Code-Golf zu machen .
Antworten:
Rubin ≥ 2,0, 101
Diese Lösung kann hier getestet werden: https://ideone.com/C4PLdE
Beachten Sie, dass die auf ideone verknüpfte Lösung ein Zeichen länger ist (
1.i
anstatt1i
in Zeile 3). Der Grund dafür ist, dass ideone nur Ruby 1.9 unterstützt, was die Kurzsyntax für komplexe Literale nicht zulässt.quelle
x,y,i=eval"[#{gets}]"
mit eineval"x,y,i="+gets
paar Zeichen zu speichern.eval
Scoping-Regeln tatsächlich funktioniert :ruby -e 'eval"x=1";p x'
wirft einNameError
fürx
anp x
. Es funktioniert, wenn Konstanten (eval"X,Y,I="+gets
) verwendet werden, aber da ich Änderungen vornehmei
, wäre eine zusätzliche erforderlichi=I
, um Warnungen bezüglich der Neudefinition einer Konstante zu vermeiden. Aber vielleicht sprechen wir über verschiedene Ruby-Versionen?x,y,i=eval"*a="+gets
. Vielen Dank!Javascript ( ES6 )
145141127Bearbeiten: In der C-Lösung von edc65 wurde die Notwendigkeit für ein Übersetzungsarray mithilfe der Methode beseitigt
Ungolfed / Kommentiert:
quelle
Java - 327
Mit Leerzeichen:
Wie bei Java üblich, analysiert etwa die Hälfte davon nur die Eingabe und bildet die Ausgabe. Die Logik ist ziemlich einfach.
quelle
Javascript (E6) 175
Edit Behobener Fehler, möglicherweise außerhalb des Bereichs liegender Rückgabewert für d
139 Logik, 36 E / A
Basic ungolfed
Test Test in der Javascript-Konsole in Firefox. Es ist einfacher, die Funktion F zu testen und Popups zu vermeiden.
Ausgabe
quelle
C 164
180 186Edit Festes Eingabeformat und entferntes strchr
Edit Entferntes Offset-Array, berechnet mit Bits
Ungolfed
quelle
C 148,
150,151Eine Optimierung der @ edc65-Lösung, um meinen ASCII-Wertmissbrauchsansatz zu verwenden.
Speziell:
d%8%5
ordnet die ZeichenENWS
auf0,1,2,3
jeweilsc%23
verwandelt sichL
in7
,M
in8
undR
in 13. Dad
(die Richtungsvariable) immer Mod 4 verwendet wird, bewirkt dies effektiv, dassL
Sie -1 Mod 4M
hinzufügen, 0 Mod 4R
hinzufügen und 1 Mod 4 hinzufügen.d&1
ist 1 fürNS
und 0 fürEW
Richtungen.d&2
ist 2 fürWS
und 0 fürNE
Richtungen.~-(d&2)
ist 1 fürWS
und -1 fürNE
Richtungen.c%2
ist 1 fürM
und 0 fürLR
.quelle
c%(2*(1-(d&2)))
Python 3 (mit Schildkrötengrafiken),
251199 BytesWeise Pythonisten, bitte seien Sie vorsichtig, denn dies ist mein allererster Versuch, ein Programm zu entwickeln, das in Ihrer feinen Sprache geschrieben ist.
Schildkröten auf dem Mars!
Diese Herausforderung lässt sich ganz natürlich auf Schildkrötengrafiken im Logo-Stil übertragen, für die Python natürlich von Bedeutung ist.
Liest die Eingabe von zwei Zeilen aus STDIN.
Ausgabe:
Was ich an diesem Programm besonders mag, ist, dass es den Weg des Rovers grafisch darstellt. Fügen Sie
exitonclick()
am Ende des Programms hinzu, damit die grafische Ausgabe so lange erhalten bleibt, bis der Benutzer auf Folgendes klickt:Ich bin mir ziemlich sicher, dass dies deutlich mehr golfen werden kann - Anregungen sind willkommen! Ich mache dieses CW, weil ich hoffe, dass die Community noch mehr Golf spielen kann.
Änderungen:
quelle
GolfScript,
116 98 88 8471Dies sollte die Koordinaten und die Anweisungen als Argumente die folgende Weise erhalten:
1 2 'N' 'MRMLM'
. Die Argumente werden in eine Zeichenfolge umgewandelt und in den Stapel verschoben.Wenn Sie dies online testen möchten, gehen Sie zu Webgolfscript und fügen Sie ein Semikolon gefolgt von einer Zeichenfolge mit den Argumenten (z. B.
;"1 2 'N' 'MRMLM'"
) vor dem Code ein ( hier ein Link mit einem Beispiel).Beispiele für die Ausgabe:
Meine bisherigen Versuche
84 Zeichen:
88 Zeichen:
98 Zeichen:
116 Zeichen:
quelle
Delphi (819)
Als ich anfing, war es noch kein Code-Golf . Wird später bearbeitet.
Ich kann jedoch keinen Compiler online finden.
Ungolfed
quelle
=
los mit den Räumen herum ? Warum werden sie gebraucht? Auch die Variablennamen scheinen mir viel zu langJavascript (353)
Dies ist mein erster wirklicher Versuch, Code Golf zu spielen, scheint zumindest zu funktionieren!
quelle
var
s fallen.Python (263)
Es muss auch eine elegantere Art geben, es braucht nicht den Zweig nach dem anderen.
http://ideone.com/eD0FwD
Die Eingabe ist schrecklich, ich wollte es tun
split(',')
, stieß aber auf Casting-Probleme zwischen Ints und Strings. Idealerweise wollte ich auch die alte Position mit der Bewegungsposition hinzufügen ... oh, es ist jetzt Code-Golf. Na ja, was auch immer, ich werde es hier lassen, könnte Inspiration geben. Andere Ideen, die ich hatte, waren Modulo 4 der Richtung, nachdem ich die anfängliche Peilung einem Index zugeordnet hatte. Verschmelzen Sie auch die Runden und verschieben Sie die Arrays zu einer, da keiner der Schlüssel kollidiert.Trotzdem ist es 263, Variablennamen zu verkürzen und Leerzeichen zu entfernen:
quelle
Python 2.7 -
197192 BytesIch bin wirklich super stolz auf diesen.
Erläuterung
Lassen Sie uns zuerst dieses Durcheinander beseitigen. Ich habe an vielen Stellen Semikolons anstelle von Zeilenumbrüchen verwendet, weil ich denke, das macht mich cool. Hier ist es normalerweise (das sind immer noch 197 Bytes, es wurde überhaupt nicht ungolfed). Ja, es gibt immer noch ein Semikolon, aber dieses speichert tatsächlich ein Byte.
Lass uns anfangen!
Zuerst definieren wir
q
als die Zeichenfolge'NESW'
. Wir verwenden es zweimal später undlen("q='NESW';qq") < len("'NESW''NESW'")
.Hier teilen wir die erste Zeile der Eingabe an jedem Komma. Unsere x-Koordinate ist in
x
, y iny
und der erste Buchstabe unserer Richtung in gespeichertd
.Dann machen wir einfach die Koordinaten. (Ich war schockiert darüber, dass ich mir keine bessere Möglichkeit vorstellen konnte, zwei Zeichenfolgen in Ints umzuwandeln. Ich habe es versucht,
x,y=map(int,(x,y))
aber das wird länger.)Dies wandelt unsere Richtung in eine ganze Zahl um. 0 ist Norden, 1 ist Osten, 2 ist Süden und 3 ist Westen.
Hier beginnt der Spaß.
Wenn wir nach Norden gehen, erhöht sich Y um 1. Also nimmt dieses Wörterbuch 0 und gibt die Zeichenfolge
'y+'
für " Y erhöhen ". Es gibt ähnliche Ergebnisse für andere Richtungen: y oder x gefolgt von + oder -.Wir werden darauf zurückkommen.
Ich bin in die Freiheit gegangen, diese ein wenig zu entgolfen.
Für jedes Zeichen in der zweiten Eingabezeile machen wir zwei Dinge. Zuerst setzen wir die Variable
m
auf das, was uns unser Wörterbuch für unsere aktuelle Richtung vorgibt. Es gibt keinen Grund, warum wir das jedes Mal brauchen, aber es ist einfacher, als es nur dann zu tun, wenn wir es brauchen.Als nächstes haben wir eine Liste mit drei Elementen erstellen:
'd+'
,'d-'
, undm
. Anmerkung des Herausgebers: Ich denke, ich kann davonkommen, wenn ich die Variablem
überhaupt nicht benutze . Ich denke, ich kann es einfachv[d]
direkt in die Liste aufnehmen. Das spart mir ein paar Bytes, wenn es funktioniert, aber ich habe keine Lust, es zu testen, bis ich mit dieser Erklärung fertig bin, damit Sie damit umgehen können. (Ja, es hat funktioniert.)Wir suchen das aktuelle Zeichen der Eingabe in der Zeichenfolge 'RL'.
str.find
Gibt -1 zurück, wenn das Zeichen nicht gefunden wird. Dadurch wird ein R in eine 0, ein L in eine 1 und alles andere in -1 konvertiert. Die einzige andere Eingabe, die wir haben können, ist natürlich M, aber es sind weniger Zeichen, damit es für alles funktioniert.Wir verwenden diese Nummer als Index für die von uns erstellte Liste. Python-Listenindizes beginnen am Ende, wenn sie negativ sind. Daher erhalten wir das erste Element, wenn die Eingabe R ist, das zweite, wenn es L ist, und das letzte, wenn es M ist. Der Einfachheit halber gehe ich davon aus Wir sind nach Norden ausgerichtet, aber ein ähnliches Prinzip gilt für andere Richtungen.
Die möglichen Werte, mit denen wir arbeiten, sind
'd+'
für R,'d-'
für L und'y+'
für M. Dann hängen wir an'=1;d=d%4'
das Ende jedes einzelnen an. Das heißt, unsere möglichen Werte sind ...Das ist gültiger Python-Code! Das ist gültiger Python-Code, der genau das tut, was wir für jedes dieser Eingabezeichen tun wollen! (Der
d=d%4
Teil hält unsere Anweisungen einfach in Ordnung. Wieder muss er nicht jedes Mal ausgeführt werden, aber es sind weniger Zeichen.)Alles, was wir tun müssen, ist, den Code auszuführen, den wir für jedes Zeichen erhalten, ihn auszudrucken (unsere Richtung zurück in eine Zeichenkette umzuwandeln) und fertig!
quelle
C - 350
Speichern als
rover.c
:Kompilieren:
Probelauf:
Ideone
Ungolfed:
quelle
Haskell - 412 Bytes
Getestet mit:
quelle
f=many digit
VIEL LOL - SO WOWread
mehrmalige Verwenden erforderten mehr Zeichen als das Verwenden vonBash + Coreutils, 159 Bytes
Die Eingabe wird aus 2 Zeilen STDIN gelesen.
Ausgabe:
quelle
PowerShell,
170167166Kann nicht scheinen, dieses unten weiter zu golfen, das ein bisschen peinlich ist. Aber all die offensichtlichen Hacks funktionieren hier nicht wirklich.
Ich kann nicht
iex
der Eingang , weil a)N
,S
,E
undW
mußten Funktionen werden für das zu arbeiten (oder ich Präfix brauchen würde , dass mit$
und b)1,2,N
müßte die ParsenN
in der Expression - Modus nicht in der Lage zu sein , einen Befehl auszuführen .Dies
switch
scheint der kürzeste Weg zu sein, die Bewegung auszuführen. Hash-Tabelle mit Skriptblöcken oder Strings ist auch nicht kürzer und für jeden anderen Weg, abgesehen vomswitch
Overhead der expliziten Schleife.Ich kann das nicht loswerden,
IndexOf
weil eine Pipeline mit?
immer noch länger ist.Ich kann die expliziten Typen in der anfänglichen Deklaration auch nicht loswerden, weil ich dort gemischte Typen habe, also
|%{+$_}
hilft ein einfaches nicht und jede andere Option ist länger.Manchmal hasse ich die Eingabe in PowerShell.
quelle
Python, 135
137138Mißbräuche die ASCII - Werte
L
,M
undR
zu vermeiden alle bedingten Anweisungen.Probieren Sie es in ideone .
quelle
Python 2.7,
170149Dinge, die ich vom Original geändert habe:
Mit Alias raw_input wurde das v [d] -Wörterbuch, das sowieso eine Liste sein sollte, in eine Zeichenfolgenauswahl geändert
%=
.Bearbeiten: Tupel entpacken und auswerten (raw_input ()) == input (), um 21 Zeichen zu speichern.
Stark von @undergroundmonorail ausgeliehen, aber mit vielen Verbesserungen.
quelle
Bash / SHELF ,
243235" SHE ll go LF " ist eine Golfbibliothek für Bash, die einige nützliche Aliase bietet. Dies ist eine gültige Antwort, da die Bibliothek vorhanden war und sich vor dem Posten der Herausforderung auf GitHub befand.
Tut mir leid, ich kann das nicht auf ideone anwenden.
Wie läuft man?
Dies übernimmt die Anfangsposition (wie angegeben durch Kommas getrennt; dies fügt dem Code viele Zeichen hinzu) als erstes Argument und die Anweisungen zur Standardeingabe.
Beispielausgabe
Code
Erläuterung
d
ist zum Vergleich; Es gibt 0 zurück, wenn die beiden Argumente gleich sind, und 1, andernfalls können andere Befehle mit&&
und verkettet werden||
.y
ist wietr
(aber fertig durchsed
).Y
ist wiesed 's/.../.../g'
für seine zwei Argumente.P
istecho -e -n
;p
ist einfachecho -e
.Das nächste bisschen ist zutiefst hässlich, mit etwa 145 Zeichen in einer Zeile. Wenn der aktuelle Befehl M ist, setzen Sie die Kommas in $ o in Leerzeichen, konvertieren Sie sie in ein Array und speichern Sie sie in $ z. Dann machen Sie einen switch ... case-Block für das letzte Element von $ z (die Richtung, in die der Rover zeigt. Ändern Sie die Koordinaten entsprechend, konvertieren Sie dann $ z zurück in einen durch Kommas getrennten String und speichern Sie ihn in $ o.
quelle
shelf.sh
nicht stattdessen Teil der Lösung sein? Zum Beispiel müssten Sierequire
bestimmte Pakete in Ruby oderimport
sie auch in Python verwenden, wenn Sie sie benötigen.import
PYG, wenn sie ein Python-Programm damit schreiben, oder Rebmu (AFAIK), wenn sie ein Rebol-Programm damitHaskell, 291
Ich war mir nicht sicher, wie flexibel das Eingabe- und Ausgabeformat für Zeichenfolgen war, und stellte daher sicher, dass es genau wie im Beispiel aussah (natürlich ohne Eingabeaufforderungen), aber das fügte eine Menge zusätzlicher Zeichen hinzu. Ideone-Link
quelle
PHP - 224
Nun, ich habe es versucht.
Eingabe in STDIN, zB:
quelle
Python3 (288)
Implementierung unter starkem Einsatz von ternären ifs.
Das Weglassen der offensichtlichen Eingabeprobleme und die Angabe der Richtungszeichenfolgen als Eigenwerte haben möglicherweise zu einer Verbesserung der Skriptgröße geführt. Der Ansatz hier ist jedoch vollkommen funktional (so glaube ich)
quelle
Python 3 (143)
http://ideone.com/wYvt7J
Wir verwenden den in Python integrierten komplexen Zahlentyp, um das Koordinatenpaar zu speichern. Die Richtung wird bestimmt , indem die imaginäre Einheit berechnet
1j
die Kraftd
, die die Richtung speichert 4. Rotierende mod erfolgt durch Inkrementieren oder Dekrementierend
. Der Ausdruck'ML'.find(c)
gibt den Betrag an, den wir ändern möchtend
:1
fürL
,0
fürM
und-1
(der Standardwert für nicht gefunden) fürR
.Python hat keine kurze Möglichkeit, eine komplexe Zahl in ein Tupel umzuwandeln, daher müssen wir teure Anrufe bei
.real
und tätigen.imag
.quelle