Mars gezgini hareket edelim!


17

özet

Görev Mars gezgini içinde gezinmek ve son koordinatlarını ve yönünü anlatmaktır.

Giriş:

İlk giriş:

Öncelikle programınız aşağıdaki formatta olacak girdiyi almalıdır:

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

Yön şu şekilde olmalıdır: Nveya Sveya Eveya W(Kuzey, Güney, Batı, Doğu başlangıç ​​harfleri)

Örnek: 10,20,N(x = 10, y = 20, yön = N (Kuzey))

İkinci giriş:

İkinci giriş serisi ihtiva eder R, L, Msağ için sırasıyla sola ve hareket eder.

İçin Rve L(sağ ve sol) rover yönü buna göre değiştirmeniz gerekir.

İçin Mrover o geçmeden önce oldu yönde 1 adet yeşil ışık taşımak zorundadır.

Koordinatları hesaplama kuralları:

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

Çıktı:

Son koordinatlar ve gezicinin geçerli yönü.


Misal:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Koordinatlar herhangi bir tam sayı olabilir ve negatif olabilir .

Tüm standart boşluklara izin verilmez. Http://ideone.com vb. Gibi sitelerde demo sunuyorsanız , doğrulayabilmem için lütfen bunu yapın :)

Bu bir popülerlik yarışmasıdır, bu yüzden yaratıcı olun!

Başkalarının tavsiyelerine göre, bunu bir yapmaya karar verdim .


Koordinatların sınırları var mı?
Teun Pronk

5
Bu popülerlik yarışması yerine kod golfü olarak daha ilginç olabilir . İdeone kullanımı için ne tür bir bonus verilir?
Kyle Kanos

@KyleKanos Bunu kullanan insanları gördüm, bu yüzden sadece kullanılmış.
Yeniden işledi

6
Zorluklarınız hakkında olumsuz geri bildirim alıyorsanız, önce bunları korumalı alandan çalıştırmayı deneyin .
Martin Ender

1
@Geobits teşekkürler. Açıkça ifade edilmiştir.
Amit Joki

Yanıtlar:


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

Bu çözüm buradan test edilebilir: https://ideone.com/C4PLdE

İdeone ile bağlantılı çözümün bir satır daha uzun olduğunu unutmayın ( satır 3 1.iyerine 1i). Bunun nedeni, ideone'nin sadece karmaşık değişmezler için kısa el sözdizimine izin vermeyen Ruby 1.9'u desteklemesidir.


golf daha görmek için bekliyor :)
Amit Joki

Bazı karakterleri kaydetmek için x,y,i=eval"[#{gets}]"ile değiştirebilirsiniz eval"x,y,i="+gets.
afuous

@voidpigeon: Bunun evalkapsam belirleme kuralları nedeniyle gerçekten işe yaradığından emin değilim : at için ruby -e 'eval"x=1";p x'bir atar . Sabitler ( ) kullanılırken çalışır , ancak değiştirdiğimden beri , bir sabiti yeniden tanımlamakla ilgili uyarıları önlemek için ek bir şey gerekir . Ama belki farklı Ruby versiyonlarından bahsediyoruz? NameErrorxp xeval"X,Y,I="+getsii=I
Ventero

1
@Ventero Haklısın. Ben irb test ve bana çalıştı kabul böylece çıktı olarak uygun dizi verdi. Değerlendirme yaklaşımını gerçekten çok seviyorum.
afuous

Ah @voidpigeon, haklısın, aslında biraz farklı bir optimizasyon sağlar: x,y,i=eval"*a="+gets. Teşekkürler!
Ventero

5

JavaScript ( ES6 ) 145 141 127

Düzenleme: edc65 C çözümünden yöntemi kullanarak bir çeviri dizisi ihtiyacı kaldırıldı

