มาขยับรถแลนด์โรเวอร์ดาวอังคารกันเถอะ!


17

สรุป

ภารกิจคือการนำทางยานสำรวจดาวอังคารและบอกพิกัดและทิศทางสุดท้าย

การป้อนข้อมูล:

อินพุตแรก:

ก่อนอื่นโปรแกรมของคุณจะต้องรับอินพุตซึ่งจะอยู่ในรูปแบบต่อไปนี้:

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

ทิศทางจะต้อง: NหรือSหรือEหรือW(ตัวอักษรเริ่มต้นของภาคเหนือ, ใต้, ตะวันตก, ตะวันออก)

ตัวอย่าง: 10,20,N(x = 10, y = 20, direction = N (North))

อินพุตที่สอง:

การป้อนข้อมูลที่สองประกอบด้วยชุดของR, L, Mสำหรับขวา, ซ้ายและย้ายตามลำดับ

สำหรับRและL(ขวาและซ้าย) ทิศทางของรถแลนด์โรเวอร์จะต้องเปลี่ยนตาม

สำหรับMรถแลนด์โรเวอร์จะต้องเคลื่อนที่ไปข้างหน้า 1 คันในทิศทางที่มันเคยเคลื่อนที่ก่อน

กฎสำหรับการคำนวณพิกัด:

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

เอาท์พุท:

พิกัดสุดท้ายและทิศทางปัจจุบันของรถแลนด์โรเวอร์


ตัวอย่าง:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

พิกัดสามารถเป็นจำนวนเต็มใดก็ได้และสามารถลบได้

ไม่อนุญาตช่องโหว่มาตรฐานทั้งหมด หากให้การสาธิตในเว็บไซต์เช่น http://ideone.comเป็นต้นโปรดทำเช่นนั้นเพื่อให้ฉันสามารถยืนยันได้ :)

นี่คือการประกวดความนิยมดังนั้นจงสร้างสรรค์!

ตามคำแนะนำของคนอื่นผมตัดสินใจที่จะทำนี้รหัสกอล์ฟ


มีการ จำกัด พิกัดหรือไม่
Teun Pronk

5
นี้อาจจะน่าสนใจมากขึ้นเป็นรหัสกอล์ฟแทนความนิยมประกวด โบนัสประเภทใดที่ได้รับจากการใช้งาน ideone?
Kyle Kanos

@ KyleKanos ฉันเห็นคนใช้มันดังนั้นก็เลยใช้ เปลี่ยนใหม่แล้ว)
Amit Joki

6
คุณรู้ไหมว่าหากคุณมีข้อเสนอแนะเชิงลบเกี่ยวกับความท้าทายของคุณลองใช้พวกเขาผ่านแซนด์บ็อกซ์ก่อน
Martin Ender

1
@Geobits ขอบคุณ ระบุไว้อย่างชัดเจน
Amit Joki

คำตอบ:


7

ทับทิม≥ 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]]*?,

วิธีการแก้ปัญหานี้สามารถทดสอบได้ที่นี่: https://ideone.com/C4PLdE

โปรดทราบว่าโซลูชันที่เชื่อมโยงกับ ideone นั้นมีความยาวมากกว่าหนึ่งตัวอักษร ( 1.iแทนที่จะเป็น1iในบรรทัดที่ 3) เหตุผลนี้คือ ideone สนับสนุน Ruby 1.9 เท่านั้นซึ่งไม่อนุญาตให้ใช้ไวยากรณ์แบบสั้นสำหรับตัวอักษรที่ซับซ้อน


รอดูกอล์ฟต่อไป :)
Amit Joki

คุณสามารถแทนที่x,y,i=eval"[#{gets}]"ด้วยeval"x,y,i="+getsเพื่อบันทึกตัวอักษรบางส่วน
ชัดเจน

