চলুন মঙ্গলের রোভারটি সরানো যাক!


17

সারসংক্ষেপ

কাজটি হ'ল মঙ্গল রোভার নেভিগেট করা এবং এর চূড়ান্ত স্থানাঙ্ক এবং দিক নির্দেশনা।

ইনপুট:

প্রথম ইনপুট:

প্রথমে আপনার প্রোগ্রামটি অবশ্যই ইনপুট নিতে হবে যা নিম্নলিখিত ফর্ম্যাটে থাকবে:

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

দিক হতে হবে: Nবা Sবা Eবা W(শুরু উত্তর, দক্ষিণ, পশ্চিম, প্রাচ্যের চিঠি)

উদাহরণ: 10,20,N(x = 10, y = 20, দিক = এন (উত্তর))

দ্বিতীয় ইনপুট:

দ্বিতীয় ইনপুট সিরিজের নিয়ে গঠিত 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
জনপ্রিয়তা-প্রতিযোগিতার পরিবর্তে কোড-গল্ফ হিসাবে এটি আরও আকর্ষণীয় হতে পারে । আদর্শের ব্যবহারের জন্য কোন ধরণের বোনাস দেওয়া হয়?
কাইল কানোজ

@ কাইলক্যানোস আমি মানুষ এটি ব্যবহার করতে দেখেছি, তাই সবেমাত্র ব্যবহৃত হয়েছে। এটি পুনঃপ্রকাশিত;)
অমিত জোকি

6
আপনি জানেন, আপনি যদি আপনার চ্যালেঞ্জগুলির বিষয়ে নেতিবাচক প্রতিক্রিয়া অনুভব করছেন তবে প্রথমে সেগুলি স্যান্ডবক্সের মাধ্যমে চালানোর চেষ্টা করুন
মার্টিন ইন্ডার

1
@ জিওবিটস ধন্যবাদ স্পষ্টভাবে স্থির।
অমিত জোকি

উত্তর:


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

নোট করুন যে আদর্শের সাথে সংযুক্ত সমাধানটি একটি অক্ষর দীর্ঘতর ( 3 লাইনের 1.iপরিবর্তে 1i)। এর কারণ হ'ল আইডিয়োন কেবল রুবি ১.৯ সমর্থন করে, যা জটিল আক্ষরিক জন্য শর্ট হ্যান্ড সিনট্যাক্সের অনুমতি দেয় না।


এটি আরও গল্ফ দেখার অপেক্ষায় :)
অমিত জোকি

কিছু অক্ষর সংরক্ষণ করতে আপনি এর x,y,i=eval"[#{gets}]"সাথে প্রতিস্থাপন করতে পারেন eval"x,y,i="+gets
সুস্পষ্ট

@voidpigeon: আমি নিশ্চিত যে আসলে কারণে কাজ করে না eval: এর scoping নিয়ম ruby -e 'eval"x=1";p x'একটি ছোঁড়ার NameErrorজন্য xp x। ধ্রুবকগুলি ( eval"X,Y,I="+gets) ব্যবহার করার সময় এটি কাজ করে , তবে যেহেতু আমি সংশোধন করছি i, i=Iধ্রুবকটিকে নতুন করে সংজ্ঞায়িত করার বিষয়ে সতর্কতাগুলি রোধ করতে অতিরিক্ত অতিরিক্ত প্রয়োজন । তবে সম্ভবত আমরা বিভিন্ন রুবি সংস্করণ সম্পর্কে কথা বলছি?
ভেন্টোরো

1
@ ভেন্টো আপনি ঠিক বলেছেন আমি এটি আইআরবিতে পরীক্ষা করেছি এবং এটি আমাকে আউটপুট হিসাবে যথাযথ অ্যারে দিয়েছে তাই আমি ধরে নিলাম এটি কাজ করেছে। যদিও আমি সত্যই যদিও ইওল পদ্ধতির পছন্দ করি।
সুস্পষ্ট

@voidpigeon আহ, তুমি ঠিক আছে, যে আসলে একটি কিছুটা ভিন্ন অপ্টিমাইজেশান অনুমতি দেয়: x,y,i=eval"*a="+gets। ধন্যবাদ!
ভেন্টোরো

