चलिए मंगल रोवर चलते हैं!


17

सारांश

कार्य मंगल रोवर को नेविगेट करना और उसके अंतिम निर्देशांक और दिशा बताना है।

इनपुट:

पहला इनपुट:

पहले आपके प्रोग्राम को इनपुट लेना होगा जो निम्न प्रारूप में होगा:

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

दिशा होनी चाहिए: Nया Sया Eया W(शुरू उत्तर, दक्षिण, पश्चिम, पूर्व के पत्र)

उदाहरण: 10,20,N(x = 10, y = 20, दिशा = N (उत्तर))

दूसरा इनपुट:

दूसरे इनपुट की श्रृंखला के होते हैं 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 आदि साइटों पर डेमो प्रदान करना संभव है, तो कृपया ऐसा करें, ताकि मैं सत्यापित कर सकूं :)

यह एक लोकप्रियता प्रतियोगिता है इसलिए रचनात्मक बनें!

दूसरों की सलाह के बाद, मैं इसे एक बनाने का फैसला करता हूं ।


क्या निर्देशांक की सीमाएं हैं?
टेउन प्रून

5
यह लोकप्रियता-प्रतियोगिता के बजाय कोड-गोल्फ के रूप में अधिक दिलचस्प हो सकता है । आइडोन के उपयोग के लिए किस तरह का बोनस दिया जाता है?
काइल कानोस

@KyleKanos मैंने लोगों को इसका इस्तेमाल करते हुए देखा, इसलिए बस इस्तेमाल किया। इसे रीफ़्रेश किया;)
अमित जोकी

6
तुम्हें पता है, यदि आप अपनी चुनौतियों पर नकारात्मक प्रतिक्रिया का सामना कर रहे हैं, तो पहले सैंडबॉक्स के माध्यम से उन्हें चलाने का प्रयास करें
मार्टिन एंडर

1
@Geobits धन्यवाद स्पष्ट रूप से कहा।
अमित जोकी

जवाबों:


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)। इसका कारण यह है कि आइडोन केवल रूबी 1.9 का समर्थन करता है, जो जटिल शाब्दिकों के लिए शॉर्ट-हैंड सिंटैक्स की अनुमति नहीं देता है।


यह आगे गोल्फ देखने के लिए इंतजार कर रहा है :)
अमित जोकी

आप बदल सकते हैं x,y,i=eval"[#{gets}]"के साथ eval"x,y,i="+getsकुछ वर्ण को बचाने के लिए।
afuous

@voidpigeon: मुझे यकीन है कि वास्तव में काम करता है की वजह से नहीं कर रहा हूँ eval: की scoping नियम ruby -e 'eval"x=1";p x'एक फेंकता NameErrorके लिए xपर p x। यह स्थिरांक ( eval"X,Y,I="+gets) का उपयोग करते समय काम करता है , लेकिन जब से मैं संशोधित करता हूं i, तो इसे i=Iएक निरंतरता को पुनर्परिभाषित करने के बारे में चेतावनी को रोकने के लिए एक अतिरिक्त की आवश्यकता होगी । लेकिन शायद हम विभिन्न रूबी संस्करणों के बारे में बात कर रहे हैं?
वेंटरो

1
@Ventero तुम सही हो। मैंने इसे irb में टेस्ट किया और इसने मुझे आउटपुट के रूप में उचित एरे दिया जिससे मैंने यह मान लिया कि यह काम कर रहा है। मैं वास्तव में eval दृष्टिकोण पसंद है।
afuous

@voidpigeon आह, आप सही कह रहे हैं, कि वास्तव में थोड़ा अलग अनुकूलन की अनुमति देता है x,y,i=eval"*a="+gets:। धन्यवाद!
वेंचरो

5

जावास्क्रिप्ट ( ईएस 6 ) 145 141 127

संपादित करें: 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


