화성 로버를 움직여 보자!


17

요약

임무는 화성 탐사선을 탐색하고 최종 좌표와 방향을 알려주는 것입니다.

입력:

첫 번째 입력 :

먼저 프로그램은 다음 형식의 입력을 가져와야합니다.

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

방향은 다음과 같아야합니다 N또는 S또는 E또는 W(북부, 남부, 서부, 동부의 편지를 시작)

예 : 10,20,N(x = 10, y = 20, 방향 = N (North))

두 번째 입력 :

제 2 입력은 일련의 구성 R, L, M오른쪽에 대한 왼쪽 각각 이동한다.

내용 RL(좌우) 로버의 방향에 따라 변경한다.

들면 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 2018 년

5
이것은 popular-contest 대신 code-golf 로 더 흥미로울 수 있습니다 . 이데온 사용시 어떤 종류의 보너스가 제공됩니까?
Kyle Kanos

@KyleKanos 사람들이 그것을 사용하는 것을 보았으므로 방금 사용했습니다. Rephrased;)
Amit Joki

6
챌린지에 대한 부정적인 피드백이 발생하면 먼저 샌드 박스를 통해 실행 해보십시오 .
Martin Ender

1
@Geobits 감사합니다. 명시 적으로 명시되어 있습니다.
Joki Amit

답변:


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에 연결된 솔루션은 한 줄 더 깁니다 ( 3 행 1.i대신 1i). 그 이유는 ideone이 Ruby 1.9 만 지원하기 때문에 복잡한 리터럴에 대한 간단한 구문을 허용하지 않기 때문입니다.


골프를
더보기

당신은 대체 할 수 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 아, 맞습니다. 실제로 약간 다른 최적화가 가능합니다 x,y,i=eval"*a="+gets. 감사!
Ventero

5

자바 ( ES6 ) 145 141 127

편집 : edc65의 C 솔루션 에서 메소드를 사용하여 변환 배열의 필요성을 제거했습니다 .

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

언 골프 / 코멘트 :

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 2018 년

1
트윗 담아 가기 구조 지정 할당
nderscore

내 C 답변을 살펴보십시오. 어쩌면 g 배열이 필요하지 않습니다
edc65

3

자바-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

자바 스크립트 (E6) 175

수정 된 버그 수정 (d에 대한 범위 반환 값을 벗어남)

139 논리, 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
}

테스트 파이어 폭스에서 자바 스크립트 콘솔에서 테스트합니다. 팝업을 피하면서 함수 F를 테스트하는 것이 더 간단합니다.

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

산출

[ 2, 4, "N" ]

좋아, 이것은 내 솔루션과 매우 흡사합니다.
nderscore

3

C 164180186

고정 입력 형식 편집 및 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]);}

언 골프

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

ASCII 값 남용 접근 방식을 사용하는 @ edc65 솔루션의 조정.

구체적으로 특별히:

  • d%8%5문자 ENWS0,1,2,3각각 매핑
  • c%23교대 L7, M8R13로 인해 d(방향 변수)이 항상 효과적으로 만든다 모드 4를 사용 L, 추가 개조 4 -1 M0 4 모드를 추가하고, R1 개조 4를 추가한다.
  • d&1방향 은 1 NS, EW방향은 0입니다 .
  • d&2방향 은 2 WS, NE방향은 0입니다 .
  • ~-(d&2)방향 은 1 WS, NE방향은 -1입니다 .
  • c%2는 1 M이고 0은 LR입니다.

왜 23, 그리고 무엇인가c%(2*(1-(d&2)))

@tolos : 설명이 추가되었습니다. 또한 2 문자로 단축 :)
nneonneo 2016 년

2

Python 3 (거북 그래픽 포함), 251 199 바이트

현명한 pythonistas, 조심하십시오. 이것은 당신의 훌륭한 언어로 작성된 프로그램을 처음 시도한 것이기 때문입니다.

화성 거북!

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

이 도전은 물론 파이썬이 가져 오는 로고 스타일의 거북이 그래픽에 자연스럽게 매핑됩니다.

STDIN에서 두 줄의 입력을 읽습니다.

산출:

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

이 프로그램에서 내가 특히 좋아하는 것은 실제로 로버의 경로를 그래픽으로 표시한다는 것입니다. exitonclick()사용자가 클릭 할 때까지 그래픽 출력이 유지되도록 프로그램 끝에 추가 하십시오.

enter image description here

나는 이것이 훨씬 더 골프를 질 수 있다고 확신합니다-어떤 제안이라도 환영합니다! 커뮤니티가 골프를 더 할 수 있기를 바랍니다.

