Ayo pindahkan bajak Mars!

17

Ringkasan

Tugasnya adalah menavigasi penjelajah Mars dan memberi tahu koordinat dan arah akhirnya.

Memasukkan:

Input pertama:

Pertama program Anda harus mengambil input yang akan berada dalam format berikut:

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

Arah harus: Natau Satau Eatau W(Mulai surat Utara, Selatan, Barat, Timur)

Contoh: 10,20,N(x = 10, y = 20, arah = N (Utara))

Input kedua:

Input kedua terdiri dari serangkaian R, L, Muntuk kanan, kiri dan bergerak masing-masing.

Untuk Rdan L(kanan dan kiri) arah rover harus berubah.

Untuk Mbajak harus bergerak 1 unit ke depan ke arah itu sebelum bergerak.

Aturan untuk menghitung koordinat:

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

Keluaran:

Koordinat akhir dan arah rover saat ini.


Contoh:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Koordinat dapat berupa bilangan bulat apa saja dan dapat negatif .

Semua celah standar tidak diizinkan. Jika memberikan demo di situs seperti http://ideone.com dll. Adalah mungkin, maka silakan lakukan, sehingga saya dapat memverifikasi :)

Ini adalah kontes popularitas, jadi jadilah kreatif!

Mengikuti saran orang lain, saya memutuskan untuk menjadikan ini .

Amit Joki
sumber
Apakah ada batasan untuk koordinat?
Teun Pronk
5
Ini mungkin lebih menarik sebagai golf kode daripada kontes popularitas . Bonus apa yang diberikan untuk penggunaan ideone?
Kyle Kanos
@KyleKanos Saya melihat orang menggunakannya, jadi baru saja digunakan. Diulang ulang;)
Amit Joki
6
Anda tahu, jika Anda mengalami umpan balik negatif pada tantangan Anda, coba jalankan melalui kotak pasir terlebih dahulu.
Martin Ender
1
@Terima kasih. Dinyatakan secara eksplisit.
Amit Joki

Jawaban:

7

Ruby ≥ 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]]*?,

Solusi ini dapat diuji di sini: https://ideone.com/C4PLdE

Perhatikan bahwa solusi yang ditautkan pada ideone lebih panjang satu karakter ( 1.idaripada 1idi baris 3). Alasannya adalah karena ideone hanya mendukung Ruby 1.9, yang tidak memungkinkan sintaksis pendek untuk literal kompleks.

Ventero
sumber
menunggu untuk melihatnya golf lebih lanjut :)
Amit Joki
Anda dapat mengganti x,y,i=eval"[#{gets}]"dengan eval"x,y,i="+getsuntuk menyimpan beberapa karakter.
Berlangsung
@voidpigeon: Saya tidak yakin bahwa benar-benar bekerja karena eval's aturan scoping: ruby -e 'eval"x=1";p x'melemparkan NameErroruntuk xdi p x. Itu berfungsi ketika menggunakan konstanta ( eval"X,Y,I="+gets), tetapi karena saya memodifikasi i, ini akan membutuhkan tambahan i=Iuntuk mencegah peringatan tentang mendefinisikan ulang konstanta. Tetapi mungkin kita berbicara tentang versi Ruby yang berbeda?
Ventero
1
@Ventero Anda benar. Saya mengujinya di irb dan itu memberi saya array yang tepat sebagai keluaran jadi saya menganggap itu berfungsi. Saya sangat suka pendekatan eval.
Berlangsung
@voidpigeon Ah, Anda benar sedang, yang benar-benar memungkinkan optimasi yang sedikit berbeda: x,y,i=eval"*a="+gets. Terima kasih!
Ventero
5

Javascript ( ES6 ) 145 141 127

Sunting: Menghapus kebutuhan akan array terjemahan menggunakan metode dari solusi 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]])

Tidak Terkumpul / Berkomentar:

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
sumber
kamu bisa melakukan ini?! [a, b, c] = x.split (...)
edc65
1
@ edc65 Yup! Penugasan Destrukturisasi
nderscore
Lihatlah jawaban C saya. mungkin array g tidak diperlukan
edc65
3