5

জাভাস্ক্রিপ্ট ( ES6 ) 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


আমার সি উত্তরটি দেখুন। সম্ভবত জি অ্যারের প্রয়োজন নেই
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

সম্পাদন করা স্থির বাগটি , সম্ভবত d এর জন্য পরিসরের রিটার্ন মানের বাইরে

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(1,2,'N','MRMLM')

আউটপুট

[ 2, 4, "N" ]

ভাল লাগছে, এটি দেখতে অনেকটা আমার সমাধানের মতো।
nderscore

3

সি 164 180 186

সম্পাদনা করুন ফিক্সড ইনপুট ফর্ম্যাট এবং সরানো 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]);}

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 মান অপব্যবহারের পদ্ধতির ব্যবহারের জন্য @ এডসি 65 এর সমাধানটির একটি টুইট।

বিশেষ করে:

  • d%8%5অক্ষর মানচিত্র ENWSথেকে 0,1,2,3যথাক্রমে
  • c%23পালাক্রমে Lমধ্যে 7, Mমধ্যে 8এবং R13. মধ্যে কারণ d(দিক পরিবর্তনশীল) সবসময় গেলিক ভাষার 4 ব্যবহার করা হয়, এই কার্যকরভাবে তোলে Lঅ্যাড -1 গেলিক ভাষার 4, M0 গেলিক ভাষার 4 যোগ করুন, এবং R1 গেলিক ভাষার 4 যোগ করুন।
  • d&11 এর জন্য NSএবং 0 এর জন্যEWদিকনির্দেশের ।
  • d&2দিকনির্দেশের জন্য 2 WSএবং 0NE
  • ~-(d&2)দিকনির্দেশের জন্য 1 WSএবং -1 হয় NE
  • c%21 এর জন্য Mএবং 0 এর জন্য LR

কেন 23, এবং কীc%(2*(1-(d&2)))

@ টলোস: কিছু ব্যাখ্যা যুক্ত করেছেন। 2 টি অক্ষর দ্বারা সংক্ষিপ্তও করা হয়েছে :)
nneonneo

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

এই চ্যালেঞ্জটি লোগো-স্টাইলের কচ্ছপ গ্রাফিক্সের জন্য খুব স্বাভাবিকভাবেই ম্যাপ করে, যার জন্য অবশ্যই অজগরের একটি আমদানি রয়েছে।

এসটিডিএন থেকে দুটি লাইন থেকে ইনপুট পড়ে।

আউটপুট:

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

এই প্রোগ্রামটি সম্পর্কে আমি বিশেষত যা পছন্দ করি তা হ'ল এটি গ্রাফিকভাবে রোভারের পথ প্রদর্শন করে। exitonclick()প্রোগ্রামের শেষে যুক্ত করুন যাতে গ্রাফিকাল আউটপুট ব্যবহারকারীর ক্লিক না হওয়া পর্যন্ত স্থায়ী থাকে:

এখানে চিত্র বর্ণনা লিখুন

আমি নিশ্চিত যে এটিকে আরও লক্ষণীয় করে তোলা যায় - কোনও পরামর্শ স্বাগত! আমি এই সিডব্লিউ তৈরি করছি, কারণ আমি আশা করি সম্প্রদায়টি আরও কিছুটা গল্ফ করতে পারে।

পরিবর্তন করুন:

  • s এখন একটি তালিকা, ইনলাইনড।
  • লুপের বডিটির জন্য ব্যবহৃত টেরিনারি।
  • ইনলাইন করা এন, অপ্রয়োজনীয় স্লাইস সরানো।
  • আমদানির বিবৃতিতে অপ্রয়োজনীয় স্থান সরানো হয়েছে।
  • বিল্টিন স্ট্রিং পদ্ধতিটি ব্যবহার করতে আমদানি স্ট্রিং সরানো হয়েছে
  • কাঁচা_পিন্ডকে সংক্ষিপ্ত করতে পাইথন 3 এ স্যুইচ করা হয়েছে