[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 / Yorumlananlar:

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

Bunu yapabilirsiniz?! [a, b, c] = x.plit (...)
edc65

1
@ edc65 Evet! Yıkıcı Ödev
nderscore

C yanıtıma bir göz atın. belki g dizisine gerek yoktur
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]);}}

Boşluk ile:

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 ile her zamanki gibi, bunun yaklaşık yarısı sadece girdiyi ayrıştırmak ve çıktıyı oluşturmaktır. Mantık oldukça basittir.


3

Javascript (E6) 175

Düzenleme muhtemelen d aralığı dönüş değeri dışında, hata düzeltildi

139 Mantık, 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()))

Temel çözülmemiş

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
}

Test Firefox'ta javascript konsolunda test edin. Açılır pencerelerden kaçınarak F işlevini test etmek daha kolaydır.

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

Çıktı

[ 2, 4, "N" ]

Güzel, bu benim çözümüme çok benziyor.
nderscore

3

C 164180186

Düzenle Sabit giriş biçimi ve kaldırılan strchr
Düzenle Kaldırılan ofset dizisi, bitleri kullanarak kireç

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

ASCII değer kötüye kullanımı yaklaşımımı kullanmak için @ edc65'in verdiği bir çözüm.

özellikle:

  • d%8%5karakterleri eşler ENWSiçin 0,1,2,3sırasıyla
  • c%23dönüşler Lhalinde 7, Miçine 8ve R13. içine için d(yönde değişken) her zaman bu etkili hale getirir, mod 4 kullanıldığında L, eklenti -1 4 mod M0 mod 4 ekleyin ve R1 mod 4 ekleyin.
  • d&1yön için 1 NSve 0'dır EW.
  • d&2yön için 2 WSve NEyön için 0'dır .
  • ~-(d&2)yön için 1 WSve -1 için NE.
  • c%21 için Mve 0 için LR.

Neden 23 ve nedirc%(2*(1-(d&2)))

@tolos: Bazı açıklamalar eklendi. Ayrıca 2 karakter kısaltılmış :)
nneonneo

2

Python 3 (kaplumbağa grafikli), 251199 bayt

Bilge pitonistalar, lütfen nazik olun, çünkü bu benim güzel dilinizde yazılmış bir programa ilk denemem.

Mars'taki kaplumbağalar!

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

Bu meydan okuma, doğal olarak, python'un içe aktarıldığı logo tarzı kaplumbağa grafikleriyle eşleşiyor.

STDIN'den iki satırdan girişi okur.

Çıktı:

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

Bu program hakkında özellikle sevdiğim şey aslında grafiksel olarak rover'ın yolunu gösteriyor. exitonclick()Grafik çıkışı kullanıcı tıklayana kadar devam edecek şekilde programın sonuna ekleyin :

resim açıklamasını buraya girin

Bu önemli ölçüde daha fazla golf olabilir eminim - herhangi bir öneri hoş geldiniz! Bu CW'yi yapıyorum, çünkü umarım topluluk biraz daha golf oynayabilir.

değişiklikler:

  • s şimdi sıralı bir liste.
  • For loop gövdesi için üçlü.
  • Inline n, gereksiz dilim kaldırıldı.
  • İçe aktarma deyimindeki gereksiz alan kaldırıldı.
  • Yerleşik dize yöntemini kullanmak için içe aktarma dizesi kaldırıldı
  • Raw_input kısaltmak için Python 3 olarak değiştirildi

@isaacg Teşekkürler - güzel golf!
Dijital Travma

2

GolfScript, 116 98 88 84 71

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

Bu koordinatlar ve argümanları aşağıdaki yolu olarak talimat almalısınız: 1 2 'N' 'MRMLM'. Argümanlar bir dizgiye dönüştürülür ve yığına itilir.

Bunu çevrimiçi olarak test etmek istiyorsanız, web golfscript'e gidin ve koddan;"1 2 'N' 'MRMLM'" önce argümanlarla (ör. ) Bir noktalı virgül ve ardından bir dize yapıştırın ( burada bir örnekle bir bağlantı var).