@voidpigeon: ผมไม่แน่ใจว่าใช้งานได้จริงเนื่องจากevalกฎระเบียบกำหนดขอบเขต: ruby -e 'eval"x=1";p x'พ่นNameErrorสำหรับที่x p xมันจะทำงานเมื่อใช้ค่าคงที่ ( eval"X,Y,I="+gets) แต่เนื่องจากฉันแก้ไขiมันจะต้องมีการเพิ่มเติมi=Iเพื่อป้องกันการเตือนเกี่ยวกับการกำหนดค่าคงที่ใหม่ แต่บางทีเรากำลังพูดถึงทับทิมรุ่นต่าง ๆ ?
Ventero

1
@Ventero คุณพูดถูก ฉันทดสอบมันด้วย irb และมันให้อาเรย์ที่เหมาะสมกับฉันดังนั้นฉันจึงคิดว่ามันใช้ได้ ฉันชอบวิธีการที่เป็นจริงมาก
ชัดเจน

@voidpigeon Ah, x,y,i=eval"*a="+getsคุณสิทธิกำลังที่จริงจะช่วยให้การเพิ่มประสิทธิภาพที่แตกต่างกันเล็กน้อย ขอบคุณ!
Ventero

5

Javascript ( ES6 ) 145 141 127

แก้ไข:ลบความต้องการอาร์เรย์การแปลโดยใช้วิธีการจากโซลูชัน 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]])

Ungolfed / แสดงความคิดเห็น:

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

คุณสามารถทำสิ่งนี้ได้! [a, b, c] = x.split (... )
edc65

1
@ edc65 ใช่แล้ว! Destructuring Assignment
nderscore

ดูคำตอบ C ของฉัน อาจไม่จำเป็นต้องใช้อาร์เรย์ g
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]);}}

ด้วยช่องว่าง:

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

ตามปกติด้วย Java ประมาณครึ่งหนึ่งเป็นเพียงการแยกวิเคราะห์อินพุตและสร้างเอาต์พุต ตรรกะค่อนข้างตรงไปตรงมา


3

Javascript (E6) 175

แก้ไข ข้อผิดพลาดคงที่อาจจะอยู่นอกช่วงค่าตอบแทนสำหรับ 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()))

ขั้นพื้นฐานไม่ดี

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
}

ทดสอบ ทดสอบในคอนโซล javascript ใน Firefox ง่ายกว่าในการทดสอบฟังก์ชัน F ที่หลีกเลี่ยงป๊อปอัป

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

เอาท์พุต

[ 2, 4, "N" ]

ดีมากดูเหมือนโซลูชันของฉัน
nderscore

3

C 164 180 186

แก้ไขรูปแบบการป้อนข้อมูลคงที่และลบ strchr
แก้ไขลบอาร์เรย์ออฟเซตคำนวณโดยใช้บิต

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

Ungolfed

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

ปรับแต่งโซลูชันของ @ edc65 เพื่อใช้แนวทางการละเมิดค่า ASCII ของฉัน

โดยเฉพาะ:

  • d%8%5แผนที่ตัวละครENWSไป0,1,2,3ตามลำดับ
  • c%23ผลัดกันLเข้า7, Mเข้า8และRออกเป็น 13 เพราะd(ตัวแปรทิศทาง) ถูกนำมาใช้เสมอ 4 สมัยนี้ได้อย่างมีประสิทธิภาพทำให้Lเพิ่ม -1 4 สมัย, Mเพิ่ม 0 4 สมัยและRเพิ่ม 1 4 สมัย
  • d&1คือ 1 สำหรับNSและ 0 สำหรับEWเส้นทาง
  • d&2คือ 2 สำหรับWSและ 0 สำหรับNEเส้นทาง
  • ~-(d&2)คือ 1 สำหรับWSและ -1 สำหรับNEเส้นทาง
  • c%2คือ 1 Mและ LR0

ทำไม 23 และอะไรคือc%(2*(1-(d&2)))

@tolos: เพิ่มคำอธิบายบางอย่าง ย่อด้วย 2 ตัวอักษร :)
nneonneo

