Hãy di chuyển sao Hỏa!


17

Tóm lược

Nhiệm vụ là điều hướng rover sao Hỏa và cho biết tọa độ và hướng cuối cùng của nó.

Đầu vào:

Đầu vào đầu tiên:

Đầu tiên chương trình của bạn phải lấy đầu vào sẽ ở định dạng sau:

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

Sự chỉ đạo phải: Nhoặc Shoặc Ehoặc W(Bắt đầu từ chữ Bắc, Nam, Tây, Đông)

Ví dụ: 10,20,N(x = 10, y = 20, direction = N (Bắc))

Đầu vào thứ hai:

Các đầu vào thứ hai bao gồm hàng loạt các R, L, Mcho phải, trái và di chuyển tương ứng.

Đối với RL(phải và trái) hướng di chuyển phải thay đổi tương ứng.

Đối với động Mcơ phải di chuyển về phía trước 1 đơn vị theo hướng trước khi di chuyển.

Quy tắc tính tọa độ:

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

Đầu ra:

Các tọa độ cuối cùng và hướng hiện tại của rover.


Thí dụ:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Các tọa độ có thể là bất kỳ số nguyên và có thể âm .

Tất cả các sơ hở tiêu chuẩn không được phép. Nếu có thể cung cấp bản demo trên các trang web như http://ideone.com, v.v., vui lòng làm như vậy để tôi có thể xác minh :)

Đây là một cuộc thi phổ biến vì vậy hãy sáng tạo!

Theo lời khuyên của người khác, tôi quyết định biến nó thành một .


Có giới hạn cho tọa độ không?
Teun Pronk

5
Điều này có thể thú vị hơn khi chơi golf mã thay vì thi đấu phổ biến . Những loại tiền thưởng được trao cho việc sử dụng ideone?
Kyle Kanos

@KyleKanos Tôi thấy mọi người sử dụng nó, nên mới sử dụng. Đọc lại nó;)
Amit Joki

6
Bạn biết đấy, nếu bạn gặp phải phản hồi tiêu cực về những thách thức của mình, trước tiên hãy thử chạy chúng qua hộp cát .
Martin Ender

1
@Geobits cảm ơn. Nói rõ ràng.
Amit Joki

Câu trả lời:


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

Giải pháp này có thể được thử nghiệm tại đây: https://ideone.com/C4PLdE

Lưu ý rằng giải pháp được liên kết trên ideone dài hơn một ký tự ( 1.ithay vì 1itrong dòng 3). Lý do cho điều này là ideone chỉ hỗ trợ Ruby 1.9, không cho phép cú pháp ngắn cho các chữ phức tạp.


chờ đợi để xem nó chơi gôn hơn :)
Amit Joki

Bạn có thể thay thế x,y,i=eval"[#{gets}]"bằng eval"x,y,i="+getsđể tiết kiệm một số ký tự.
afuous

@voidpigeon: Tôi không chắc chắn rằng thực sự hoạt động do evalquy tắc Phạm vi 's: ruby -e 'eval"x=1";p x'ném một NameErrorcho xp x. Nó hoạt động khi sử dụng hằng ( eval"X,Y,I="+gets), nhưng vì tôi sửa đổi i, điều này sẽ yêu cầu bổ sung i=Iđể ngăn cảnh báo về việc xác định lại hằng số. Nhưng có lẽ chúng ta đang nói về các phiên bản Ruby khác nhau?
Ventero

1
@Ventero Bạn nói đúng. Tôi đã thử nghiệm nó trong irb và nó đã cho tôi mảng thích hợp làm đầu ra nên tôi cho rằng nó hoạt động. Tôi thực sự thích cách tiếp cận eval mặc dù.
afuous

@voidpigeon Ah, bạn nói đúng, điều đó thực sự cho phép tối ưu hóa một chút khác biệt : x,y,i=eval"*a="+gets. Cảm ơn!
Ventero

5

Javascript ( ES6 ) 145 141 127

Chỉnh sửa: Đã xóa nhu cầu về mảng dịch bằng phương thức từ giải pháp C của 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]])

Ungolfed / Bình luận:

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

bạn có thể làm được việc này?! [a, b, c] = x.split (...)
edc65


Có một cái nhìn vào câu trả lời C của tôi. có lẽ mảng g không cần thiết
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]);}}

Với khoảng trắng:

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

Như thường lệ với Java, khoảng một nửa trong số này chỉ là phân tích cú pháp đầu vào và hình thành đầu ra. Logic khá đơn giản.


3

Javascript (E6) 175