변경 사항 :

  • s는 이제 인라인 된 목록입니다.
  • for 루프 본문에 3 진을 사용했습니다.
  • 인라인 n, 불필요한 슬라이스 제거.
  • import 문에서 불필요한 공간을 제거했습니다.
  • 내장 문자열 방법을 사용하기 위해 가져 오기 문자열을 제거했습니다.
  • raw_input을 줄이기 위해 Python 3으로 전환

@isaacg 감사합니다-좋은 골프!
디지털 외상

2

GolfScript, 116 98 88 84 71

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

다음과 같은 방법으로 좌표와 명령어를 인수로 가져와야합니다 1 2 'N' 'MRMLM'. 인수는 문자열로 만들어져 스택으로 푸시됩니다.

온라인으로 테스트하려면 웹 골프 스크립트 로 이동하여 세미콜론과 인수 ;"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 : 이전 버전의 게시물이 저장되어 과거의 모습을 볼 수 있습니다 ( "Edit xxx 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.

언 골프

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.

아이디어가 될 수 있으며 옵션은 파스칼입니까?
Joki Amit

4
"시작했을 때 아직 코드 골프가 아니 었습니다." 이것이 델파이 코딩에 대한 변명입니까? ;)
Martin Ender 2016 년

주변 공간은 =어떻습니까? 왜 필요한가요? 또한 변수 이름이 너무 길어 보입니다
John Dvorak

@ m.buettner ssshh, 콩을 흘리지 마라 : P
Teun Pronk

@JanDvorak 내가 말했듯이 코드 골프
Teun Pronk

1