2

Python 3 (พร้อมกราฟิกเต่า) 251 199 ไบต์

หลามปรีชาญาณโปรดเป็นคนอ่อนโยนเพราะนี่เป็นครั้งแรกที่ฉันได้ลองใช้โปรแกรมที่เขียนด้วยภาษาดีของคุณ

เต่าบนดาวอังคาร!

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

ความท้าทายนี้แมปกับกราฟิกเต่าสไตล์โลโก้ค่อนข้างเป็นธรรมชาติซึ่ง python มีการนำเข้าแน่นอน

อ่านอินพุตจากสองบรรทัดจาก STDIN

เอาท์พุท:

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

สิ่งที่ฉันชอบเป็นพิเศษเกี่ยวกับโปรแกรมนี้คือมันแสดงเส้นทางของรถแลนด์โรเวอร์ เพิ่มexitonclick()ไปยังจุดสิ้นสุดของโปรแกรมเพื่อให้เอาต์พุตกราฟิกยังคงอยู่จนกว่าผู้ใช้จะคลิก:

enter image description here

ฉันค่อนข้างมั่นใจว่านี่สามารถเล่นกอล์ฟได้มากขึ้น - ยินดีรับคำแนะนำใด ๆ ! ฉันกำลังทำ CW นี้เพราะฉันหวังว่าชุมชนจะสามารถเล่นกอล์ฟได้อีก

การเปลี่ยนแปลง:

  • s ตอนนี้เป็นรายการ inlined
  • ternary ใช้สำหรับ body of for loop
  • Inlined n นำส่วนที่ไม่จำเป็นออก
  • ลบพื้นที่ที่ไม่จำเป็นในคำสั่งการนำเข้า
  • ลบสตริงการนำเข้าเพื่อใช้วิธีสตริงบิวอิน
  • เปลี่ยนเป็น Python 3 เพื่อตัดทอน raw_input ให้สั้นลง

@isaacg ขอบคุณ - กอล์ฟที่ดี!
บาดเจ็บทางระบบดิจิตอล

2

GolfScript, 116 98 88 84 71

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

นี่ควรจะได้พิกัดและคำแนะนำเป็นอาร์กิวเมนต์ด้วยวิธีต่อไปนี้:1 2 'N' 'MRMLM'นี้ควรจะได้รับพิกัดและคำแนะนำที่เป็นข้อโต้แย้งด้วยวิธีต่อไปนี้:ข้อโต้แย้งที่เกิดขึ้นเป็นสตริงและผลักเข้าไปในกอง

หากคุณต้องการทดสอบออนไลน์นี้ให้ไปที่เว็บ golfscriptแล้ววางเครื่องหมายอัฒภาคตามด้วยสตริงที่มีอาร์กิวเมนต์ (เช่น;"1 2 'N' 'MRMLM'") หน้ารหัส ( นี่คือลิงค์พร้อมตัวอย่าง)

ตัวอย่างของการส่งออก:

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


ความพยายามก่อนหน้าของฉัน

84 ตัวอักษร:

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

88 ตัวอักษร:

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

98 ตัวอักษร:

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

116 ตัวอักษร:

[~])\~"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: โพสต์เวอร์ชันเก่าถูกเก็บไว้เพื่อให้คุณเห็นว่าพวกเขาเป็นอย่างไรในอดีต (เพียงคลิกที่ลิงค์ "แก้ไข xxx ที่ผ่านมา")
masterX244

1

เดลฟาย (819)

เมื่อผมเริ่มมันก็ไม่ได้เลย จะแก้ไขในภายหลัง

ไม่พบคอมไพเลอร์ออนไลน์

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.

Ungolfed

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.

อาจเป็น ideone และตัวเลือกคือ Pascal?
Amit Joki

4
"เมื่อฉันเริ่มมันยังไม่ได้รหัส - กอล์ฟ" นั่นเป็นข้อแก้ตัวของคุณสำหรับการเข้ารหัสใน Delphi หรือไม่? ;)
Martin Ender

