Poruszajmy łazikiem Mars!

17

streszczenie

Zadaniem jest nawigacja łazikiem Mars i podanie jego ostatecznych współrzędnych i kierunku.

Wejście:

Pierwsze wejście:

Najpierw program musi pobrać dane wejściowe w następującym formacie:

[X-Coordinate],[Y-Coordinate],[Direction]

Kierunek musi być: Nlub Slub Elub W(litery początkowe z północy, południa, zachodu, wschodu)

Przykład: 10,20,N(x = 10, y = 20, kierunek = N (północ))

Drugie wejście:

Drugie wejście składa się z serii R, L, Mna prawo, w lewo i przejść odpowiednio.

Dla Ri L(prawo i lewo) kierunek łazika musi się odpowiednio zmienić.

Ponieważ Młazik musi ruszyć się o 1 jednostkę do przodu w kierunku, w którym był przed ruchem.

Zasady obliczania współrzędnych:

N = Y + 1
E = X + 1
S = Y - 1
W = X - 1

Wynik:

Ostateczne współrzędne i aktualny kierunek łazika.


Przykład:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Współrzędne mogą być dowolnymi liczbami całkowitymi i mogą być ujemne .

Wszystkie standardowe luki są niedozwolone. Jeśli możliwe jest udostępnienie wersji demo na stronach takich jak http://ideone.com itp., Zrób to, abym mógł zweryfikować :)

To konkurs popularności, więc bądź kreatywny!

Podążając za radami innych, postanawiam uczynić z tego .

Amit Joki
źródło
Czy są ograniczenia współrzędnych?
Teun Pronk
5
Może to być bardziej interesujące jako konkurs golfa zamiast konkursu popularności . Jaki rodzaj bonusu przysługuje za użycie ideonu?
Kyle Kanos
@KyleKanos Widziałem ludzi, którzy go używali, więc po prostu użyłem. Przeredagowano;)
Amit Joki
6
Wiesz, jeśli masz negatywne opinie na temat swoich wyzwań, spróbuj je najpierw uruchomić w piaskownicy .
Martin Ender
1
@Geobits dzięki. Podane jednoznacznie.
Amit Joki,

Odpowiedzi:

7

Rubinowy ≥ 2,0, 101

E,N,W,S=*0..3
x,y,i=eval"a="+gets
gets.bytes{|c|x+=c%2*1i**i=i+1-c&3}
$><<[(x+y.i).rect,"NWSE"[i]]*?,

To rozwiązanie można przetestować tutaj: https://ideone.com/C4PLdE

Zauważ, że rozwiązanie połączone na ideone jest o jeden znak dłuższe ( 1.izamiast 1iw linii 3). Powodem tego jest to, że ideone obsługuje tylko Ruby 1.9, co nie pozwala na składnię skrótów dla złożonych literałów.

Ventero
źródło
czekam, aby zobaczyć dalej golfa :)
Amit Joki
Możesz zamienić x,y,i=eval"[#{gets}]"się eval"x,y,i="+getszapisać jakieś znaki.
obrzydliwy
@voidpigeon: Nie jestem pewien, czy to faktycznie działa ze względu na evalzasady określania zakresu: ruby -e 'eval"x=1";p x'rzuca NameErrorza xna p x. Działa, gdy używa się stałych ( eval"X,Y,I="+gets), ale ponieważ modyfikuję i, wymagałoby to dodatkowych, i=Iaby zapobiec ostrzeżeniom o ponownym zdefiniowaniu stałej. Ale może mówimy o różnych wersjach Ruby?
Ventero,
1
@Ventero Masz rację. Przetestowałem to w IRB i dało mi odpowiednią tablicę jako wynik, więc założyłem, że działa. Jednak naprawdę podoba mi się podejście eval.
obrzydliwy
@voidpigeon Ach, masz rację, że faktycznie pozwala nieco inny optymalizacji: x,y,i=eval"*a="+gets. Dzięki!
Ventero,
5

JavaScript ( ES6 ) 145 141 127

Edycja: Usunięto potrzebę stosowania tablicy translacji przy użyciu metody z rozwiązania C edc65

[x,y,d]=(p=prompt)(s='NESW').split(','),[...p(d=s.search(d))].map(c=>c!='M'?(d+=c>'M'||3,d%=4):d%2?x-=d-2:y-=d-1),p([x,y,s[d]])

Niegolfowane / komentowane:

s='NESW' // initialize variable for direction mapping
[x,y,d]=prompt().split(',') // get first input, split by commas, map to variables x,y,d
d=s.search(d) // get numeric value for direction
[...prompt()].map(c=> // get second input, map a function to every character in it
    c!='M'? // if char is not M
        (d+=c>'M'||3, // increment d by 1 if char greater than M, otherwise 3 
         d%=4) // modulo by 4 to wrap direction
    : // else
        d%2? // if odd direction
            x-=d-2 // move x position
        : // else
            y-=d-1 // move y position
)
prompt([x,y,s[d]]) // output result
nderscore
źródło
możesz to zrobić?! [a, b, c] = x.split (...)
edc65
1
@ edc65 Tak! Zadanie destrukcyjne
nderscore
Spójrz na moją odpowiedź C. może tablica g nie jest potrzebna
edc65
3

Java - 327

class R{public static void main(String[]a){char c,e=a[2].charAt(0),z[]={78,69,83,87};Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){c=a[3].charAt(i++);if(c==77){x=d==1?x+1:d>2?x-1:x;y=d<1?y+1:d==2?y+1:y;}}System.out.print(x+","+y+","+z[d]);}}

Z białymi znakami:

class R{
    public static void main(String[]a){
        char c,e=a[2].charAt(0),z[]={78,69,83,87};
        Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;
        for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){
            c=a[3].charAt(i++);
            if(c==77){
                x=d==1?x+1:d>2?x-1:x;
                y=d<1?y+1:d==2?y+1:y;
            }
        }
        System.out.print(x+","+y+","+z[d]);
    }
}

Jak zwykle w Javie, około połowa z nich to tylko analiza danych wejściowych i formowanie danych wyjściowych. Logika jest dość prosta.

Geobity
źródło
3

JavaScript (E6) 175

Edytować Naprawiono błąd, być może poza wartością zwracaną dla d

139 Logika, 36 I / O

F=(x,y,d,m,D='NESW')=>(d=D.search(d),[...m].map(s=>({M:_=>(y-=[-1,0,1,0][d],x-=[0,-1,0,1][d]),R:_=>d+=1,L:_=>d+=3}[s](),d%=4)),[x,y,D[d]]);
p=prompt,p(F(...p().split(','),p()))

Podstawowe bez golfa

function F(x,y,d,m) // In golf code use arrow sintax instead of 'function'
{
  var D='NESW';
  d = D.search(d); // map from letters to offset position 0..3
  var driver = { // driver object, each function map one of  command letters M,R,L
    M: function() { 
      y -= [-1, 0, 1, 0][d]; // subtract to be sure to have a numeric and not string result 
      x -= [0, -1, 0, 1][d]; // subtract to be sure to have a numeric and not string result 
    },
    R: function() {
       d += 1;
    },
    L: function() {
       d += 3; // with modulo 4 will be like -= 1
    }
  }
  m = [...m]; // string to array, to use iteration function 
  m.forEach(  // array scan, in golf versione use map do nearly the same and is shorter
    function (s) {
      driver[s](); // call driver function
      d = d % 4;   // restrict value to modulo 4
    }
  );  // in golf version, use comma separated expression to avoid 'return'
  return [x,y, D[d]] // return last status
}

Test Test w konsoli javascript w przeglądarce Firefox. Łatwiej jest przetestować funkcję F, unikając wyskakujących okienek.

F(1,2,'N','MRMLM')

Wynik

[ 2, 4, "N" ]
edc65
źródło
Fajnie, to wygląda bardzo podobnie do mojego rozwiązania.
nderscore
3

C 164 180 186

Edytuj Naprawiono format wejściowy i usunięto strchr
Edytuj Usunięto tablicę przesunięć, obliczono za pomocą bitów

p,x,y;main(){char c,d,l[100];scanf("%d,%d,%c%s",&x,&y,&d,l);for(d=d<83?d&1:d>>2&1|2;c=l[p++];d&=3)c-77?d+=c+1:d&1?x+=d-2:(y+=1-d);printf("%d %d %c",x,y,"NESW"[d]);}

Nie golfił

p, x, y;
main()
{
  char c, d, l[100];
  scanf("%d,%d,%c%s",&x,&y,&d,l);
  for (d = d<'S'?d&1:d>>2&1|2; c = l[p++]; d &= 3)
    c-'M'
    ? d += c+1
    : d & 1 ? x+=d-2 : (y+=1-d);
  printf("%d %d %c", x, y, "NESW"[d]);
} 
/*
M 77
R 82 0101 0010 R&3+1==3
L 76 0100 1100 L&3+1==1 
*/
edc65
źródło
2

C, 148 150 151

p,x[2];main(){char c,d,l[99],*j="%d,%d,%c%s";scanf(j,x,x+1,&d,l);for(d=d%8%5;c=l[p++];d-=c%23)x[d&1]-=c%2*~-(d&2);printf(j,*x,x[1],"ENWS"[d&3],"");}

Ulepszenie rozwiązania @ edc65, które wykorzystuje moje podejście do nadużywania wartości ASCII.