मेरे C उत्तर पर एक नजर है। शायद जी सरणी की जरूरत नहीं है
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]);
    }
}

जावा के साथ हमेशा की तरह, इसमें से लगभग आधा इनपुट को पार्स करना और आउटपुट बनाना है। तर्क बहुत सीधा है।


3

जावास्क्रिप्ट (E6) 175

फिक्स्ड बग को संपादित करें , संभवतः डी के लिए रेंज रिटर्न मान से बाहर

139 तर्क, 36 आई / ओ

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

अच्छा लगा, यह मेरे समाधान की तरह लग रहा है।
अंडर

3

सी 164 180 186

एडिट फिक्स्ड इनपुट फॉर्मेट और हटाए गए स्ट्रैच
एडिट किए गए हटाए गए एरे, बिट्स का उपयोग करके कैल्क करें

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

सी, 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क्रमशः पात्रों ENWSको मैप करता 0,1,2,3है
  • c%23बदल जाता Lहै 7, Mमें 8और R13. क्योंकि d(दिशा चर) हमेशा 4 mod का उपयोग किया जाता है, यह प्रभावी रूप से बनाता हैL -1 mod 4 , M0 mod 4 Rजोड़ें , और 1 mod 4 जोड़ें।
  • d&1 के लिए 1 है NSEWदिशाओं के लिए और 0 है ।
  • d&2 के लिए 2 है WSNEदिशाओं के लिए और 0 है ।
  • ~-(d&2) के लिए 1 है WSNEदिशाओं के लिए और -1 है ।
  • c%2के लिए 1 है Mऔर 0 के लिए है LR

23 क्यों, और क्या हैc%(2*(1-(d&2)))

@tolos: कुछ स्पष्टीकरण जोड़ा गया। इसके अलावा 2 वर्णों से छोटा :)
nnonneo

2

पायथन 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)])

यह चुनौती लोगो-शैली के कछुए ग्राफिक्स के लिए स्वाभाविक रूप से मैप करती है, जिसके लिए अजगर का आयात होता है।

STDIN से दो लाइनों से इनपुट पढ़ता है।

आउटपुट:

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

मुझे इस कार्यक्रम के बारे में विशेष रूप से पसंद है यह वास्तव में रोवर के पथ को रेखांकन करता है। exitonclick()प्रोग्राम के अंत में जोड़ें ताकि ग्राफिकल आउटपुट उपयोगकर्ता क्लिक तक बनी रहे:

यहाँ छवि विवरण दर्ज करें

मुझे पूरा यकीन है कि यह काफी अधिक गोल्फ हो सकता है - किसी भी सुझाव का स्वागत है! मैं इसे सीडब्ल्यू बना रहा हूं, क्योंकि मुझे उम्मीद है कि समुदाय इसे कुछ और कर सकता है।

परिवर्तन:

  • s अब एक सूची है, इनबिल्ट है।
  • लूप के लिए शरीर के लिए उपयोग किया जाने वाला टर्नरी।
  • झुका हुआ एन, अनावश्यक टुकड़ा हटा दिया।
  • आयात विवरण में अनावश्यक स्थान हटा दिया गया।
  • निर्मित स्ट्रिंग विधि का उपयोग करने के लिए आयात स्ट्रिंग को हटा दिया गया
  • रॉ_इनपुट को छोटा करने के लिए पायथन 3 पर स्विच किया गया

@isaacg धन्यवाद - अच्छी गोल्फिंग!
डिजिटल ट्रामा

2

गोल्फस्क्रिप्ट, 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: पोस्ट के पुराने संस्करणों को संग्रहीत किया जाता है ताकि आप देख सकें कि अतीत में कैसे थे (बस "एडिट 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.

विचारधारा हो सकती है और विकल्प पास्कल है?
अमित जोकी

4
"जब मैंने शुरू किया तो यह अभी तक कोड-गोल्फ नहीं था।" क्या डेल्फी में कोडिंग के लिए आपका बहाना है? ;)
मार्टिन एंडर