Jawa - 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]);}}

Dengan spasi putih:

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]);
    }
}

Seperti biasa dengan Java, sekitar setengahnya hanya mem-parsing input dan membentuk output. Logikanya cukup mudah.

Geobit
sumber
3

Javascript (E6) 175

Edit Fixed bug, mungkin di luar kisaran nilai pengembalian untuk 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()))

Dasar tidak diserang

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
}

Uji Tes di konsol javascript di Firefox. Lebih mudah untuk menguji fungsi F menghindari popup.

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

Keluaran

[ 2, 4, "N" ]
edc65
sumber
Bagus, ini sangat mirip dengan solusi saya.
nderscore
3

C 164 180 186

Edit format input Tetap dan hapus strchr.
Edit array offset yang dihapus, hitung menggunakan bit

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]);}

Tidak disatukan

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
sumber
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],"");}

Tweak solusi @ edc65 untuk menggunakan pendekatan penyalahgunaan nilai ASCII saya.

Secara khusus:

  • d%8%5memetakan karakter masing ENWS- 0,1,2,3masing
  • c%23berubah Lmenjadi 7, Mmenjadi 8dan Rmenjadi 13. Karena d(variabel arah) selalu digunakan mod 4, ini secara efektif membuat Ladd -1 mod 4, Mtambahkan 0 mod 4, dan Rtambahkan 1 mod 4.
  • d&1adalah 1 untuk NSdan 0 untuk EWarah.
  • d&2adalah 2 untuk WSdan 0 untuk NEarah.
  • ~-(d&2)adalah 1 untuk WSdan -1 untuk NEarah.
  • c%2adalah 1 untuk Mdan 0 untuk LR.
nneonneo
sumber
Mengapa 23, dan apac%(2*(1-(d&2)))
@tolos: Menambahkan beberapa penjelasan. Juga disingkat 2 karakter :)
nneonneo
2

Python 3 (dengan grafis turtle), 251 199 byte

Pythonista yang bijak, mohon bersikap lembut, karena ini adalah upaya pertama saya untuk sebuah program yang ditulis dalam bahasa Anda.

Turtles on Mars!

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)])

Tantangan ini memetakan secara alami ke grafis gaya penyu logo, yang python memiliki impor, tentu saja.

Membaca input dari dua baris dari STDIN.

Keluaran:

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

Apa yang saya terutama sukai tentang program ini adalah sebenarnya menampilkan jalur rover. Menambahkanexitonclick() ke akhir program sehingga output grafis berlanjut hingga pengguna mengklik:

masukkan deskripsi gambar di sini

Saya cukup yakin ini bisa bermain golf lebih signifikan - ada saran! Saya membuat CW ini, karena saya berharap masyarakat dapat bermain golf lagi.

Perubahan:

  • s sekarang daftar, sebaris.
  • Terner digunakan untuk tubuh for for loop.
  • Inline n, menghapus irisan yang tidak perlu.
  • Menghapus ruang yang tidak perlu dalam pernyataan impor.
  • Menghapus string impor untuk menggunakan metode string bawaan
  • Beralih ke Python 3 untuk mempersingkat raw_input
DigitalTrauma
sumber
@isaacg Terima kasih - golf yang bagus!
Digital Trauma
2

GolfScript, 116 98 88 84 71 71

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

Ini harus mendapatkan koordinat dan instruksi sebagai argumen dengan cara berikut:1 2 'N' 'MRMLM' . Argumen dibuat menjadi string dan didorong ke stack.

Jika Anda ingin menguji ini secara daring, buka skrip web golf dan rekatkan titik koma yang diikuti dengan string dengan argumen (misalnya ;"1 2 'N' 'MRMLM'") sebelum kode ( di sini tautan dengan contoh).

Contoh output:

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


Usaha Saya Sebelumnya

84 karakter:

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

88 karakter:

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

98 karakter:

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

116 karakter:

[~])\~"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=
pengguna3700847
sumber
btw: versi lama dari posting disimpan sehingga Anda dapat melihat bagaimana mereka berada di masa lalu (cukup klik pada tautan "Diedit xxx yang lalu")
masterX244
1

Delphi (819)