@ আইস্যাচ ধন্যবাদ - দুর্দান্ত গল্ফিং!
ডিজিটাল ট্রমা

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


আমার পূর্ববর্তী প্রচেষ্টা

৮৪ টি চর:

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

৮৮ টি চর:

~: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

১১6 টি চর:

[~])\~"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=

বিটিডব্লিউ: পোস্টটির পুরানো সংস্করণগুলি সংরক্ষণ করা হয়েছে যাতে আপনি দেখতে পাচ্ছেন যে অতীতে কী ছিল (কেবল "সম্পাদিত
এক্সএক্সএক্সএক্সএক্স

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 ssshh, আত মটরশুটি ঝরা
Teun প্রন্ক

@ জনডভোরাকের মতো আমি বলেছি, এটি কোড-গল্ফ
তেউন প্রোঙ্ক

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(',') কিন্তু ইনস এবং স্ট্রিংগুলির মধ্যে কাস্টিং ইস্যুগুলি জুড়ে এসেছি। আদর্শভাবে আমি চলন্ত অবস্থানের সাথে পুরানো অবস্থান যুক্ত করতে চেয়েছিলাম ... ওহ এখন কোড-গল্ফ। ওহ ভাল যাই হোক না কেন, আমি এটি এখানে রেখে যাব, অনুপ্রেরণা দিতে পারে। সূচিগুলির প্রাথমিক বিয়ারিংয়ের ম্যাপিংয়ের পরে আমি অন্যান্য ধারণাগুলি যে দিকের মডুলো 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

পাইথন ২.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, y ইন yএবং আমাদের দিকনির্দেশের প্রথম অক্ষরটি এতে সঞ্চিত থাকে d

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

তারপরে আমরা কেবল কর্ডগুলি অন্তর্নির্মিত করি। (আমি হতবাক হয়ে গিয়েছিলাম যে আমি দুটি স্ট্রিংকে ints এ রূপান্তর করার আরও ভাল উপায়ের কথা ভাবতে পারিনি I আমি চেষ্টা করেছি 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 দিয়ে বৃদ্ধি পায় increases সুতরাং এই অভিধানটি 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]সরাসরি তালিকায় রাখতে পারি। এটি যদি কাজ করে তবে আমার কাছে কয়েক দফা বাঁচাবেন, তবে আমি এই ব্যাখ্যাটি না করা পর্যন্ত এটি পরীক্ষা করার মতো মনে করি না, কারণ আপনারা সমস্ত কাজ করতে পারেন। (হ্যাঁ, এটি কাজ করেছে))

আমরা 'আরএল' স্ট্রিংয়ের ইনপুটটির বর্তমান অক্ষরটি সন্ধান করি। str.findঅক্ষরটি খুঁজে না পাওয়া গেলে -1 প্রদান করে, সুতরাং এটি একটি আর কে 0 তে 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অংশটি কেবল আমাদের দিকনির্দেশকে বুদ্ধিমান রাখে Again আবারও, এটি প্রতিবার করার দরকার হয় না, তবে এটি কম অক্ষরগুলি থাকে))

আমাদের যা করতে হবে তা হ'ল প্রতিটি চরিত্রের জন্য আমরা যে কোডটি পেয়েছি তা কার্যকর করা, এটি মুদ্রণ করা (আমাদের দিকটি আবার স্ট্রিংয়ে রূপান্তর করা), এবং আমরা শেষ করেছি!


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 digit
অনেকটা

ইনপুট বিভক্ত করা এবং 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 কারণ একটি পাইপলাইন ?দীর্ঘ, এখনও রয়েছে।

আমি প্রারম্ভিক ঘোষণায় সুস্পষ্ট প্রকারগুলি থেকেও মুক্তি পেতে পারি না কারণ আমার সেখানে মিশ্র প্রকার রয়েছে তাই খুব সহজ |%{+$_} সাহায্য করে না এবং অন্যান্য প্রতিটি বিকল্প দীর্ঘ।

কখনও কখনও আমি পাওয়ারশেলে ইনপুট হ্যান্ডলিংকে ঘৃণা করি।


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