आसपास के स्थानों के साथ क्या हो रहा है =? उनकी आवश्यकता क्यों है? इसके अलावा, चर नाम मेरे लिए बहुत लंबा लगता है
जॉन ड्वोरक

@ m.buettner sshshh, बीन्स को न फैलाएं: P
Teun Pronk

@JDDvorak जैसा मैंने कहा, यह कोड-गोल्फ के
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 एस को छोड़ दें ।
मार्टिन एंडर

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(',') लेकिन चींटियों और तारों के बीच कास्टिंग मुद्दों पर आया था। आदर्श रूप से मैं भी पुरानी स्थिति को गतिमान स्थिति के साथ जोड़ना चाहता था ... ओह यह कोड-गोल्फ है। ओह, जो भी हो, मैं इसे यहाँ छोड़ दूँगा, प्रेरणा दे सकता हूँ। अन्य विचारों को मैं एक सूचकांक के लिए प्रारंभिक असर मानचित्रण के बाद दिशा के modulo 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(',')

यहाँ हम प्रत्येक अल्पविराम पर inpupt की पहली पंक्ति को विभाजित करते हैं। हमारे x निर्देशांक को xy y, और हमारी दिशा के पहले अक्षर में संग्रहीत किया जाता है d

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

फिर हम बस कोर्ड्स बनाते हैं। (मैं हैरान था कि मैं दो तारों को चींटियों में बदलने के लिए बेहतर तरीके के बारे में नहीं सोच सकता था। मैंने कोशिश की 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-', और mसंपादकीय नोट: मुझे लगता है कि मैं चर का उपयोग न करने के साथ दूर हो सकता हूं m। मुझे लगता है कि मैं v[d]सीधे सूची में डाल सकता हूं । अगर यह काम करता है तो मुझे एक दो बाइट्स बचा सकता है, लेकिन जब तक मैं इस स्पष्टीकरण को पूरा नहीं कर लेता, तब तक मुझे ऐसा महसूस नहीं होता है कि आप इससे निपट सकते हैं। (हाँ, यह काम किया।)

हम स्ट्रिंग 'RL' में इनपुट के वर्तमान वर्ण की तलाश करते हैं। str.findरिटर्न -1 अगर यह कैरेक्टर नहीं मिलता है, तो यह एक आर को 0, एक एल को 1 और कुछ को -1 में बदल देता है। बेशक, हमारे पास एकमात्र अन्य इनपुट एम हो सकता है, लेकिन यह हर चीज के लिए काम करने के लिए कम अक्षर है।

हम उस संख्या का उपयोग उस सूची के लिए करते हैं जो हमने बनाई थी। पायथन सूची सूचकांक अंत में शुरू होता है यदि वे नकारात्मक हैं, तो हम पहला तत्व प्राप्त करते हैं यदि इनपुट आर है, तो दूसरा अगर यह एल है, और अंतिम अगर यह एम है। सुविधा के लिए, मैं मान लेने वाला हूं। हम उत्तर का सामना कर रहे हैं, लेकिन एक समान सिद्धांत अन्य दिशाओं के लिए लागू होता है।

हम जिन संभावित मूल्यों के साथ काम कर रहे हैं 'd+', वे आर के लिए हैं , 'd-'एल के लिए और 'y+'एम। उसके बाद, हम '=1;d=d%4'प्रत्येक के अंत में संलग्न हैं । इसका मतलब है कि हमारे संभावित मूल्य हैं ...

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

यह मान्य अजगर कोड है! यह मान्य अजगर कोड है जो कि हम उन इनपुट पात्रों में से प्रत्येक के लिए क्या करना चाहते हैं! ( d=d%4भाग सिर्फ हमारी दिशाओं को समझदार रखता है। फिर से, इसे हर बार करने की आवश्यकता नहीं है, लेकिन यह कम अक्षर है।)

हमें बस इतना करना है कि हम प्रत्येक वर्ण के लिए प्राप्त कोड को निष्पादित करें, इसे प्रिंट करें (हमारी दिशा एक स्ट्रिंग में परिवर्तित करें), और हम कर चुके हैं!


1

सी - 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

हास्केल - 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 digitMUCH LOL - SUCH WOW
tomsmeding

इनपुट का बंटवारा और readकई बार उपयोग करने से अधिक पात्रों को पार्स का उपयोग करने के लिए ले लिया ...
gxtaillon

1

बैश + कोरुटिल्स, 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

पॉवरशेल, 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है कि काम करने के लिए काम करता है (या मैं उपसर्ग करना होगा कि साथ होना चाहिए था $और ख) 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, MऔरR किसी भी सशर्त बयान का उपयोग करने से बचने के लिए।

इसे आइडोन में आज़माएं


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]