Ketika saya mulai itu bukan . Akan diedit nanti.

Tidak dapat menemukan kompiler 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.

Tidak disatukan

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
sumber
mungkin ideone dan opsinya adalah Pascal?
Amit Joki
4
"Ketika saya mulai, itu belum kode-golf." Apakah itu alasan Anda untuk coding di Delphi? ;)
Martin Ender
Ada apa dengan ruang di sekitar =? Mengapa mereka dibutuhkan? Juga, nama-nama variabel tampak terlalu lama bagi saya
John Dvorak
@ m.buettner ssshh, jangan menumpahkan kacang: P
Teun Pronk
@JanDvorak Seperti yang saya katakan, itu tidak ditandai sebagai kode-golf
Teun Pronk
1

Javascript (353)

Ini adalah upaya nyata pertama saya di kode golf, tampaknya paling tidak berhasil!

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
sumber
5
Saya bisa melihat nama variabel panjang yang tidak perlu;). Juga, dalam kode golf tidak ada yang peduli tentang pelingkupan variabel yang tepat, jadi jatuhkan var itu.
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))

Pasti ada cara yang lebih elegan untuk melakukan ini juga, tidak perlu cabang setelah yang lain.

http://ideone.com/eD0FwD

Masukannya buruk, saya ingin melakukannya split(',') tetapi menemukan masalah casting antara int dan string. Idealnya saya juga ingin menambahkan posisi lama dengan posisi bergerak ... oh itu kode-golf sekarang. Oh well terserahlah, saya akan tinggalkan di sini, mungkin memberi inspirasi. Gagasan lain yang saya miliki menggunakan modulo 4 dari arah setelah memetakan bantalan awal ke indeks. Juga menggabungkan belokan dan memindahkan array ke satu karena tidak ada tombol yang bertabrakan.

Meski begitu, memperpendek nama variabel dan menghapus spasi itu 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
sumber
1

Python 2.7 - 197 192 byte

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]

Saya sebenarnya sangat bangga dengan yang ini.

Penjelasan

Pertama, mari kita bersihkan kekacauan ini. Saya menggunakan titik koma alih-alih jeda baris di banyak tempat karena saya pikir itu membuat saya keren. Ini biasanya (ini masih 197 byte, itu belum ungolfed sama sekali). Ya, masih ada tanda titik koma, tetapi yang sebenarnya menyimpan byte.

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]

Mari kita mulai!

q='NESW'

Pertama kita mendefinisikan qsebagai string 'NESW'. Kami menggunakannya dua kali kemudian, danlen("q='NESW';qq") < len("'NESW''NESW'") .

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

Di sini kita membagi baris pertama dari inpupt pada setiap koma. Koord x kami disimpan di x, y di y, dan huruf pertama dari arah kami did .

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

Kemudian kita hanya membuat ints coords. (Saya terkejut bahwa saya tidak bisa memikirkan cara yang lebih baik untuk mengubah dua string menjadi int. Saya mencobax,y=map(int,(x,y)) tetapi ternyata lebih lama.)

d=q.find(d)

Ini mengubah arah kami menjadi bilangan bulat. 0 di utara, 1 di timur, 2 di selatan dan 3 di barat.

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

Di sinilah kesenangan dimulai.

Ketika kita pergi ke utara, Y bertambah 1. Jadi kamus ini mengambil 0 dan memberikan string 'y+' , untuk "tambah y". Ini memberikan hasil yang serupa untuk arah lain: y atau x diikuti oleh + atau -.

Kami akan kembali ke sini.

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

Saya sudah pergi sedikit kebebasan untuk tidak mengasingkan yang satu ini.

Untuk setiap karakter pada input baris kedua, kami melakukan dua hal. Pertama, kita atur variabelnyam ke kamus apa pun dari sebelumnya memberi kita untuk arah kita saat ini. Tidak ada alasan kita membutuhkan ini terjadi setiap saat, tetapi itu lebih mudah daripada mewujudkannya ketika kita membutuhkannya.

