火星探査機を動かしましょう!


17

概要

タスクは、火星探査車をナビゲートし、その最終的な座標と方向を伝えることです。

入力:

最初の入力:

まず、プログラムは次の形式の入力を受け取る必要があります。

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

方向は次のNいずれSかでなければなりません:またはまたはEまたはW(北、南、西、東の手紙を開始)

例: 10,20,N(x = 10、y = 20、方向= N(北))

2番目の入力:

第2の入力は、一連の構成されRLM右のために、左とそれぞれ移動します。

以下のため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などのサイトでデモを提供できる場合は、そうしてください。そうすれば、確認できます:)

これは人気コンテストですので、クリエイティブに!

他の人のアドバイスに従って、私はこれを


座標に制限はありますか?
テウンプロンク

5
これは、popularity-contestではなくcode-golfとしてより興味深いかもしれません。イデオンの使用にはどのようなボーナスが与えられますか?
カイルカノス

@KyleKanosそれを使っている人を見たので、使っただけです。それを言い換え;)
アミットJoki

6
課題について否定的なフィードバックが発生している場合はまずサンドボックスを介して実行しててください
マーティンエンダー

1
@Geobitsありがとう。明示的に述べられています。
アミットジョキ14

回答:


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

イデオンにリンクされたソリューションは、1 行長くなります(3行目1.i1iはなく)。これは、ideoneがRuby 1.9のみをサポートしているため、複雑なリテラルの短縮構文を使用できないためです。


さらにゴルフを待っています:)
アミットジョキ

に置き換えx,y,i=eval"[#{gets}]"eval"x,y,i="+gets、いくつかの文字を保存できます。
激しい14年

@voidpigeon:私は実際に起因して動作することはよく分からないevalのスコープ規則を:ruby -e 'eval"x=1";p x'投げるNameErrorためxp x。定数(eval"X,Y,I="+gets)を使用する場合は機能しますが、変更するため、定数の再定義に関する警告を防ぐためにi追加が必要になりますi=I。しかし、異なるRubyバージョンについて話しているのでしょうか?
Ventero

1
@Venteroそのとおりです。私はirbでそれをテストし、出力として適切な配列を与えたので、それが機能すると仮定しました。私は評価アプローチが本当に好きです。
激しい14年

@voidpigeonああ、そうですね、実際にはわずかに異なる最適化が可能ですx,y,i=eval"*a="+gets。ありがとう!
ヴェンテロ14年

5

ジャバスクリプト(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 14年

1
@ edc65うん!分割代入
nderscore

私のCの答えをご覧ください。多分g配列は必要ありません
edc65 14年

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

編集 、おそらく日間の範囲の戻り値のうち、バグを修正します

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 14年

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変わりL7M8R13にあるためd(方向の変数)は、常にこれが有効になり、MOD 4に使用されL、追加-1 4 MOD M0 MOD 4を追加し、R1つのMOD 4を加えます。
  • d&1は1でNSEWルートは0です。
  • d&2 は2 WSNEルートは0です。
  • ~-(d&2) は1 WSNE方向方向は-1です。
  • c%2は1でM0はLRです。

なぜ23、そして何ですかc%(2*(1-(d&2)))

@tolos:説明を追加しました。また、2文字短縮されます:)
nneonneo 14年

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

この挑戦はロゴスタイルのタートルグラフィックスに非常に自然にマッピングされます。もちろん、Pythonにはインポートがあります。

STDINから2行の入力を読み取ります。

出力:

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

このプログラムで特に気に入っているのは、実際にローバーのパスをグラフィカルに表示することです。exitonclick()ユーザーがクリックするまでグラフィカル出力が持続するように、プログラムの最後に追加します。

enter image description here

私はこれがかなりもっとゴルフできると確信しています-どんな提案でも歓迎します!私はこのCWを作っています。なぜなら、コミュニティがそれをもう少しゴルフできるといいからです。

変更点:

  • sは、インラインのリストになりました。
  • forループの本体に3項を使用しました。
  • インラインn、不要なスライスを削除しました。
  • importステートメントの不要なスペースを削除しました。
  • 組み込み文字列メソッドを使用するためにインポート文字列を削除しました
  • raw_inputを短縮するためにPython 3に切り替えました

@isaacgありがとう-素敵なゴルフ!
デジタル外傷14年

2

GolfScript、116 98 88 84 71

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

これは、次の方法で引数として座標と指示を取得する必要があります1 2 'N' 'MRMLM'。引数は文字列になり、スタックにプッシュされます。