Konkretnie:

  • d%8%5odwzorowuje znaki ENWSdo 0,1,2,3odpowiednio
  • c%23zamienia się Lw 7, Mw 8i Rw 13. Ponieważ d(zmienna kierunkowa) jest zawsze używana mod 4, to skutecznie powoduje Ldodanie -1 mod 4, Mdodanie 0 mod 4 i Rdodanie 1 mod 4.
  • d&1wynosi 1 dla NSi 0 dlaEW kierunków.
  • d&2wynosi 2 dla, WSa 0 dla NEkierunków.
  • ~-(d&2)wynosi 1 dla WSi -1 dla NEkierunków.
  • c%2wynosi 1 dla Mi 0 dla LR.
nneonneo
źródło
Dlaczego 23 i czym jestc%(2*(1-(d&2)))
@tolos: Dodano wyjaśnienie. Skrócone także o 2 znaki :)
nneonneo
2

Python 3 (z grafiką żółwia), 251 199 bajtów

Mądrzy pythoniści, proszę, bądźcie delikatni, ponieważ jest to moja pierwsza w historii próba programu napisanego w waszym pięknym języku.

Żółwie na Marsie!

from turtle import*
p="NESW"
mode("logo")
x,y,d=input().split(',')
setx(int(x))
sety(int(y))
seth(p.find(d)*90)
for c in input():fd(1)if c=="M"else[lt,rt][c>'L'](90)
print(pos(),p[int(heading()/90)])

Wyzwanie to całkiem naturalnie odwzorowuje grafikę żółwia w stylu logo, dla której Python ma oczywiście import.

Odczytuje dane wejściowe z dwóch wierszy ze STDIN.

Wynik:

$ { echo 1,2,N; echo MRMLM; } | python ./rover.py 
(2.00,4.00) N
$ 

W tym programie szczególnie podoba mi się to, że faktycznie pokazuje graficznie ścieżkę łazika. Dodaj exitonclick()na końcu programu, aby wyjście graficzne było wyświetlane, dopóki użytkownik nie kliknie:

enter image description here

Jestem prawie pewien, że można znacznie bardziej zagrać w golfa - wszelkie sugestie są mile widziane! Robię to CW, ponieważ mam nadzieję, że społeczność może jeszcze trochę zagrać w golfa.

Zmiany:

  • s jest teraz wstawioną listą.
  • Używany trójskładnikowy dla treści pętli for.
  • Wstawiony n, usunięty niepotrzebny plasterek.
  • Usunięto niepotrzebne miejsce w instrukcji importu.
  • Usunięto ciąg importu, aby użyć wbudowanej metody ciągu
  • Przełączono na Python 3, aby skrócić raw_input
DigitalTrauma
źródło
@isaacg Thanks - nice golfing!
Cyfrowa trauma
2

GolfScript, 116 98 88 84 71

~'NESW':^@?:&;{4%[{&(4%:&;}{&[{)}{\)\}{(}{\(\}]=~}{&)4%:&;}]=~}/]`&^1/=

To powinno uzyskać współrzędne oraz instrukcji jako argumenty w następujący sposób: 1 2 'N' 'MRMLM'. Argumenty są przekształcane w ciąg i są wypychane na stos.

Jeśli chcesz to przetestować online, przejdź do web golfscript i wklej średnik, a następnie ciąg znaków z argumentami (np. ;"1 2 'N' 'MRMLM'") Przed kodem ( tutaj link z przykładem).

Przykłady wyników:

1 2 'N' 'MRMLM'                    -> [2 4]N  
5 6 'E' 'MMLMRMRRMMML'             -> [5 7]S
1 2 'N' 'MMMMRLMRLMMRMRMLMRMRMMRM' -> [1 8]N


Moje poprzednie próby

84 znaków:

~:i;'NESW':k\?:d;{i(\:i;4%[{d(4%:d;}{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}]=~i}do]`d k 1/=

88 znaków:

~:i;'NESW':k\?:d;{i(\:i;'MRL'?[{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}{d(4%:d;}]=~i}do]`d k 1/=

98 znaków:

 ~1/:i;:d;{'NESW'd?}:k;{k[{)}{\)\}{(}{\(\}]=~}:M;{k'ESWN'1/=:d;}:R;{k'WNES'1/=:d;}:L;{i(\:i;~i}do d

116 znaków:

[~])\~"NESW":k 1/:d?{d(1/+:d;}:f*:y;:x;{("MRL"?[{k d 0=?[{y):y}{x):x}{y(:y}{x(:x}]=~;}{f}{d)1/\+:d;}]=~.}do x y d 0=
Tohanov
źródło
btw: stare wersje posta są przechowywane, dzięki czemu można zobaczyć, jak były w przeszłości (wystarczy kliknąć link „Edytowano xxx temu”)
masterX244
1

Delfy (819)

Kiedy zaczynałem, nie był to . Będzie edytować później.

Nie można jednak znaleźć kompilatora online.

uses SysUtils;type TDirection = (dNorth, dEast, dSouth, dWest);var x,y:int64;dir:TDirection;input:string;c:char;function gd(C:Char):TDirection;var o:integer;begin o:=ord(dir);if C='L'then o:=o-1else if c='R'then o:=o+1else if c='N'then exit(dNorth)else if c='E'then exit(dNorth)else if c='S'then exit(dNorth)else if c='W'then exit(dNorth);if o>3 then exit(dNorth);if o<0 then exit(dWest);exit(TDirection(o))end;function DirLetter:string;begin if dir=dNorth then exit('N');if dir=dEast then exit('E');if dir=dSouth then exit('S');if dir=dWest then exit('W');end;begin Readln(x,y,input);dir := gd(Input[1]);readln(Input);Input:=UpperCase(Input);for C in Input do begin if C<>'M' then dir:=gd(C)else case dir of dNorth:y:=y+1;dEast:x:=x+1;dSouth:y:=y-1;dWest:x:=x-1;end;end;writeln(Format('%d,%d,%s',[x,y,DirLetter]));end.

Nie golfił

uses
  SysUtils;
type
  TDirection = (dNorth, dEast, dSouth, dWest);

var
  x,y:int64;
  dir:TDirection;
  input:string;
  c:char;

  function gd(C:Char):TDirection;
  var
    o:integer;
  begin
    o:=ord(dir);
    if C='L' then
      o:=o-1
    else if c='R' then
      o:=o+1
    else if c='N' then
      exit(dNorth)
    else if c='E' then
      exit(dNorth)
    else if c='S' then
      exit(dNorth)
    else if c='W' then
      exit(dNorth);

    if o>3 then exit(dNorth);
    if o<0 then exit(dWest);
    exit(TDirection(o))
  end;
  function DirLetter:string;
  begin
    if dir=dNorth then exit('N');
    if dir=dEast then exit('E');
    if dir=dSouth then exit('S');
    if dir=dWest then exit('W');
  end;
begin
  Readln(x,y,input);
  dir := gd(Input[1]);
  readln(Input);
  Input:=UpperCase(Input);
  for C in Input do
  begin
    if C<>'M' then
      dir:=gd(C)
    else
      case dir of
        dNorth:y:=y+1;
        dEast:x:=x+1;
        dSouth:y:=y-1;
        dWest:x:=x-1;
      end;
  end;
  writeln(Format('%d,%d,%s',[x,y,DirLetter]));
end.
Teun Pronk
źródło
może być ideone, a opcja to Pascal?
Amit Joki,
4
„Kiedy zaczynałem, nie był to jeszcze kod-golf”. Czy to twoja wymówka do kodowania w Delphi? ;)
Martin Ender
Co słychać w przestrzeniach wokół =? Dlaczego są potrzebne? Także nazwy zmiennych wydają mi się zbyt długie
John Dvorak,
@ m.buettner ssshh, nie rozlewaj fasoli: P
Teun Pronk
@JanDvorak Tak jak powiedziałem, nie było oznaczone jako golf-code
Teun Pronk
1

JavaScript (353)

To moja pierwsza prawdziwa próba gry w golfa, wydaje się, że przynajmniej działa!

var xx=[0,1,0,-1];var yy=[1,0,-1,0];var d=["N","E","S","W"];var e=0;var x,y=0;function sa(p){q=p.split(",");x=+q[0];y=+q[1];e=+d.indexOf(q[2]);}function sb(t){var g=t.split(",");for(var u=0;u<g.length;u++){if(g[u]=='R'){e++;if(e>3)e=0;}if(g[u]=='L'){e--;if(e<0)e=3;}if(g[u]=='M'){x+=+xx[e];y+=+yy[e];}}alert(x+","+y+","+d[e]);}sa(prompt());sb(prompt());
James Hunt
źródło
5
Widzę niepotrzebnie długie nazwy zmiennych;). Ponadto w golfowym kodzie nikt nie dba o prawidłowe ustawianie zakresu zmiennych, więc porzuć te var .
Martin Ender
1

Python (263)

input =  raw_input("Initial: ")
input2 = raw_input("Command: ")

position = [int(input[0]), int(input[2]), input[4]]

bearings = "NESW"
turns = {"L" : -1, "M": 0, "R" : 1}
move = {"N" : [0, 1], "E" : [1, 0], "S" : [0, -1], "W" : [-1, 0]}

for c in input2:
    turn = turns[c];
    if (turn == 0):
        position[0] += move[position[2]][0]
        position[1] += move[position[2]][1]
    else:
        position[2] = bearings[(bearings.index(position[2]) + turn)%4]

print "Output: ", ','.join((str(s) for s in position))

Musi być też bardziej elegancki sposób, aby nie potrzebować gałęzi po drugiej.

http://ideone.com/eD0FwD

Dane wejściowe są okropne, chciałem to zrobić, split(',')ale natknąłem się na problemy z rzutowaniem między ints a stringami. Idealnie chciałbym również dodać starą pozycję z pozycją ruchomą ... och, to jest teraz golf golfowy. No cóż, zostawię to tutaj, może dać inspirację. Inne pomysły, które miałem, wykorzystywały moduł 4 kierunku po zmapowaniu początkowego namiaru na indeks. Również łączenie tur i przenoszenie tablic na jeden, ponieważ żaden z klawiszy nie koliduje.

mimo to skracanie nazw zmiennych i usuwanie spacji to 263:

i=raw_input()
j=raw_input()
p=[int(i[0]),int(i[2]),i[4]]
b="NESW"
m={"N":[0,1],"E":[1,0],"S":[0,-1],"W":[-1,0],"L":-1,"M":0,"R":1}
for c in j:
    if (m[c]==0):
        p[0]+=m[p[2]][0]
        p[1]+=m[p[2]][1]
    p[2] = b[(b.index(p[2])+m[c])%4]
print ','.join(str(s) for s in p)
Mardoxx
źródło
1

Python 2.7 - 197 192 bajty

q='NESW';x,y,d=raw_input().split(',');x=int(x);y=int(y);d=q.find(d);v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():exec['d+','d-',v[d]]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

Jestem z tego bardzo dumny.

Wyjaśnienie

Najpierw posprzątajmy ten bałagan. W wielu miejscach używałem średników zamiast łamania linii, ponieważ myślę, że to sprawia, że ​​jestem fajny. Tutaj jest normalnie (wciąż jest to 197 bajtów, wcale nie zostało odkryte). Tak, nadal jest średnik, ale ten faktycznie oszczędza bajt.

q='NESW'
x,y,d=raw_input().split(',')
x=int(x)
y=int(y)
d=q.find(d)
v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():m=v[d];exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

Zaczynajmy!

q='NESW'

Najpierw definiujemy qjako ciąg 'NESW'. Używamy go dwa razy później i len("q='NESW';qq") < len("'NESW''NESW'").

x,y,d=raw_input().split(',')

Tutaj dzielimy pierwszą linię inpupt na każdym przecinku. Nasza współrzędna x jest przechowywana w x, y yi pierwsza litera naszego kierunku w d.

x=int(x)
y=int(y)

Następnie wykonujemy tylko integry. (Byłem zszokowany, że nie mogłem wymyślić lepszego sposobu na konwersję dwóch ciągów znaków na int. Próbowałem, x,y=map(int,(x,y))ale okazało się, że jest dłuższy).

d=q.find(d)

Konwertuje to nasz kierunek na liczbę całkowitą. 0 to północ, 1 to wschód, 2 to południe, a 3 to zachód.

v={0:'y+',1:'x+',2:'y-',3:'x-'}

Tu zaczyna się zabawa.

Kiedy jedziemy na północ, Y wzrasta o 1. Tak więc słownik przyjmuje 0 i podaje ciąg znaków 'y+' , dla „wzrost y”. Daje podobne wyniki dla innych kierunków: y lub x, po których następuje + lub -.

Wrócimy do tego.

for c in raw_input():
    m=v[d]
    exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'

Pozwoliłem sobie nieco na odhaczanie tego.

Dla każdego znaku w drugim wierszu wprowadzania robimy dwie rzeczy. Najpierw ustawiamy zmiennąm na cokolwiek, co nasz słownik dawał nam dla naszego obecnego kierunku. Nie ma żadnego powodu, dla którego powinniśmy to robić za każdym razem, ale jest to łatwiejsze niż sprawienie, aby stało się to, kiedy jest to potrzebne.

Następnie tworzymy listę z trzech elementów: 'd+', 'd-', i m. UWAGA REDAKTORA: Myślę, że mogę w ogóle uniknąć używania zmiennej m. Myślę, że mogę po prostu bezpośrednio umieścić v[d]na liście. Pozwoli mi to zaoszczędzić kilka bajtów, jeśli zadziała, ale nie mam ochoty go testować, dopóki nie skończę tego wyjaśnienia, abyście mogli sobie poradzić.(Tak, zadziałało.)

Szukamy bieżącego znaku wejścia w ciągu „RL”. str.findzwraca -1, jeśli nie znajdzie znaku, więc konwertuje R na 0, L na 1 i cokolwiek innego na -1. Oczywiście, jedyne inne dane wejściowe, jakie możemy mieć, to M, ale jest mniej znaków, aby działał na wszystko.

Używamy tego numeru jako indeksu dla utworzonej przez nas listy. Wskaźniki listy w języku Python zaczynają się na końcu, jeśli są ujemne, więc otrzymujemy pierwszy element, jeśli dane wejściowe to R, drugi jeśli to L, a ostatni jeśli to M. Dla wygody, zamierzam założyć, że zwrócimy się na północ, ale podobna zasada obowiązuje w innych kierunkach.

Możliwe wartości, z którymi pracujemy, to 'd+'R, 'd-'L i 'y+'M. Następnie dołączamy '=1;d=d%4'na końcu każdego z nich. Oznacza to, że naszymi możliwymi wartościami są ...

d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4

To jest poprawny kod Pythona! To prawidłowy kod python, który robi dokładnie to, co chcemy zrobić dla każdego z tych znaków wejściowych! (Ta d=d%4część po prostu podtrzymuje nasze wskazówki. Ponownie, nie musisz tego robić za każdym razem, ale jest mniej postaci.)

Wszystko, co musimy zrobić, to wykonać kod, który otrzymujemy dla każdego znaku, wydrukować go (konwertując nasz kierunek z powrotem na ciąg znaków) i gotowe!

podziemny monorail
źródło
1

C - 350

Zapisz jako rover.c:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){char c,*C="NWSE-WN";float x,y,d,k=M_PI/2;scanf("%f,%f,%c",&x,&y,&c);d=(strchr(C,c)-C)*k;do{switch(getchar()){case'R':d+=k;break;case'L':d-=k;break;case'M':x+=sin(d);y+=cos(d);break;case EOF:printf("%g,%g,%c\n",x,y,C[(int)(sin(d)+2*cos(d)+4.5)]);}}while(!feof(stdin));return 0;}

Skompilować:

gcc -o rover rover.c -lm

Przykładowy przebieg:

$ echo 1,2,N MRMLM | ./rover
2,4,N

Ideone

Nie golfowany:

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    /* String is used for input and output, pi/2 == 90 degrees */
    char c, *C = "NWSE-WN";
    float x, y, d, k = M_PI/2;

    /* Get starting parameters */
    scanf("%f,%f,%c", &x, &y, &c);

    /* Convert the direction NWSE into radians */
    d = (strchr(C, c) - C) * k;

    /* Process each character */
    do
    {
        /* Recognize R(ight), L(eft), M(ove) or EOF */
        switch (getchar())
        {
            case 'R':
                /* Turn right 90 degrees */
                d += k;
                break;

            case 'L':
                /* Turn left 90 degrees */
                d -= k;
                break;

            case 'M':
                /* Advance 1 unit in the direction specified */
                x += sin(d);
                y += cos(d);
                break;

            case EOF:
                /* Output - formula is specially crafted so that S,E,W,N
                    map to indices 2,3,5,6 to reuse part of string */
                printf("%g,%g,%c\n", x, y, C[(int)(sin(d) + 2*cos(d) + 4.5)]);
        }
    }
    while (!feof(stdin));

    return 0;
}

źródło
1

Haskell - 412 bajtów

import Text.Parsec
import Text.Parsec.String
n='N'
s='S'
e='E'
w='W'
d(x,y,c)'M'|c==n=(x,y+1,c)|c==s=(x,y-1,c)|c==e=(x+1,y,c)|c==w=(x-1,y,c)
d(x,y,c)e=(x,y,i c e)
i 'N''R'=e
i 'N''L'=w
i 'S''R'=w
i 'S''L'=e
i 'E''R'=s
i 'E''L'=n
i 'W''R'=n
i 'W''L'=s
f=many digit
g=char ','
o=oneOf
main=interact(\s->show$parse(do x<-f;g;y<-f;g;c<-o"NSEW";newline;b<-many$o"MRL";return$foldl(\x c->d x c)(read x,read y,c)b)""s)

Testowane z:

$ printf "1,2,N\nMRMLM" | ./rv
Right (2,4,'N')
gxtaillon
źródło
Hah hah! Wspaniale jest zobaczyć Haskella jak dotąd za plecami, dla odmiany: D
GreenAsJade
1
f=many digitDUŻO LOL - TAKIE WOW
tomsmeding
Podział danych wejściowych i readwielokrotne użycie zajęło więcej znaków niż użycie parsec ...
gxtaillon
1

Bash + coreutils, 159 bajtów

t()(tr $2 0-3 $1<<<$d)
IFS=, read x y d
d=`t '' NESW`
for s in `fold -1`;{
[ $s = M ]&&((`t yxyx;t ++-`=1))||d=$[(d`tr LR -+<<<$s`1+4)%4]
}
echo $x,$y,`t NESW`

Dane wejściowe są odczytywane z 2 wierszy STDIN.

Wynik:

$ { echo 1,2,N; echo MRMLM; } | ./rover.sh
2,4,N
$
Cyfrowa trauma
źródło
1

PowerShell, 170 167 166

[int]$x,[int]$y,$e,$m="$input"-split'\W'
$d='NESW'.indexof($e)
switch([char[]]$m){'R'{$d++}'L'{$d--}'M'{iex(-split'$y++ $x++ $y-- $x--')[$d%4]}}
"$x,$y,"+'NESW'[$d%4]

Nie wydaje mi się, aby dalej grać w golfa, co jest nieco zawstydzające. Ale wszystkie oczywiste włamania tak naprawdę tu nie działają.

Nie mogę iexwejście ponieważ a) N, S, EiW musiałby być funkcje, które do pracy (albo będę musiał prefiksu że z $ib) 1,2,Nmusiałby analizować Nw trybie ekspresji, nie będąc w stanie uruchomić polecenie .

switchWydaje się być najkrótsza droga robi się ruch. Tabela skrótów z blokami skryptów lub ciągami znaków nie jest krótsza i na każdy inny sposób, poza tym switch, że mam narzut jawnej pętli.

Nie mogę się tego pozbyć IndexOf ponieważ rurociąg z ?jest jeszcze dłuższy.

Nie mogę również pozbyć się jawnych typów w początkowej deklaracji, ponieważ mam tam mieszane typy, więc proste |%{+$_}nie pomaga, a każda inna opcja jest dłuższa.

Czasami nienawidzę obsługi danych wejściowych w PowerShell.

Joey
źródło
1

Python, 135 137 138

S,W,N,E=0,1,2,3;a,b,d=input();v=[b,a]
for c in map(ord,raw_input()):d+=c%23;v[d&1]+=c%2*~-(d&2)
print'%d,%d,%s'%(v[1],v[0],'SWNE'[d&3])

Nadużycia wartości ASCII L, MaR aby uniknąć używania żadnych instrukcji warunkowych.

Wypróbuj w ideone .

nneonneo
źródło
1

Python 2.7, 170 149

N,E,S,W=q='NESW'
x,y,d=input()
d=q.find(d)
for c in raw_input():exec['d+','d-','yx'[d%2]+'+-'[d/2]]['RL'.find(c)]+'=1;d%=4'
print`x`+','+`y`+','+q[d]

Rzeczy, które zmieniłem od oryginału:

Alias ​​raw_input, zmieniono słownik v [d], który i tak powinien być listą, na wybór ciągów znaków, zastosowano %= .

Edycja: używane rozpakowywanie krotek i eval (raw_input ()) == input (), aby zapisać 21 znaków.

Mocno zapożyczony z @undergroundmonorail, ale z wieloma ulepszeniami.

isaacg
źródło
Ładny! Lubię to bardzo.
undergroundmonorail
0

Bash / SHELF ,243 235

SHE ll go LF ” to biblioteka golfowa dla Bash, która zawiera kilka przydatnych aliasów. To poprawna odpowiedź, ponieważ biblioteka istniała i była na GitHub przed opublikowaniem wyzwania.

Przepraszam, nie mogę tego zrobić z ideonem.

Jak biegać

To zajmuje pozycję początkową (oddzieloną przecinkami, jak określono; dodaje to wiele znaków do kodu) jako pierwszy argument i instrukcje na standardowym wejściu.

source shelf.sh #you must load SHELF first
source rover.sh 1,2,N<<<MRMLM #now run the script via source so it has access to SHELF

Próbka wyjściowa

2,4,N

Kod

o=$1
D(){ o=`y NESW $1<<<$o`;}
for x in `Y . '& '`;{
d $x R&&D ESWN
d $x L&&D WNES
d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
}
p $o

Wyjaśnienie

djest dla porównania; zwraca 0, jeśli jego dwa argumenty są równe, a 1 w przeciwnym razie, może mieć powiązane z nim inne polecenia za pomocą &&i ||.

yjest jak tr(ale wykonane sed).

Yprzypomina sed 's/.../.../g'dwa argumenty.

Pjest echo -e -n; pjest po prostu echo -e.

o=$1 #save first argument to variable
D(){ o=`y NESW $1<<<$o`;} #define an alias to turn R or L
for x in `Y . '& '`;{ #add a space after every character on stdin and loop for each one
d $x R&&D ESWN #turn R using alias
d $x L&&D WNES #turn L using alias

Następny kawałek jest głęboko brzydki, z około 145 znakami w jednej linii. Jeśli bieżącym poleceniem jest M, zamień przecinki w $ o na spacje, przekonwertuj na tablicę i zapisz w $ z. Następnie wykonaj blok skrzynki przełączników dla ostatniego elementu $ z (kierunek, w którym wskazuje łazik. Zmień odpowiednio współrzędne, a następnie zamień $ z powrotem na ciąg oddzielony przecinkami i zapisz na $ o.

d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
} #end loop
p $o #print output

źródło
1
Czy pozyskiwanie nie powinno shelf.shbyć częścią rozwiązania? Podobnie jak w przypadku requireniektórych pakietów w Ruby lub importw Pythonie, jeśli ich potrzebujesz.
Joey,
@Joey dobra uwaga, ale nie sądzę, że ludzie importPYG piszą z nim program Python lub Rebmu (AFAIK) pisząc z nim program
0

Haskell, 291

data D=W|S|E|N deriving(Show,Read,Enum)
main=interact$(\(x,y)->tail$map show y++[show(toEnum x::D)]>>=(',':)).(\(a:b:_)->foldl(\(f,j@[g,h])i->case i of 'M'->(f,[g+rem(f-1)2,h+rem(f-2)2]);'L'->(mod(f+1)4,j);'R'->(mod(f-1)4,j))((\(c,d,e)->(fromEnum(e::D),[c::Int,d]))$read('(':a++")"))b).lines

Nie byłem pewien, jak elastyczny jest format ciągu wejściowego i wyjściowego, więc upewniłem się, że wygląda dokładnie tak, jak w przykładzie (oczywiście bez podpowiedzi), ale dodało to wiele dodatkowych znaków. Link Ideone

YawarRaza7349
źródło
0

PHP - 224

Cóż, spróbowałem.

$n=explode(",",$argv[1]);$d=($e=$n[2])==W?0:($e==N?1:($e==E?2:3));for(;$i<strlen($n[3]);)if(($o=$n[3][$i++])==M)$n[$d%2]+=$d>1?-1:1;else$d=$o==R?($d+1)%4:($d==0?3:$d-1);echo"{$n[0]},{$n[1]},".($d==1?N:($d==2?E:($d==3?S:W)));

Wprowadź w STDIN, np .:

$ php mars_rover.php 1,2,N,MMMRRRRRMM
-1,5,E
$ php mars_rover.php 1,2,N,MMMMRLMRLMMRMRMLMRMRMMRM
1,8,N
$ php mars_rover.php 3,-2,W,MMMMLM
7,-3,S
Aurel Bílý
źródło
0

Python3 (288)

Implementacja przy użyciu intensywnego użycia trójskładnikowych ifs.

m=['N','E','S','W']
cords=[int(n) for n in input().split()] + [input()] #Convert first inputs to integers and retrieve third
for n in input(): #Get instructions
    if n=='M':
        i=[1,0][cords[2] in m[1:3]] #See if vertical or horizontal
        j=[-1,1][cords[2] in m[0:2]] #See if negative or positive
        cords[i]+=j
    else:
        i=[-1,1][n=='R'] #Translate turn to numerals
        cords[2]=m[m.index(cords[2])+i] #Change direction relative to current orientation
print(cords)

Pominięcie oczywistych pomruków wejściowych, podanie ciągów kierunkowych wartości wewnętrznych mogło mieć korzystny wpływ na rozmiar skryptu. Jednak podejście tutaj jest całkowicie funkcjonalne (tak sądzę)

idiot.py
źródło
Witamy w PPCG. To jest golf golfowy, więc wygrywa najkrótsza odpowiedź. Możesz zacząć od nadania nazwom zmiennych jednego znaku.
Cyfrowa trauma
0

Python 3 (143)

I=input
a,b,D=I().split(',')
w='ENWS'
d=w.find(D)
x=int(a)+int(b)*1j
for c in I():x+=(c=='M')*1j**d;d+='ML'.find(c)
print(x.real,x.imag,w[d%4])

http://ideone.com/wYvt7J

Używamy wbudowanego typu liczb zespolonych Pythona do przechowywania pary współrzędnych. Kierunek jest obliczany przez doprowadzenie wyimaginowanej jednostki 1jdo mocy d, która przechowuje kierunek mod 4. Obracanie odbywa się poprzez zwiększanie lub zmniejszanie d. Wyrażenie 'ML'.find(c)określa kwotę, którą chcemy zmienić d: 1dla L, 0dlaM i -1(domyślnie nie znaleziono) dla R.

Python nie ma krótkiego sposobu na konwersję liczby zespolonej na krotkę, dlatego musimy wykonywać kosztowne połączenia z .real i .imag.

xnor
źródło