Berikutnya, kami membuat daftar dengan tiga elemen: 'd+', 'd-', dan m. CATATAN EDITOR: Saya pikir saya bisa lolos dengan tidak menggunakan variabel msama sekali. Saya pikir saya bisa langsung memasukkannya ke v[d]dalam daftar. Itu akan menyelamatkan saya beberapa byte jika berhasil, tapi saya tidak ingin mengujinya sampai saya selesai penjelasan ini sehingga kalian semua bisa berurusan.(Yap, itu berhasil.)

Kami mencari karakter input saat ini di string 'RL'. str.findmengembalikan -1 jika tidak menemukan karakter, jadi ini mengubah R ke 0, L ke 1 dan apa pun ke -1. Tentu saja, satu-satunya input lain yang dapat kita miliki adalah M, tetapi lebih sedikit karakter untuk membuatnya bekerja untuk semuanya.

Kami menggunakan nomor itu sebagai indeks untuk daftar yang kami buat. Indeks daftar python dimulai pada akhirnya jika negatif, jadi kita mendapatkan elemen pertama jika inputnya adalah R, yang kedua jika itu adalah L, dan yang terakhir jika itu adalah M. Demi kenyamanan, saya akan berasumsi bahwa kita menghadap ke utara, tetapi prinsip serupa berlaku untuk arah lain.

Nilai-nilai yang mungkin kami kerjakan adalah 'd+'untuk R, 'd-'untuk L dan 'y+'untuk M. Kemudian, kami lampirkan '=1;d=d%4'di akhir masing-masing. Itu berarti kemungkinan nilai kami adalah ...

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

Itu kode python yang valid! Itu kode python valid yang melakukan persis apa yang ingin kita lakukan untuk masing-masing karakter input! (Bagian ini d=d%4membuat arahan kita tetap waras. Lagi-lagi, tidak perlu melakukannya setiap saat, tapi itu kurang karakter.)

Yang harus kita lakukan adalah mengeksekusi kode yang kita dapatkan untuk setiap karakter, mencetaknya (mengubah arah kita kembali ke string), dan kita selesai!

monmon bawah tanah
sumber
1

C - 350

Simpan sebagai 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;}

Menyusun:

gcc -o rover rover.c -lm

Contoh dijalankan:

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

Ideone

Tidak Terkumpul:

#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;
}

sumber
1

Haskell - 412 byte

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)

Diuji dengan:

$ printf "1,2,N\nMRMLM" | ./rv
Right (2,4,'N')
gxtaillon
sumber
Hah hah! Sangat menyenangkan melihat Haskell jauh di belakang paket, untuk perubahan: D
GreenAsJade
1
f=many digitBANYAK LOL - SUCH WOW
tomsmeding
Memisahkan input dan menggunakan readberkali-kali membutuhkan lebih banyak karakter daripada menggunakan parsec ...
gxtaillon
1