Çıktı örnekleri:

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


Önceki Girişimlerim

84 karakter:

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

88 karakter:

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

98 karakter:

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

116 karakter:

[~])\~"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: yayının eski sürümleri saklanır, böylece geçmişte nasıl olduklarını görebilirsiniz (sadece "Düzenlendi xxx önce" bağlantısına tıklayın)
masterX244

1

Delphi (819)

Ben başladığımda henüz değildi. Daha sonra düzenleyecek.

Gerçi çevrimiçi bir derleyici bulunamıyor.

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 olabilir ve seçenek Pascal?
Amit Joki

4
"Başladığımda henüz kod golf değildi." Delphi'de kodlama bahaneniz bu mu? ;)
Martin Ender

Etraftaki boşluklar ne =? Neden ihtiyaç duyulur? Ayrıca, değişken isimleri benim için çok uzun görünüyor
John Dvorak

@ m.buettner ssshh, fasulyeleri dökmeyin: P
Teun Pronk

@JanDvorak Dediğim gibi, kod golf
Teun Pronk

1

Javascript (353)

Bu kod golf benim ilk gerçek girişim, en azından çalışmak gibi görünüyor!

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
Gereksiz yere uzun değişken isimleri görebiliyorum;). Ayrıca, kod golf kimse uygun değişken kapsamı umurumda değil, bu yüzden bu var s bırakın .
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))

Bunu yapmanın daha zarif bir yolu olmalı, diğerinden sonra şubeye ihtiyacı yok.

http://ideone.com/eD0FwD

Giriş korkunç, bunu yapmak istedim split(',')ama ints ve dizeleri arasında döküm sorunları geldi. İdeal olarak, hareketli konumu ile eski konumu da eklemek istedim ... Ah şimdi kod golf. Ne olursa olsun, burada bırakacağım, ilham verebilir. Diğer fikirler ilk yönü bir endekse eşledikten sonra yön 4 modulo kullanıyordum. Ayrıca, anahtarların hiçbiri çarpışmadığı için dönüşleri birleştirip dizileri bire taşır.

buna rağmen, değişken adlarını kısaltmak ve boşlukları kaldırmak 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 bayt

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]

Aslında bununla gurur duyuyorum.

açıklama

İlk olarak, bu pisliği temizleyelim. Birçok yerde satır sonları yerine noktalı virgül kullandım çünkü bence beni serinletti Burada normalde (bu hala 197 bayt, hiç çözülmemiş). Evet, hala noktalı virgül var, ama aslında bir bayt kaydediliyor.

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]

Hadi başlayalım!

q='NESW'

Önce qdize olarak tanımlarız 'NESW'. İki kez sonra kullanıyoruz ve len("q='NESW';qq") < len("'NESW''NESW'").

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

Burada her virgüldeki ilk giriş hattını ayırıyoruz. Bizim x koordinatımız xy içinde yve yönümüzün ilk harfinde saklanır d.

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