これをオンラインでテストする場合は、web 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=

ところで:投稿の古いバージョンが保存されているので、過去の様子を見ることができます([編集前のxxx前]リンクをクリックしてください)
masterX244 14年

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.

イデオンかもしれないし、オプションはパスカルですか?
アミットジョキ14

4
「私が始めたとき、それはまだコードゴルフではありませんでした。」それはDelphiでのコーディングの言い訳ですか?;)
マーティンエンダー14年

周りのスペースは=どうですか?なぜ必要なのですか?また、変数名は長すぎます
ジョンドヴォルザーク14年

@ m.buettner ssshh、豆をこぼさないでください:P
テウンプロンク14

@JanDvorak私が言ったように、それはコードゴルフ
Teun Pronk 14年

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 ます。
マーティンエンダー14年

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(',')が、intと文字列の間でキャストの問題に遭遇た。理想的には、移動する位置に古い位置を追加したかったのです。ああ、今はコードゴルフです。まあ何でも、ここに置いておきます、インスピレーションを与えるかもしれません。私が持っていた他のアイデアは、最初の方位をインデックスにマッピングした後、方向のモジュロ4を使用していました。また、どのキーも衝突しないため、ターンをマージして配列を1つに移動します。

それでも、変数名を短縮してスペースを削除すると、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'。後で2回使用しlen("q='NESW';qq") < len("'NESW''NESW'")ます。

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

ここでは、inpuptの最初の行を各コンマで分割します。x座標はx、yに格納され、y方向の最初の文字はに格納されdます。

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

次に、coords intを作成します。(2つの文字列を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+'、「increase y」を表す。他の方向についても同様の結果が得られます:yまたはxの後に+または-が続きます。

これに戻ります。

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

私はこれを少しだけ自由にした。

入力の2行目の各文字について、2つのことを行います。まず、変数を設定しますmを、以前の辞書から現在の方向。毎回これを実行する必要がある理由はありませんが、必要なときに実行するよりも簡単です。

:次に、我々は、3つの要素を持つリストを作成し'd+''d-'、とm編集者注:変数mをまったく使用しなくても大丈夫だと思います。v[d]リストに直接入れることができると思います。うまくいけば数バイト節約できますが、この説明を終えるまでテストする気はありません。(ええ、うまくいきました。)

文字列「RL」で入力の現在の文字を探します。str.find文字が見つからない場合は-1を返すため、Rを0に、Lを1に、その他を-1に変換します。もちろん、他に入力できるのはMだけですが、すべての場合に使用できる文字は少なくなります。

その番号を、作成したリストのインデックスとして使用します。Pythonリストのインデックスは、負の場合は最後から始まるので、入力がRの場合は最初の要素、Lの場合は2番目、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')

ハハハ!D:変更のために、これまでのパックの後ろにHaskellのを見るのは素晴らしい
GreenAsJade

1
f=many digitMUCH LOL - SUCH WOW
tomsmeding

分割入力し、使用してread複数回パーセクを使用するよりも行うには複数の文字を取った...
gxtaillon

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入力)ので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値LMおよびR任意の条件文を使用しないようにします。

イデオネで試してみてください。


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比較用です。2つの引数が等しい場合は0を返し、それ以外の場合は1を返します。その後、他のコマンドを&&andで連鎖させることができます||

yのようなものですtrsed)。

Y のようなものです sed 's/.../.../g'2つの引数にています。

Pですecho -e -npただ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

次のビットは非常にく、1行に約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その代わりに、調達はソリューションの一部ではありませんか?あなたが持っているだろうと同様にrequireRubyやで特定のパッケージimportあなたがそれらを必要とする場合だけでなくPythonでそれら。
ジョーイ14年

@Joey良い点、私は人とは思わないimportことでREBOLのプログラムを書くときPYGそれにPythonプログラムを書く、またはRebmu(私の知る限り)

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

Python3(288)

三項ifの頻繁な使用を使用した実装。

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文字長にすることから始めます。
デジタル外傷14年

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の組み込み複素数型を使用して、座標のペアを保存します。方向は、虚単位1jにの累乗をとることによって計算されdますd。これは、mod 4の方向を格納します。回転は、増分または減分によって行われます。式'ML'.find(c)は、変更したい量を与えますd1for L0 for M、および-1(not foundのデフォルト)for R

Pythonには、複素数をタプルに変換する簡単な方法がないため、とへの高価な呼び出しを行う必要が.realあり.imagます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.