Chỉnh sửa lỗi đã sửa , có thể nằm ngoài phạm vi giá trị trả về cho d

139 Logic, 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()))

Vô căn bản

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
}

Kiểm tra thử nghiệm trong bảng điều khiển javascript trong Firefox. Thật đơn giản để kiểm tra chức năng F tránh các cửa sổ bật lên.

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

Đầu ra

[ 2, 4, "N" ]

Đẹp, điều này trông rất giống giải pháp của tôi.
nderscore

3

C 164 180 186

Chỉnh sửa Định dạng đầu vào cố định và strchr bị xóa
Chỉnh sửa mảng bù đã xóa, sử dụng 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]);}

Bị đánh cắp

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 
*/

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

Một tinh chỉnh giải pháp của @ edc65 để sử dụng phương pháp lạm dụng giá trị ASCII của tôi.

Đặc biệt:

  • d%8%5bản đồ các nhân vật ENWSđể 0,1,2,3tương ứng
  • c%23biến Lthành 7, Mthành 8Rthành 13. Vì d(biến hướng) luôn được sử dụng mod 4, điều này thực sự làm cho Lthêm -1 mod 4, Mthêm 0 mod 4 và Rthêm 1 mod 4.
  • d&1là 1 cho NSvà 0 cho EWchỉ đường.
  • d&2là 2 cho WSvà 0 cho NEchỉ đường.
  • ~-(d&2)là 1 cho WSvà -1 cho NEchỉ đường.
  • c%2là 1 cho Mvà 0 cho LR.

Tại sao lại là 23 và là gìc%(2*(1-(d&2)))

@tolos: Đã thêm một số lời giải thích. Đồng thời rút ngắn 2 ký tự :)
nneonneo

2

Python 3 (với đồ họa rùa), 251 199 byte

Pythonistas khôn ngoan, xin hãy nhẹ nhàng, vì đây là lần thử đầu tiên của tôi tại một chương trình được viết bằng ngôn ngữ tốt của bạn.

Rùa trên sao Hỏa!

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

Thử thách này ánh xạ khá tự nhiên vào đồ họa rùa theo phong cách logo, mà trăn có nhập khẩu, tất nhiên.

Đọc đầu vào từ hai dòng từ STDIN.

Đầu ra:

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

Điều tôi đặc biệt thích về chương trình này là nó thực sự hiển thị bằng đồ họa đường dẫn của người đi bộ. Thêm exitonclick()vào cuối chương trình để đầu ra đồ họa vẫn tồn tại cho đến khi người dùng nhấp:

nhập mô tả hình ảnh ở đây

Tôi khá chắc chắn rằng điều này có thể được chơi golf nhiều hơn đáng kể - bất kỳ đề xuất nào đều được chào đón! Tôi đang thực hiện CW này, vì tôi hy vọng cộng đồng có thể đánh gôn thêm.

Thay đổi:

  • s bây giờ là một danh sách, nội tuyến.
  • Sử dụng ternary cho cơ thể của vòng lặp.
  • In nghiêng n, loại bỏ lát không cần thiết.
  • Loại bỏ không gian không cần thiết trong báo cáo nhập khẩu.
  • Đã xóa chuỗi nhập để sử dụng phương thức chuỗi dựng sẵn
  • Đã chuyển sang Python 3 để rút ngắn raw_input

@isaacg Cảm ơn - chơi golf đẹp!
Chấn thương kỹ thuật số

2

GolfScript, 116 98 88 84 71

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

Điều này sẽ nhận được tọa độ và các hướng dẫn như các đối số theo cách sau : 1 2 'N' 'MRMLM'. Các đối số được tạo thành một chuỗi và được đẩy vào ngăn xếp.

Nếu bạn muốn kiểm tra trực tuyến này, hãy truy cập web golfcript và dán dấu chấm phẩy theo sau bằng một chuỗi với các đối số (ví dụ ;"1 2 'N' 'MRMLM'") trước mã ( đây là một liên kết với một ví dụ).

Ví dụ về đầu ra:

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


Những nỗ lực trước đây của tôi

84 ký tự:

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

88 ký tự:

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

98 ký tự:

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

116 ký tự:

[~])\~"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=

btw: các phiên bản cũ của bài đăng được lưu trữ để bạn có thể thấy chúng đã như thế nào trong quá khứ (chỉ cần nhấp vào liên kết "Đã chỉnh sửa xxx trước")
masterX244

1

Delphi (819)

Khi tôi bắt đầu, nó chưa phải . Sẽ chỉnh sửa sau.