มีอะไรขึ้นกับช่องว่างรอบ ๆ=? ทำไมพวกเขาต้องการ? นอกจากนี้ชื่อตัวแปรดูเหมือนจะยาวเกินไปสำหรับฉัน
John Dvorak

@ m.buettner ssshh อย่าทำถั่วหก: P
Teun Pronk

@JanDvorak เช่นฉันว่ามันก็ไม่ได้ติดแท็กเป็นรหัสกอล์ฟ
Teun Pronk

1

Javascript (353)

นี่เป็นความพยายามครั้งแรกของฉันที่การตีกอล์ฟดูเหมือนว่าจะทำงานได้อย่างน้อย!

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
ฉันสามารถดูชื่อตัวแปรที่มีความยาวโดยไม่จำเป็น;) นอกจากนี้ในรหัสใส่ใจไม่มีใครกอล์ฟเกี่ยวกับการกำหนดขอบเขตตัวแปรที่เหมาะสมเพื่อให้ผู้วางvar s
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))

ต้องมีวิธีที่สง่างามกว่านี้ในการทำเช่นนี้มันไม่ต้องการสาขาหลังจากที่อื่น

http://ideone.com/eD0FwD

อินพุตนั้นแย่มากฉันต้องการทำมันด้วย split(',')แต่เจอปัญหาการคัดเลือกระหว่าง int และสตริง เป็นการดีที่ฉันต้องการเพิ่มตำแหน่งเดิมด้วยตำแหน่งการเคลื่อนที่ ... โอ้ตอนนี้มันเป็นรหัสกอล์ฟ อะไรก็ได้ที่ฉันจะทิ้งไว้ที่นี่อาจให้แรงบันดาลใจ แนวคิดอื่น ๆ ที่ฉันใช้ในโมดูโล 4 ของทิศทางหลังจากแมปแบริ่งเริ่มต้นกับดัชนี นอกจากนี้ยังรวมการหมุนและย้ายอาร์เรย์ไปยังหนึ่งเนื่องจากไม่มีคีย์ชนกัน

แม้กระนั้นการย่อชื่อตัวแปรและการลบช่องว่างก็เป็น 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 ไบต์

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]

อันที่จริงแล้วฉันภูมิใจในสิ่งนี้มาก

คำอธิบาย

ก่อนอื่นมาทำความสะอาดสิ่งนี้ ฉันใช้อัฒภาคแทนการแบ่งบรรทัดในหลาย ๆ ที่เพราะฉันคิดว่ามันทำให้ฉันเท่ห์ ที่นี่เป็นเรื่องปกติ (ยังคงเป็น 197 ไบต์มันไม่ได้ถูก ungolfed เลย) ใช่ยังคงมีเครื่องหมายอัฒภาค แต่อันที่จริงบันทึกไบต์

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]

เอาล่ะ!

q='NESW'

ครั้งแรกที่เรากำหนดเป็นสตริงq เราใช้มันสองครั้งต่อมาและ'NESW'len("q='NESW';qq") < len("'NESW''NESW'")

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

ที่นี่เราแบ่งบรรทัดแรกของการกระจายในแต่ละเครื่องหมายจุลภาค x COORD ของเราจะถูกเก็บไว้ในx, y ในและอักษรตัวแรกของเราในทิศทางyd

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

จากนั้นเราก็ทำให้ coords นั้นมีค่า (ฉันตกใจที่ฉันไม่สามารถคิดวิธีที่ดีกว่าในการแปลงสองสายเป็น ints ฉันพยายามx,y=map(int,(x,y))แต่มันกลับกลายเป็นอีกต่อไป)

d=q.find(d)

นี่จะเปลี่ยนทิศทางของเราเป็นจำนวนเต็ม 0 คือทิศเหนือ, 1 คือทิศตะวันออก, 2 คือทิศใต้และ 3 เป็นทิศตะวันตก

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