O zaman sadece koordinatları ints yapıyoruz. (İki dizeyi ints'e dönüştürmenin daha iyi bir yolunu düşünemediğim için şok oldum. Denedim x,y=map(int,(x,y))ama bu daha uzun çıkıyor.)

d=q.find(d)

Bu, yönümüzü bir tamsayıya dönüştürür. 0 kuzey, 1 doğu, 2 güney ve 3 batıdır.

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

Eğlence burada başlıyor.

Kuzeye gittiğimizde Y 1 artar. Bu yüzden bu sözlük 0 alır ve 'y+'" y'yi arttırır " için dizeyi verir . Diğer yönler için benzer sonuçlar verir: y veya x ardından + veya -.

Buna geri döneceğiz.

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

Bunu hafifçe çözme özgürlüğüne gittim.

İkinci girdi satırındaki her karakter için iki şey yaparız. İlk olarak, değişkeni msözlüğümüzden daha önce verdiğimiz şeye ayarlıyoruz . Bunun her seferinde gerçekleşmesi için bir neden yok, ama ihtiyacımız olduğunda bunu yapmaktan daha kolay.

Sonra, üç elemanlı bir liste oluşturmak: 'd+', 'd-', vem . EDİTÖRÜN NOTU: Değişkeni hiç kullanmamaktan kurtulabileceğimi düşünüyorum m. Sanırım v[d]listeye doğrudan girebiliyorum . Çalışırsa bu bana birkaç bayt kazandıracak, ancak bu açıklamayı yapana kadar test etmek istemiyorum, böylece hepiniz başa çıkabilirsiniz. (Evet, işe yaradı.)

'RL' dizesindeki girişin geçerli karakterini ararız. str.findkarakteri bulamazsa -1 değerini döndürür, böylece bu R'yi 0'a, L'yi 1'e ve başka bir şeyi -1'e dönüştürür. Tabii ki, sahip olabileceğimiz diğer tek girdi M'dir, ancak her şey için çalışmasını sağlamak daha az karakterdir.

Bu sayıyı, oluşturduğumuz liste için dizin olarak kullanırız. Python listesi indeksleri negatifse sonunda başlar, bu yüzden giriş R ise ilk öğeyi, L ise ikincisini ve M ise sonuncusunu alırız. kuzeye bakıyoruz ancak diğer yönler için de benzer bir ilke geçerlidir.

Çalıştığımız olası değerler 'd+'R, 'd-'L ve 'y+'M içindir. Sonra, '=1;d=d%4'her birinin sonuna bağlarız . Bu, olası değerlerimizin ...

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

Bu geçerli bir python kodu! Bu, giriş karakterlerinin her biri için tam olarak ne yapmak istediğimizi yapan geçerli bir python kodu! ( d=d%4Parça sadece yönlerimizi aklı başında tutar. Yine, her seferinde yapmanıza gerek yok, ama daha az karakter.)

Tek yapmamız gereken, her karakter için aldığımız kodu çalıştırmak, yazdırmak (yönümüzü bir dizgeye dönüştürmek) ve işimiz bitti!


1

C - 350

Farklı kaydet 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;}

Derleme:

gcc -o rover rover.c -lm

Örnek çalışma:

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

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)

Şununla test edildi:

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

Hah hah! Haskell'i şimdiye kadar paketin arkasında görmek için harika: D
GreenAsJade

1
f=many digitÇOK LOL - ÇOK VAY
tomsmeding

Giriş bölme ve readbirden çok kez kullanarak parsec kullanmaktan daha fazla karakter aldı ...
gxtaillon

1