Không thể tìm thấy một trình biên dịch trực tuyến mặc dù.

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.

Bị đánh cắp

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.

có thể là ideone và tùy chọn là Pascal?
Amit Joki

4
"Khi tôi bắt đầu, nó chưa phải là môn đánh gôn." Đó có phải là lý do của bạn để mã hóa trong Delphi? ;)
Martin Ender

Có chuyện gì với không gian xung quanh =? Tại sao họ cần? Ngoài ra, các tên biến có vẻ quá dài đối với tôi
John Dvorak

@ m.buettner ssshh, đừng làm đổ đậu: P
Teun Pronk

@JanDvorak Như tôi đã nói, nó không được gắn thẻ là môn đánh gôn
Teun Pronk

1

Javascript (353)

Đây là nỗ lực thực sự đầu tiên của tôi tại mã golf, dường như hoạt động ít nhất!

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

5
Tôi có thể thấy tên biến dài không cần thiết;). Ngoài ra, trong golf mã không ai quan tâm đến phạm vi biến thích hợp, vì vậy hãy bỏ những var s đó.
Martin Ender

1

Con trăn (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))

Cũng phải có một cách thanh lịch hơn để làm điều này, nó không cần chi nhánh khác.

http://ideone.com/eD0FwD

Đầu vào là khủng khiếp, tôi muốn làm điều đó với split(',') nhưng đã gặp phải các vấn đề truyền giữa int và chuỗi. Lý tưởng nhất là tôi cũng muốn thêm vị trí cũ với vị trí di chuyển ... ồ bây giờ là môn đánh gôn. Ồ, dù gì đi nữa, tôi sẽ để nó ở đây, có thể truyền cảm hứng. Các ý tưởng khác tôi đã sử dụng modulo 4 của hướng sau khi ánh xạ ổ trục ban đầu đến một chỉ mục. Đồng thời hợp nhất các lượt và di chuyển các mảng thành một vì không có phím nào va chạm.

ngay cả như vậy, rút ​​ngắn tên biến và xóa khoảng trắng, đó là 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)

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]

Tôi thực sự siêu tự hào về điều này.

Giải trình

Đầu tiên, hãy dọn dẹp mớ hỗn độn này. Tôi đã sử dụng dấu chấm phẩy thay vì ngắt dòng ở nhiều nơi vì tôi nghĩ nó làm tôi mát mẻ. Ở đây là bình thường (đây vẫn là 197 byte, nó hoàn toàn không được xử lý). Vâng, vẫn còn một dấu chấm phẩy, nhưng cái đó thực sự tiết kiệm một 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]

Hãy bắt đầu nào!

q='NESW'

Đầu tiên chúng ta định nghĩa qlà chuỗi 'NESW'. Chúng tôi sử dụng nó hai lần sau đó, và len("q='NESW';qq") < len("'NESW''NESW'").

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

Ở đây chúng tôi chia dòng đầu tiên của mỗi dấu phẩy ở mỗi dấu phẩy. Tọa độ x của chúng tôi được lưu trữ trong x, y trong yvà chữ cái đầu tiên của hướng của chúng tôi trong d.

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

Sau đó, chúng tôi chỉ làm cho các coords ints. (Tôi đã bị sốc khi tôi không thể nghĩ ra cách nào tốt hơn để chuyển đổi hai chuỗi thành int. Tôi đã thử x,y=map(int,(x,y))nhưng hóa ra là dài hơn.)

d=q.find(d)

Điều này chuyển đổi hướng của chúng tôi thành một số nguyên. 0 là hướng bắc, 1 là hướng đông, 2 là hướng nam và 3 là hướng tây.

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

Đây là nơi niềm vui bắt đầu.

Khi chúng ta đi lên phía bắc, Y tăng thêm 1. Vì vậy, từ điển này lấy 0 và đưa ra chuỗi 'y+', cho "tăng y". Nó cho kết quả tương tự cho các hướng khác: y hoặc x theo sau là + hoặc -.

Chúng tôi sẽ trở lại với điều này.

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

Tôi đã đi đến tự do của việc vô ý hóa điều này một chút.

Đối với mỗi ký tự trong dòng đầu vào thứ hai, chúng tôi làm hai việc. Đầu tiên, chúng tôi đặt biến mthành bất cứ từ điển nào từ trước cho chúng tôi hướng đi hiện tại. Không có lý do gì chúng ta cần điều này xảy ra mọi lúc, nhưng nó dễ hơn là làm cho nó xảy ra khi chúng ta cần nó.