นี่คือที่ที่ความสนุกเริ่มต้นขึ้น

เมื่อเราไปทางทิศเหนือ, Y เพิ่มขึ้น 1 ดังนั้นพจนานุกรมนี้ใช้เวลา 0 และให้สตริง 'y+'สำหรับ "เพิ่ม y" มันให้ผลลัพธ์ที่คล้ายกันสำหรับทิศทางอื่น ๆ : y หรือ x ตามด้วย + หรือ -

เราจะกลับมาที่นี่

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

ฉันได้ไปเพื่อเสรีภาพของ ungolfing อันนี้เล็กน้อย

สำหรับอักขระแต่ละตัวในอินพุตบรรทัดที่สองเราทำสองสิ่ง ก่อนอื่นเราตั้งค่าตัวแปรmเป็นพจนานุกรมของเราจากก่อนหน้านี้ให้เราสำหรับทิศทางปัจจุบันของเรา ไม่มีเหตุผลที่เราต้องการสิ่งนี้เกิดขึ้นทุกครั้ง แต่มันง่ายกว่าที่จะทำให้มันเกิดขึ้นเมื่อเราต้องการ

ต่อไปเราจะสร้างรายการที่มีสามองค์ประกอบ: 'd+', และ'd-' หมายเหตุบรรณาธิการ:ฉันคิดว่าฉันสามารถหนีไปได้โดยไม่ใช้ตัวแปรเลย ฉันคิดว่าฉันสามารถใส่ในรายการโดยตรง นั่นจะช่วยฉันสักสองสามไบต์ถ้าใช้งานได้ แต่ฉันไม่รู้สึกอยากทดสอบจนกว่าฉันจะทำคำอธิบายนี้เพื่อให้คุณสามารถจัดการได้ (ใช่มันใช้งานได้)mmv[d]

เราค้นหาอักขระปัจจุบันของอินพุตในสตริง 'RL' str.findส่งกลับ -1 หากไม่พบอักขระดังนั้นการแปลง R เป็น 0, L เป็น 1 และสิ่งอื่นใดเพื่อ -1 แน่นอนอินพุตอื่น ๆ ที่เรามีได้คือ M แต่มีตัวอักษรน้อยกว่าเพื่อให้ใช้ได้กับทุกสิ่ง

เราใช้หมายเลขนั้นเป็นดัชนีสำหรับรายการที่เราสร้าง รายการ Python เริ่มต้นที่จุดสิ้นสุดหากพวกเขาเป็นลบดังนั้นเราจะได้องค์ประกอบแรกถ้าอินพุตคือ R, ที่สองถ้าเป็น L และสุดท้ายถ้าเป็น M เพื่อประโยชน์ของความสะดวกสบายฉันจะถือว่า เราหันหน้าไปทางทิศเหนือ แต่มีหลักการที่คล้ายกันสำหรับทิศทางอื่น

ค่าที่เป็นไปได้ที่เราทำงานด้วยคือ'd+'สำหรับ R 'd-'สำหรับ L และ'y+'M จากนั้นเรายึดติด'=1;d=d%4'กับจุดสิ้นสุดของแต่ละค่า นั่นหมายถึงค่าที่เป็นไปได้ของเราคือ ...

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

นั่นเป็นรหัสไพ ธ อนที่ถูกต้อง! นั่นเป็นรหัสไพ ธ อนที่ถูกต้องซึ่งทำในสิ่งที่เราต้องการจะทำสำหรับตัวอักขระอินพุตแต่ละตัว! ( d=d%4ส่วนหนึ่งเป็นเพียงการรักษาทิศทางของเรามีสติอีกครั้งไม่จำเป็นต้องทำทุกครั้ง แต่มันเป็นตัวละครน้อยลง)

สิ่งที่เราต้องทำคือรันโค้ดที่เราได้รับสำหรับตัวละครแต่ละตัวพิมพ์ออกมา (แปลงทิศทางของเรากลับไปเป็นสตริง) และเราก็ทำเสร็จแล้ว!


