让我们移动火星探测器!


17

摘要

任务是导航火星探测器,并告知其最终坐标和方向。

输入:

首先输入:

首先,您的程序必须采用以下格式的输入:

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

方向必须是:NSEW(北,南,西,东的起始字母)

示例:( 10,20,Nx = 10,y = 20,方向= N(北))

第二输入:

所述第二输入包括一系列的RLM右,左,分别移动。

对于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 2014年

5
作为代码高尔夫球而不是普及竞赛,这可能更有趣。给予亚酮有什么好处?
Kyle Kanos 2014年

@KyleKanos我看到有人在用它,所以就用了。
改写

6
您知道,如果您遇到挑战的负面反馈,请尝试首先在沙盒中运行它们
Martin Ender 2014年

1
@Geobits谢谢。明确指出。
阿米特·乔基

Answers:


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

可以在这里测试此解决方案:https : //ideone.com/C4PLdE

请注意,在ideone上链接的解决方案要长一个字符(1.i而不是1i在第3行中)。这样做的原因是,ideone仅支持Ruby 1.9,而Ruby 1.9则不支持复杂文字的简写语法。


等待看到它进一步打高尔夫球:)
2014年

您可以替换x,y,i=eval"[#{gets}]"eval"x,y,i="+gets以保存一些字符。
2014年

@voidpigeon:我不确定由于eval的作用域规则而实际起作用:在处ruby -e 'eval"x=1";p x'抛出NameErrorfor 。当使用常量()时,它确实可以工作,但是由于我进行了修改,因此需要额外的操作来防止有关重新定义常量的警告。但是也许我们在谈论不同的Ruby版本?xp xeval"X,Y,I="+getsii=I
Ventero 2014年

1
@Ventero你是对的。我在irb中对其进行了测试,它为我提供了正确的数组作为输出,因此我认为它可以工作。我真的很喜欢评估方法。
2014年

@voidpigeon啊,您是对的,实际上允许进行稍微不同的优化:x,y,i=eval"*a="+gets。谢谢!
Ventero 2014年

5

使用Javascript(ES6145 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,2014年

1
@ edc65是的!破坏性分配
nderscore 2014年

看看我的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逻辑,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
}

测试 在Firefox的javascript控制台中测试。测试函数F避免弹出窗口更简单。

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

输出量

[ 2, 4, "N" ]

很好,这看起来很像我的解决方案。
nderscore 2014年

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

对@ edc65的解决方案进行了一些调整,以使用我的ASCII值滥用方法。

特别:

  • d%8%5分别将字符映射ENWS0,1,2,3
  • c%23L7M8R成13由于d(方向可变的)总是使用模4,这有效地使L附加-1模4,M添加0模4,并R加1个模4。
  • d&1方向为1 NSEW方向为0 。
  • d&2方向为2 WSNE方向为0 。
  • ~-(d&2)方向为WS1,NE方向为-1 。
  • c%2代表1 M和0 LR

为什么是23,又是什么c%(2*(1-(d&2)))

@tolos:添加了一些解释。还缩短了2个字符:)
nneonneo 2014年

2

Python 3(带有海龟图形),251199字节

明智的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)])

挑战自然而然地映射到徽标样式的海龟图形,当然python也要导入该图形。

从STDIN的两行中读取输入。

输出:

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

我特别喜欢该程序的地方是,它实际上以图形方式显示了流动站的路径。添加exitonclick()到程序的末尾,以便图形输出持续到用户单击为止:

在此处输入图片说明

我很确定这可以打更多的高尔夫球-欢迎任何建议!我正在制作此CW,因为我希望社区能够多打些高尔夫。

变化:

  • s现在是一个列表,内联。
  • 将三进制用于for循环的主体。
  • 内联n,删除不必要的切片。
  • 删除了导入语句中不必要的空间。
  • 删除了导入字符串以使用内置字符串方法
  • 切换至Python 3以缩短raw_input

@isaacg谢谢-打高尔夫球不错!
Digital Trauma 2014年

2

GolfScript,116 98 88 84 71

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

这应该通过以下方式获取坐标和指令作为参数:1 2 'N' 'MRMLM'。参数被制成字符串并被推入堆栈。

如果要在线进行测试,请转至golf golf网站,;"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=

顺便说一句:帖子的旧版本已存储,因此您可以查看过去的情况(只需单击“ Edited xxx ago”链接)
masterX244 2014年

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.

可能是ideone,选项是Pascal?
阿米特·乔基

4
“当我开始时,它还不是代码高尔夫。” 这是您在Delphi中进行编码的借口吗?;)
Martin Ender 2014年

周围的空间=怎么了?为什么需要它们?另外,变量名对我来说似乎太长了
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 2014年

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(',')但是遇到整数和字符串之间的转换问题。理想情况下,我还想在移动位置上添加旧位置...哦,现在是代码高尔夫球。哦,无论如何,我将其保留在此处,可能会给您启发。在将初始方位映射到索引后,我曾使用过其他方法,即使用方向的模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个字节,根本没有被取消占用)。是的,仍然有一个分号,但是那个实际上节省了一个字节。

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。(我为无法想到将两个字符串转换为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,但是使它适用于所有内容的字符较少。

我们使用该数字作为创建列表的索引。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

那是有效的python代码!这是有效的python代码,完全可以完成我们想要为每个输入字符执行的操作!(该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

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

哈哈哈!很
高兴

1
f=many digit大声笑-哇
毁了2014年

分割输入并read多次使用比使用parsec花费了更多的字符...
gxtaillon 2014年

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`

从2行STDIN中读取输入。

输出:

$ { 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输入因)NSE并且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值LMR避免使用任何条件语句。

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,将v [d]字典(应该仍然是一个列表)更改为使用的某些字符串选择%=

编辑:使用元组拆包和eval(raw_input())== input()可以保存21个字符。

从@undergroundmonorail大量借用,但有很多改进。


真好!我很喜欢这个
地下

0

重击/ 搁板243 235

SHE ll go LF ”是Bash的高尔夫球库,它提供了一些有用的别名。这是一个有效的答案,因为该库已经存在,并且在发布挑战之前位于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'有两个论点一样。

Pecho -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中的逗号转为空格,转换为array并保存为$ 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应该成为解决方案的一部分吗?就像您需要使用requireRuby或importPython中的某些程序包一样。
2014年

@Joey很好,但是我不认为人们使用importPYG编写Python程序,或者使用Rebmu(AFAIK)编写Rebol程序

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

我不确定输入和输出字符串格式的灵活性如何,因此我确保它看起来与示例完全相同(当然要减去提示),但是这增加了很多额外的字符。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)

忽略明显的输入抱怨,为方向字符串提供内在值可能会有益于脚本大小。但是,这里的方法功能完善(我相信)


欢迎来到PPCG。这是代码高尔夫球,因此最短的答案为准。您可以先将变量名的长度设为1个字符。
Digital Trauma 2014年

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

我们使用Python的内置复数类型存储一对坐标。通过将虚数单位乘以,可以存储方向mod 4 1j的幂来计算d方向。旋转可以通过递增或递减完成d。该表达式'ML'.find(c)给出了我们要更改的数量d1for L0for M-1(默认为not found)forR

Python没有一小段路到复杂的数字转换为一个元组,所以我们必须做出昂贵的电话.real.imag

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.