मूल से मैं बदल गई चीजें:

अलियासड रॉ_इनपुट, ने v [d] शब्दकोश को बदल दिया, जो किसी भी सूची में होना चाहिए, कुछ स्ट्रिंग चयन के लिए, उपयोग किया गया %=

संपादित करें: 21 अक्षरों को बचाने के लिए टपल अनपैकिंग और इवल (रॉ_इनपुट ()) == इनपुट () का उपयोग किया।

भारी रूप से @undergroundmonorail से उधार लिया गया था, लेकिन बहुत सुधार के साथ।


अच्छा! मुझे यह बहुत पसंद है।
अंडरग्राउंडोरेल

0

बैश / SHELF ,243 235

" SHE ll go LF " बैश के लिए एक गोल्फ पुस्तकालय है जो कुछ उपयोगी उपनाम प्रदान करता है। यह एक मान्य उत्तर है क्योंकि पुस्तकालय मौजूद था और चुनौती पोस्ट किए जाने से पहले 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 अन्यथा, यह तब इसके साथ अन्य आदेशों को जंजीर कर सकता है &&और ||

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 के अंतिम तत्व के लिए केस ब्लॉक (दिशा रोवर इंगित कर रहा है। तदनुसार निर्देशांक बदलें। फिर $ 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उन्हें पायथन में चाहिए, यदि आपको उनकी आवश्यकता है।
जॉय

@ अच्छा बात है, लेकिन मुझे नहीं लगता कि 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

मुझे यकीन नहीं था कि इनपुट और आउटपुट स्ट्रिंग प्रारूप कितना लचीला था, इसलिए मैंने यह सुनिश्चित किया कि यह बिल्कुल उदाहरण की तरह दिखे (माइनस द प्रोमेट्स, बेशक), लेकिन इसमें बहुत सारे अतिरिक्त अक्षर जोड़े गए। 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)));

एसटीडीआईएन में इनपुट, उदाहरण के लिए:

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

टर्नररी इफ्स के भारी उपयोग से कार्यान्वयन।

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

हम निर्देशकों की जोड़ी को संग्रहीत करने के लिए पायथन के अंतर्निहित जटिल संख्या प्रकार का उपयोग करते हैं। दिशा की गणना काल्पनिक इकाई 1jको शक्ति की ओर ले जाकर की जाती है d, जो दिशा 4 को संग्रहीत करती है। घूर्णन को वृद्धी या अपघटन द्वारा किया जाता है d। अभिव्यक्ति 'ML'.find(c)राशि हम परिवर्तन करना चाहते हैं देता है d: 1के लिए L, 0के लिए M, और -1के लिए (नहीं मिला के लिए डिफ़ॉल्ट) R

अजगर एक छोटी तरह से एक टपल करने के लिए एक जटिल संख्या परिवर्तित करने के लिए नहीं है, तो हम करने के लिए महंगा कॉल करने के लिए है .realऔर .imag

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.