L, Mএবং এর ASCII মানগুলিকে আপত্তি জানায়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 টি অক্ষর সংরক্ষণ করতে টিপল আনপ্যাকিং এবং ইভাল (কাঁচা_পিন্ড ()) == ইনপুট () ব্যবহার করুন।

@Undermonmonoreil থেকে প্রচুর orrowণ নেওয়া হয়েছে, তবে প্রচুর উন্নতি হয়েছে।


নিস! আমি এই অনেক পছন্দ।
আন্ডারগ্রাউন্ডোমোনাইল

0

ব্যাশ / শেল্ফ ,243 235

" সে কোনদিকে যাবো এলএফ " যা কয়েক দরকারী alias লেখা উপলব্ধ ব্যাশ জন্য একটি golfing লাইব্রেরী। লাইব্রেরিটির অস্তিত্ব থাকায় এবং চ্যালেঞ্জ পোস্ট হওয়ার আগে গিটহাবে ছিল বলে এটি একটি বৈধ উত্তর।

দুঃখিত, আমি আদর্শের কাজ করতে এটি পেতে পারি না।

কীভাবে চালাবেন

এটি প্রথম অবস্থানটি (নির্দিষ্ট হিসাবে কমা দ্বারা পৃথক; এটি কোডে প্রচুর অক্ষর যুক্ত করে) এবং স্ট্যান্ডার্ড ইনপুট সম্পর্কিত নির্দেশিকা গ্রহণ করে।

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তুলনার জন্য; যদি এটির দুটি আর্গুমেন্ট সমান এবং অন্যথায় 1 হয় তবে এটি 0 প্রদান করে, এটির পরে এটিতে কমান্ডযুক্ত অন্যান্য কমান্ড থাকতে পারে&& এবং এর||

y মত tr (কিন্তু মাধ্যমে সম্পন্ন sed)।

Yএটি sed '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 অক্ষর সহ গভীর কুরুচিপূর্ণ। যদি বর্তমান কমান্ডটি এম হয় তবে কমাগুলিকে s o এ স্পেসে পরিণত করুন, অ্যারেতে রূপান্তর করুন এবং $ z এ সংরক্ষণ করুন। তারপরে, switch z এর শেষ উপাদানটির জন্য একটি সুইচ ... কেস ব্লক করুন (রোভারটি নির্দেশ করছে দিক is ​​সেই অনুযায়ী স্থানাঙ্কগুলি পরিবর্তন করুন, তারপরে $ 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পিআইজি এটির সাথে পাইথন প্রোগ্রাম লেখার সময়, বা রেবমু (এএফএইইকি) এর সাথে একটি রেবোল প্রোগ্রাম লেখার সময়

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

পিএইচপি - 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)

সুস্পষ্ট ইনপুট গ্র্যাম্বল ছাড়াই, দিকের স্ট্রিংগুলিকে অভ্যন্তরীণ মান প্রদান করা স্ক্রিপ্ট আকারে উপকৃত হতে পারে। যাইহোক, এখানে পদ্ধতির পুরোপুরি কার্যকরী (তাই আমি বিশ্বাস করি)


পিপিসিজিতে আপনাকে স্বাগতম। এটি কোড-গল্ফ, তাই সংক্ষিপ্ত উত্তরটি জেতে। আপনি আপনার ভেরিয়েবলের নামগুলি একটি দীর্ঘ দীর্ঘ করে শুরু করতে পারেন।
ডিজিটাল ট্রমা

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 সঞ্চয় করে R ঘূর্ণনটি বৃদ্ধি বা হ্রাস দ্বারা করা হয় d। এক্সপ্রেশনটি 'ML'.find(c)সেই পরিমাণটি দেয় যা আমরা পরিবর্তন করতে চাই d: 1কারণL , এর 0জন্য Mএবং -1(পাওয়া যায় না এর জন্য ডিফল্ট) R

পাইথন অল্প উপায় tuple করার জন্য একটি জটিল সংখ্যা রূপান্তর করতে নেই, তাই আমরা করতে ব্যয়বহুল কল করতে হবে .realএবং .imag

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.