자바 스크립트 (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 2016 년

1

파이썬 (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(',') ints와 문자열 사이의 캐스팅 문제를 겪었습니다. 이상적으로는 이전 위치를 이동 위치에 추가하고 싶었습니다 ... 오 지금은 코드 골프입니다. 아, 뭐든지 여기에 남겨두면 영감을 줄 수 있습니다. 내가 가지고있는 다른 아이디어는 초기 베어링을 색인에 매핑 한 후 방향의 모듈로 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

파이썬 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 바이트이며 전혀 풀리지 않았습니다). 예, 여전히 세미콜론이 있지만 실제로는 바이트를 절약합니다.

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 좌표는에 x, y에 y, 그리고 방향의 첫 글자 가에 저장 됩니다 d.

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

그런 다음 좌표를 int로 만듭니다. (두 문자열을 정수로 변환하는 더 좋은 방법을 생각할 수 없다는 것에 충격을 받았습니다. 시도 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'

나는 이것을 언 골프 링의 자유로 갔다.

두 번째 입력 줄의 각 문자에 대해 두 가지 작업을 수행합니다. 먼저 변수 m를 사전의 사전에서 현재 방향으로 제공하는 것으로 설정합니다 . 매번 이런 일이 필요할 이유는 없지만 필요할 때만 만드는 것보다 쉽습니다.

: 다음, 우리는 세 가지 요소 목록을 작성 'd+', 'd-'하고 m. 편집자 주 : 변수 m를 전혀 사용하지 않으면 벗어날 수 있다고 생각 합니다. v[d]목록에 직접 넣을 수 있다고 생각 합니다. 작동하면 몇 바이트를 절약 할 수 있지만이 설명을 마칠 때까지 테스트하지 않아서 모두 처리 할 수 ​​있습니다. (그렇습니다.)

문자열 'RL'에서 입력의 현재 문자를 찾습니다. str.find문자를 찾지 못하면 -1을 반환하므로 R을 0으로, L을 1로, 그 밖의 것을 -1로 변환합니다. 물론, 우리가 가질 수있는 유일한 다른 입력은 M이지만 모든 것을 위해 작동하게하는 문자는 적습니다.

우리는 그 번호를 우리가 만든 목록의 색인으로 사용합니다. 파이썬 목록 인덱스는 음수이면 끝에서 시작하므로 입력이 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

이데온

언 골프 드 :

#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

하스켈-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')

하하! 위대한은 변경, 지금까지 팩 뒤에 하스켈 볼 수 있습니다 : D
GreenAsJade

1
f=many digit
MUCH

입력을 read
나누고

1

Bash + coreutils, 159 바이트

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`

STDIN의 2 줄에서 입력을 읽습니다.

산출:

$ { 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]

더 이상 골프를 칠 수없는 것 같습니다. 조금 당황 스럽습니다. 그러나 모든 명백한 해킹은 실제로 여기서 작동하지 않습니다.

내가 할 수없는 iex입력)이 있기 때문에 N, S,EW(또는 내가 함께 있다는 접두사 필요 했어 작업에 해당하는 함수가 될 것이다 $)와 b는 1,2,N구문 분석해야 할 것이다 N발현 모드에서이 명령을 실행 할 수 없다는 .

switch운동을하는 가장 짧은 방법이 될 것으로 보인다. 스크립트 블록이나 문자열이있는 해시 테이블은 짧지 않으며 switch명시 적 루프의 오버 헤드가 있습니다.

IndexOf파이프 라인 ?이 더 길기 때문에 제거 할 수 없습니다 .

또한 초기 선언에서 명시 적 유형을 제거 할 수 없으므로 유형이 혼합되어 있으므로 단순합니다. |%{+$_} 하지 않으며 다른 모든 옵션이 더 길어집니다.

때로는 PowerShell에서 입력 처리가 싫어요.


1

파이썬, (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, MR 조건부 문을 사용하지 않도록합니다.

ideone 에서 사용해보십시오 .


1

파이썬 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을 별칭으로 지정하여 어쨌든 목록이었던 v [d] 사전을 일부 문자열 선택으로 변경했습니다 %=.

편집 : 튜플 압축 풀기와 eval (raw_input ()) == input ()을 사용하여 21자를 저장했습니다.

@undergroundmonorail에서 많이 빌 렸지만 많은 개선 사항이 있습니다.


좋은! 나는 이것을 많이 좋아한다.
undergroundmonorail

0

세게 때리다/ SHELF ,243 235

" 그녀LF를 갈 것이다 "는 몇 가지 유용한 별칭을 제공하는 Bash의 골프 라이브러리입니다. 이것은 챌린지가 게시되기 전에 라이브러리가 존재하고 GitHub에 있었던 올바른 답변입니다.

죄송합니다,이 아이디어를 작동시킬 수 없습니다.

달리는 방법

첫 번째 인수와 표준 입력에 대한 지침으로 초기 위치 (지정된대로 쉼표로 구분하여 코드에 많은 문자를 추가 함)를 사용합니다.

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을 반환하고 다른 명령을 &&and로 묶을 수 있습니다 ||.

y처럼 tr(하지만 통해 수행 sed).

Ysed 's/.../.../g'두 가지 주장 과 같습니다 .

P이다 echo -e -n; p그냥 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

다음 비트는 한 줄에 약 145 개의 문자를 포함하여 심하게 추악합니다. 현재 명령이 M이면 $ o의 쉼표를 공백으로 바꾸고 배열로 변환 한 다음 $ z에 저장하십시오. 그런 다음 $ z의 마지막 요소에 대해 switch ... case 블록을 수행하십시오 (로버가 가리키는 방향. 이에 따라 좌표를 변경 한 다음 $ 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루비 또는 특정 패키지 import당신이 그들을 필요로하는 경우뿐만 아니라 파이썬에서 그들.
Joey

@Joey 좋은 지적이지만 import, 파이썬 프로그램을 작성할 때 사람들이 PYG로 생각하지 않거나 , Rebol 프로그램을 작성할 때 Rebmu (AFAIK)로 생각하지 않습니다

0

하스켈, 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

입력 및 출력 문자열 형식이 얼마나 유연한 지 잘 모르겠으므로 예제와 정확히 똑같아 보였지만 (물론 프롬프트 제외) 많은 추가 문자가 추가되었습니다. 이데온 링크


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

파이썬 3 (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)

명백한 입력을 무시하고 방향 문자열에 고유 값을 지정하면 스크립트 크기에 도움이 될 수 있습니다. 그러나 여기의 접근 방식은 완벽하게 작동합니다 (믿습니다)


PPCG에 오신 것을 환영합니다. 이것은 코드 골프이므로 가장 짧은 대답이 이깁니다. 변수 이름을 하나의 문자 길이로 만들어 시작할 수 있습니다.
디지털 외상

0

파이썬 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

Python의 내장 복소수 유형을 사용하여 좌표 쌍을 저장합니다. 방향은 가상 단위 1j를의 거듭 제곱으로 d취해 방향 mod 4를 저장합니다. 회전은 증분 또는 감소로 수행됩니다 d. 표현식 'ML'.find(c)은 우리가 바꾸고 자하는 금액을 알려줍니다 d: 1for L, 0for M, and-1 (기본값은 찾을 수 없음) for R.

파이썬은 복소수를 튜플로 변환하는 짧은 방법이 없기 때문에 .realand에 값 비싼 호출을해야 .imag합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.