1

C - 350

บันทึกเป็น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;}

รวบรวม:

gcc -o rover rover.c -lm

วิ่งตัวอย่าง:

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

Ideone

Ungolfed:

#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 ไบต์

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)

ทดสอบกับ:

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

ฮ่า ๆ ๆ ! ดีที่ได้เห็น Haskell อยู่ด้านหลัง
กระเป๋า

1
f=many digitมาก ๆ - ดังกล่าวว้าว
tomsmeding

การแยกอินพุตและการใช้readหลายครั้งทำให้ตัวละครมากกว่าต้องใช้พาร์เซก ...
gxtaillon


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]

ดูเหมือนจะไม่สามารถลงเล่นกอล์ฟนี้ต่อไปได้ซึ่งเป็นเรื่องน่าอายเล็กน้อย แต่การแฮ็กที่ชัดเจนทั้งหมดไม่ได้ทำงานที่นี่จริงๆ

ฉันไม่สามารถiexป้อนข้อมูลเพราะ) N, S, EและWจะต้องมีฟังก์ชั่นสำหรับการทำงาน (หรือฉันจะต้องคำนำหน้าว่า$และ b) 1,2,Nจะต้องมีการแยกNในโหมดการแสดงออกไม่สามารถที่จะเรียกใช้คำสั่ง .

switchน่าจะเป็นทางที่สั้นที่สุดในการทำการเคลื่อนไหว ตารางแฮชที่มีบล็อกสคริปต์หรือสตริงไม่สั้นและอย่างอื่นนอกจากswitchฉันจะมีค่าใช้จ่ายในการวนรอบอย่างชัดเจน

ฉันไม่สามารถกำจัดIndexOfเพราะไปป์ไลน์ที่มีความ?ยาวยังคง

ฉันยังไม่สามารถกำจัดประเภทที่ชัดเจนในการประกาศครั้งแรกได้เพราะฉันมีประเภทที่หลากหลายดังนั้นง่าย |%{+$_}ก็ไม่ได้ช่วยและตัวเลือกอื่น ๆ จะยาวกว่า

บางครั้งฉันเกลียดการจัดการอินพุตใน PowerShell


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

ละเมิดสิทธิมนุษยชนของค่า ASCII L, MและRหลีกเลี่ยงการใช้งบเงื่อนไขใด ๆ

ลองในideone


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]

สิ่งที่ฉันเปลี่ยนไปจากเดิม:

raw_input aliased, การเปลี่ยนแปลงวี [D] พจนานุกรมซึ่งควรจะได้รับรายการ anyways %=เพื่อเลือกสตริงบางใช้

แก้ไข: ใช้ tuple unpacking และ eval (raw_input ()) == input () เพื่อบันทึก 21 ตัวอักษร

@undergroundmonorail ยืมมาอย่างหนัก แต่มีการปรับปรุงมากมาย


ดี! ฉันชอบสิ่งนี้มาก
undergroundmonorail

0

ทุบตี/ SHELF ,243 235

" SHE ll go LF " เป็นห้องสมุดสำหรับตีกอล์ฟซึ่งมีนามแฝงที่มีประโยชน์ นี่เป็นคำตอบที่ถูกต้องเนื่องจากมีห้องสมุดอยู่และอยู่ใน GitHub ก่อนที่จะมีการโพสต์ความท้าทาย

ขออภัยฉันไม่สามารถใช้งาน ideone ได้

วิธีการวิ่ง

สิ่งนี้ใช้ตำแหน่งเริ่มต้น (คั่นด้วยเครื่องหมายจุลภาคตามที่ระบุซึ่งจะเพิ่มอักขระจำนวนมากลงในโค้ด) เป็นอาร์กิวเมนต์แรกและคำแนะนำเกี่ยวกับอินพุตมาตรฐาน

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