Bash + coreutils, 159 bayt

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`

Giriş 2 satır STDIN'den okunur.

Çıktı:

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

Bu biraz daha utanç verici, daha aşağı golf görünmüyor. Ancak tüm bariz hackler burada gerçekten işe yaramıyor.

Yapamam iexgirdi çünkü) N, S, Eve W(veya ben bu önek gerekiyordu işe bunun için işlevlere olması gerekir $) ve b 1,2,Nayrıştırmak zorunda kalacak Nifade modunda, bir komutu çalıştırmak mümkün olmayan .

Bu switchhareketi yapmanın en kısa yolu gibi görünüyor. Komut dosyası blokları veya dizeleri ile karma tablo daha kısa değildir ve switchben açık döngü ek yükü olurdu dışında her türlü şekilde .

Bundan kurtulamam IndexOfçünkü? daha uzun, hala.

Ayrıca, ilk bildirimdeki açık türlerden kurtulamıyorum çünkü orada karışık türlerim var, bu yüzden basit bir |%{+$_}yardımcı olmuyor ve diğer her seçenek daha uzun.

Bazen PowerShell'de girdi işlemeden nefret ediyorum.


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

Suistimaller ASCII değerleri L, MveR herhangi koşullu ifadeler kullanarak kaçınmak için.

İdeal olarak deneyin .


1

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

Orijinalden değiştirdiğim şeyler:

Diğer adlı raw_input, yine de bir liste olması gereken v [d] sözlüğünü, kullanılan bazı dize seçimiyle değiştirdi %=.

Düzenleme: 21 karakter kaydetmek için grup açma ve eval (raw_input ()) == input () kullanılır.

@ Undergroundmonorail'den ödünç alındı, ancak birçok iyileştirme yapıldı.


Güzel! Bunu çok beğendim.
yeraltı

0

Bash / RAF ,243 235

" SHE ll go LF " birkaç faydalı takma ad sağlayan Bash için bir golf kütüphanesidir. Bu, kütüphane mevcut olduğundan ve meydan okuma gönderilmeden önce GitHub'da olduğu için geçerli bir cevaptır.

Üzgünüm, bunu ideone üzerinde çalıştıramıyorum.

Nasıl çalıştırılır

Bu, ilk argümanı olarak ilk konumu (belirtildiği gibi virgülle ayrılmış; koda çok sayıda karakter ekler) ve standart girdi ile ilgili talimatları alır.

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

Örnek çıktı

2,4,N

kod

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

açıklama

dkarşılaştırma içindir; iki parametre eşittir ve 1 aksi takdirde, daha sonra bunun üzerine zincirli diğer komutları olabilir eğer 0 dır &&ve ||.

ygibi tr(ama bitti sed).

Ygibi sed 's/.../.../g'iki bağımsız değişkenler için.

Polduğu echo -e -n; psadece 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

Bir sonraki bit, bir satırda yaklaşık 145 karakter ile son derece çirkin. Geçerli komut M ise, $ o içindeki virgülleri boşluklara dönüştürün, diziye dönüştürün ve $ z'ye kaydedin. Daha sonra, $ z'nin son öğesi için (geçişin işaret ettiği yön.

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
Bunun shelf.shyerine kaynak bulma çözümün bir parçası olmamalı mı ? Eğer olurdu gibi requireRuby veya belirli paketler importbunları gerekirse de Python onlara.
Joey

@Joey iyi bir nokta, ama ben importonunla bir Python programı yazarken insanların PYG veya onunla bir Rebol programı yazarken Rebmu (AFAIK)

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

Giriş ve çıkış dizesi biçiminin ne kadar esnek olduğundan emin değildim, bu yüzden tam olarak örneğe benzediğinden emin oldum (elbette eklentiler eksi), ancak bu çok fazla karakter ekledi. Ideone bağlantısı


0

PHP - 224

Ben de denedim.

$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 olarak giriş, örneğin:

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

Üçlü ifs kullanımı ile uygulama.

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)

Belirgin girdi öfkelerini atlamak, yön dizelerine içsel değerler vermek komut dosyası boyutundan faydalanmış olabilir. Ancak, buradaki yaklaşım mükemmel şekilde işlevseldir (bu yüzden inanıyorum)


PPCG'ye hoş geldiniz. Bu kod golf, bu yüzden en kısa cevap kazanır. Değişken adlarınızı bir karakter uzunluğunda başlayarak başlayabilirsiniz.
Dijital Travma

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

Koordinat çiftini saklamak için Python'un yerleşik karmaşık sayı türünü kullanıyoruz. Yön, hayali ünitenin mod 4'ü depolayan 1jgücüne alınarak hesaplanır d. Döndürme, artırılarak veya azaltılarak yapılır d. İfade 'ML'.find(c)değiştirmek istediğimiz miktarı verir d: 1için L, 0için Mve -1(bulunamadı için varsayılan) R.

Biz masraflı arama yapmak zorunda Python, bir tuplea karmaşık sayı dönüştürmek için kısa bir yol yoktur .realve .imag.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.