Tiếp theo, chúng ta tạo ra một danh sách với ba yếu tố: 'd+', 'd-', và m. LƯU Ý CỦA EDITOR: Tôi nghĩ rằng tôi có thể thoát khỏi việc không sử dụng biến m. Tôi nghĩ rằng tôi chỉ có thể đưa v[d]vào danh sách trực tiếp. Điều đó sẽ tiết kiệm cho tôi một vài byte nếu nó hoạt động, nhưng tôi không muốn thử nghiệm nó cho đến khi tôi thực hiện giải thích này để bạn có thể giải quyết. (Đúng, nó đã hoạt động.)

Chúng tôi tìm ký tự hiện tại của đầu vào trong chuỗi 'RL'. str.findtrả về -1 nếu nó không tìm thấy ký tự, vì vậy, điều này chuyển đổi R thành 0, L thành 1 và bất cứ điều gì khác thành -1. Tất nhiên, đầu vào duy nhất khác mà chúng ta có thể có là M, nhưng nó ít ký tự hơn để làm cho nó hoạt động cho mọi thứ.

Chúng tôi sử dụng số đó làm chỉ mục cho danh sách chúng tôi đã tạo. Các chỉ số danh sách Python bắt đầu ở cuối nếu chúng âm tính, vì vậy chúng tôi nhận được phần tử đầu tiên nếu đầu vào là R, thứ hai nếu là L và cuối cùng nếu đó là M. Để thuận tiện, tôi sẽ giả định rằng chúng ta đang hướng về phía bắc, nhưng một nguyên tắc tương tự được áp dụng cho các hướng khác.

Các giá trị có thể chúng tôi làm việc là 'd+'cho R, 'd-'cho L và 'y+'cho M. Sau đó, chúng tôi đính kèm '=1;d=d%4'vào cuối của mỗi giá trị. Điều đó có nghĩa là các giá trị có thể của chúng tôi là ...

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

Đó là mã trăn hợp lệ! Đó là mã python hợp lệ thực hiện chính xác những gì chúng ta muốn làm cho mỗi ký tự đầu vào đó! (Phần này d=d%4chỉ giữ cho hướng đi của chúng ta lành mạnh. Một lần nữa, không cần phải làm điều đó mỗi lần, nhưng đó là ít ký tự hơn.)

Tất cả những gì chúng ta phải làm là thực thi mã chúng ta nhận được cho mỗi ký tự, in nó ra (chuyển hướng của chúng ta trở lại thành một chuỗi) và chúng ta đã hoàn thành!


1

C - 350

Lưu dưới dạng 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;}

Biên dịch:

gcc -o rover rover.c -lm

Chạy mẫu:

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

Ý tưởng

Ung dung:

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

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)

Đã thử nghiệm với:

$ printf "1,2,N\nMRMLM" | ./rv
Right (2,4,'N')

Hah hah! Thật tuyệt khi thấy Haskell ở đằng sau gói, cho một sự thay đổi: D
GreenAsJade

1
f=many digitRẤT NHIỀU LOL -
SUCH