Bash + coreutils, 159 byte

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`

Input dibaca dari 2 baris STDIN.

Keluaran:

$ { echo 1,2,N; echo MRMLM; } | ./rover.sh
2,4,N
$
digital Trauma
sumber
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]

Tidak bisa bermain golf ini lebih jauh, yang agak memalukan. Tetapi semua peretasan yang jelas tidak benar-benar bekerja di sini.

Saya tidak bisa iex input karena a) N, S, Edan Wakan menjadi fungsi untuk itu untuk bekerja (atau saya akan perlu untuk awalan yang dengan $dan b) 1,2,Nharus menguraiN dalam modus ekspresi, tidak mampu untuk menjalankan perintah .

The switchtampaknya menjadi jalan terpendek melakukan gerakan. Tabel hash dengan blok skrip atau string tidak lebih pendek baik dan untuk setiap cara selain dariswitch aku punya overhead dari loop eksplisit.

Saya tidak bisa menyingkirkannya IndexOfkarena pipa dengan? lebih lama, masih.

Saya juga tidak bisa menghilangkan tipe eksplisit dalam deklarasi awal karena saya memiliki tipe campuran di sana, jadi sederhana |%{+$_} tidak membantu dan setiap opsi lainnya lebih panjang.

Terkadang saya benci penanganan input di PowerShell.

Joey
sumber
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])

Menyalahgunakan nilai ASCII dari L,M danR untuk menghindari penggunaan pernyataan bersyarat.

Cobalah di ideone .

nneonneo
sumber
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]

Hal-hal yang saya ubah dari aslinya:

Alias ​​raw_input, mengubah kamus v [d], yang seharusnya merupakan daftar, untuk beberapa pemilihan string, digunakan %=.

Sunting: menggunakan tuple unpacking dan eval (raw_input ()) == input () untuk menyimpan 21 karakter.

Sangat dipinjam dari @undergroundmonorail, tetapi dengan banyak perbaikan.

isaacg
sumber
Bagus! Saya sangat suka ini.
undergroundmonorail
0

Bash / SHELF ,243 235

" SHE akan pergi LF " adalah perpustakaan golf untuk Bash yang menyediakan beberapa alias berguna. Ini adalah jawaban yang valid karena perpustakaan ada dan ada di GitHub sebelum tantangan diposting.

Maaf, saya tidak bisa menjalankan ini pada ideone.

Bagaimana cara menjalankannya

Ini mengambil posisi awal (dipisahkan dengan koma seperti yang ditentukan; ini menambahkan banyak karakter ke kode) sebagai argumen pertama, dan instruksi pada input standar.

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

Output sampel

2,4,N

Kode

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

Penjelasan

dadalah untuk perbandingan; ia mengembalikan 0 jika dua argumennya sama dan 1 sebaliknya, maka ia dapat memiliki perintah lain yang dirangkai dengannya &&dan ||.

yseperti tr(tetapi dilakukan melalui sed).

Yseperti sed 's/.../.../g'untuk dua argumennya.

Padalah echo -e -n; phanya 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

Bit selanjutnya sangat jelek, dengan sekitar 145 karakter pada satu baris. Jika perintah saat ini adalah M, ubah koma dalam $ o menjadi spasi, konversikan ke array dan simpan ke $ z. Kemudian, lakukan sakelar ... blok kasus untuk elemen terakhir $ z (arah rover menunjuk. Ubah koordinat yang sesuai, lalu konversikan $ z kembali menjadi string yang dipisahkan koma dan simpan ke $ 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

sumber
1
Bukankah seharusnya sumber shelf.shmenjadi bagian dari solusi? Seperti Anda harus requirepaket tertentu di Ruby atau importmereka di Python juga jika Anda membutuhkannya.
Joey
@ Joey poin bagus, tapi saya tidak berpikir orang importPYG ketika menulis program Python dengannya, atau Rebmu (AFAIK) ketika menulis program Rebol dengannya
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

Saya tidak yakin seberapa fleksibel format string input dan output, jadi saya memastikan itu tampak persis seperti contohnya (minus petunjuknya, tentu saja), tetapi itu menambahkan banyak karakter tambahan. Tautan ideone

YawarRaza7349
sumber
0

PHP - 224

Yah, saya mencobanya.

$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)));

Masukan dalam STDIN, mis:

$ 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ý
sumber
0

Python3 (288)

Implementasi menggunakan penggunaan terner ifs yang berat.

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)

Menghilangkan omelan input yang jelas, memberikan nilai string intrinsik string arah mungkin telah menguntungkan ukuran skrip. Namun, pendekatan di sini sangat fungsional (jadi saya percaya)

idiot.py
sumber
Selamat datang di PPCG. Ini kode-golf, jadi jawaban terpendek menang. Anda bisa mulai dengan membuat nama variabel menjadi satu karakter.
Trauma Digital
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

Kami menggunakan tipe bilangan kompleks bawaan Python untuk menyimpan pasangan koordinat. Arah dihitung dengan mengambil unit imajiner 1jke kekuatan d, yang menyimpan arah mod 4. Rotasi dilakukan dengan menambah atau mengurangi d. Ekspresi 'ML'.find(c)memberikan jumlah yang ingin kita ubah d: 1untuk L, 0untuk M, dan-1 (default untuk tidak ditemukan) untuk R.

Python tidak memiliki cara pendek untuk mengubah bilangan kompleks menjadi tuple, jadi kita harus melakukan panggilan mahal ke .realdan .imag.

Tidak
sumber