ตัวอย่างผลลัพธ์

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

คำอธิบาย

dสำหรับการเปรียบเทียบ; ก็จะส่งกลับ 0 ถ้าสองข้อโต้แย้งที่มีความเท่าเทียมกันและ 1 มิฉะนั้นจะสามารถแล้วมีคำสั่งอื่น ๆ ที่ถูกล่ามโซ่ลงได้ด้วย&&และ||และ

yเป็นเหมือนtr(แต่ทำผ่านsed )

Y ก็เหมือน sed 's/.../.../g'ข้อโต้แย้งสองข้อ

Pคือecho -e -n; เป็นเพียงpecho -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

บิตถัดไปน่าเกลียดอย่างสุดซึ้งมีประมาณ 145 ตัวอักษรในหนึ่งบรรทัด หากคำสั่งปัจจุบันคือ M ให้เปลี่ยนเครื่องหมายจุลภาคเป็น $ ช่องว่างแปลงเป็นอาร์เรย์และบันทึกเป็น $ z จากนั้นให้ทำการสลับ ... case block สำหรับองค์ประกอบสุดท้ายของ $ z (ทิศทางที่รถแลนด์โรเวอร์ชี้ไปเปลี่ยนพิกัดตามลำดับจากนั้นแปลง $ z กลับไปเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคและบันทึกเป็น $ 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.shให้เป็นส่วนหนึ่งของโซลูชันแทนหรือ เช่นเดียวกับคุณต้องมีrequireแพ็คเกจใน Ruby หรือimportใน Python เช่นกันหากคุณต้องการ
Joey

@ โจอี้จุดที่ดี แต่ฉันไม่คิดว่าคนimportPYG เมื่อเขียนโปรแกรม Python ด้วยหรือ Rebmu (AFAIK) เมื่อเขียนโปรแกรม Rebol ด้วย

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

ฉันไม่แน่ใจว่ารูปแบบอินพุตและเอาต์พุตสตริงมีความยืดหยุ่นอย่างไรฉันจึงตรวจสอบให้แน่ใจว่ามันดูเหมือนตัวอย่าง (ลบด้วยคำเตือนแน่นอน) แต่เพิ่มอักขระพิเศษจำนวนมาก ลิงค์ Ideone


0

PHP - 224

ฉันลองทำดู

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

อินพุตใน STDIN เช่น:

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

การดำเนินการโดยใช้การใช้งานหนักของ 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)

การละเว้นอินพุต grumbles ที่ชัดเจนการกำหนดทิศทางของค่าที่แท้จริงอาจเป็นประโยชน์ต่อขนาดสคริปต์ อย่างไรก็ตามวิธีการที่นี่ทำงานได้อย่างสมบูรณ์แบบ (ดังนั้นฉันเชื่อว่า)


ยินดีต้อนรับสู่ PPCG นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดชนะ คุณสามารถเริ่มต้นด้วยการทำให้ชื่อตัวแปรของคุณยาวหนึ่งอักขระ
บาดเจ็บทางระบบดิจิตอล

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

เราใช้ชนิดตัวเลขที่ซับซ้อนในตัวของไพ ธ เพื่อเก็บคู่พิกัด ทิศทางคำนวณโดยการใช้หน่วยจินตภาพ1jเพื่ออำนาจของdที่ร้านค้าทิศทาง mod 4. หมุนจะกระทำโดยการเพิ่มหรือ ddecrementing การแสดงออก'ML'.find(c)ให้จำนวนเงินที่เราต้องการที่จะเปลี่ยนแปลงd: 1สำหรับL, 0สำหรับM, และ-1(เริ่มต้นสำหรับการไม่พบ) Rสำหรับ

งูใหญ่ไม่ได้มีวิธีที่สั้นการแปลงจำนวนที่ซับซ้อนในการ tuple ดังนั้นเราจะต้องทำให้ค่าใช้จ่ายในการโทรและ.real.imag

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.