Việc tách đầu vào và sử dụng readnhiều lần cần nhiều ký tự hơn là sử dụng phân
tích cú pháp

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`

Đầu vào được đọc từ 2 dòng STDIN.

Đầu ra:

$ { echo 1,2,N; echo MRMLM; } | ./rover.sh
2,4,N
$

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]

Dường như không thể đánh golf này xuống hơn nữa, điều này hơi xấu hổ. Nhưng tất cả các hack rõ ràng không thực sự làm việc ở đây.

Tôi không thể iexđầu vào bởi vì a) N, S, EWsẽ phải được các chức năng cho rằng để làm việc (hoặc tôi cần phải tiền tố đó với $và b) 1,2,Nsẽ phải phân tích Ntrong chế độ biểu hiện, không thể chạy một lệnh .

Các switchdường như là con đường ngắn nhất làm phong trào. Bảng băm với các khối hoặc chuỗi tập lệnh cũng không ngắn hơn và đối với mọi cách khác ngoài việc switchtôi có phần trên của vòng lặp rõ ràng.

Tôi không thể thoát khỏi IndexOfvì một đường ống ?dài hơn, vẫn còn.

Tôi cũng không thể loại bỏ các loại rõ ràng trong khai báo ban đầu vì tôi có các loại hỗn hợp ở đó, vì vậy một cách đơn giản |%{+$_}không giúp ích và mọi tùy chọn khác đều dài hơn.

Đôi khi tôi ghét việc xử lý đầu vào trong PowerShell.


1

Con trăn, 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])

Lạm dụng các giá trị ASCII của L, MR để tránh sử dụng bất kỳ báo cáo có điều kiện.

Hãy thử nó trong ideone .


1

Con trăn 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]

Những điều tôi đã thay đổi từ bản gốc:

Aliased raw_input, đã thay đổi từ điển v [d], dù sao cũng phải là một danh sách, thành một số lựa chọn chuỗi, được sử dụng %=.

Chỉnh sửa: đã sử dụng bộ giải nén tuple và eval (raw_input ()) == input () để lưu 21 ký tự.

Mượn nhiều từ @undergroundmonorail, nhưng với rất nhiều cải tiến.


Đẹp! Tôi thích nó rất nhiều.
undergroundmonorail

0

Bash / CHIA SẺ ,243 235

" SHE ll go LF " là một thư viện chơi gôn cho Bash, nơi cung cấp một vài bí danh hữu ích. Đây là một câu trả lời hợp lệ khi thư viện tồn tại và đã có trên GitHub trước khi thử thách được đăng.

Xin lỗi, tôi không thể làm điều này để làm việc trên ideone.

Cách chạy

Điều này lấy vị trí ban đầu (được phân tách bằng dấu phẩy như được chỉ định; điều này thêm rất nhiều ký tự vào mã) làm đối số đầu tiên và hướng dẫn về đầu vào tiêu chuẩn.

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

Sản lượng mẫu

2,4,N

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

Giải trình

dlà để so sánh; nó trả về 0 nếu hai đối số của nó bằng nhau và 1 khác, sau đó nó có thể có các lệnh khác được nối với nó bằng &&||.

ygiống như tr(nhưng được thực hiện thông qua sed).

Ygiống như sed 's/.../.../g'cho hai đối số của nó.

Pecho -e -n; pchỉ là 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 tiếp theo là cực kỳ xấu xí, với khoảng 145 ký tự trên một dòng. Nếu lệnh hiện tại là M, hãy biến dấu phẩy trong $ o thành khoảng trắng, chuyển đổi thành mảng và lưu thành $ z. Sau đó, thực hiện chuyển đổi ... khối trường hợp cho phần tử cuối cùng của $ z (hướng của rover đang chỉ. Thay đổi tọa độ tương ứng, sau đó chuyển $ z trở lại thành chuỗi được phân tách bằng dấu phẩy và lưu thành $ 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

1
shelf.shThay vào đó, không nên tìm nguồn cung ứng là một phần của giải pháp? Giống như bạn phải có requiremột số gói nhất định trong Ruby hoặc importchúng trong Python nếu bạn cần chúng.
Joey

@ Có một điểm tốt, nhưng tôi không nghĩ mọi người importPYG khi viết chương trình Python với nó, hoặc Rebmu (AFAIK) khi viết chương trình Rebol với nó

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

Tôi không chắc định dạng chuỗi đầu vào và đầu ra linh hoạt đến mức nào, vì vậy tôi chắc chắn rằng nó trông giống hệt ví dụ (tất nhiên là trừ các lời nhắc), nhưng điều đó đã thêm rất nhiều ký tự phụ. Liên kết Ideone


0

PHP - 224

Vâng, tôi đã thử nó.

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

Đầu vào trong STDIN, ví dụ:

$ 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

0

Python3 (288)

Thực hiện bằng cách sử dụng nặng của ifs ternary.

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)

Bỏ qua các cằn nhằn đầu vào rõ ràng, đưa ra các chuỗi hướng giá trị nội tại có thể đã có lợi cho kích thước tập lệnh. Tuy nhiên, cách tiếp cận ở đây là hoàn hảo về chức năng (vì vậy tôi tin)


Chào mừng đến với PPCG. Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất sẽ thắng. Bạn có thể bắt đầu bằng cách làm cho tên biến của bạn dài một char.
Chấn thương kỹ thuật số

0

Con trăn 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

Chúng tôi sử dụng loại số phức tích hợp sẵn của Python để lưu trữ cặp tọa độ. Hướng được tính bằng cách lấy đơn vị tưởng tượng 1jcho sức mạnh của d, nơi lưu trữ hướng mod 4. Việc quay được thực hiện bằng cách tăng hoặc giảm d. Biểu thức 'ML'.find(c)đưa ra số tiền chúng tôi muốn thay đổi d: 1for L, 0for M-1(mặc định không tìm thấy) choR .

Python không có một cách ngắn để chuyển đổi một số phức thành một tuple, vì vậy chúng ta phải thực hiện các cuộc gọi tốn kém .real.imag.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.