রবোজল দোভাষী


10

আপনার কাজটি হ'ল একটি রোবজেলা দোভাষী লিখুন। আপনি যদি গেমটির সাথে পরিচিত না হন তবে দয়া করে ভিডিওটি robozzle.com এ দেখুন বা নীচে আমার বিবরণটি পড়ুন।

একটি রোবট লাল, সবুজ, নীল বা কালো বর্ণের স্কোয়ারের আয়তক্ষেত্রাকার গ্রিডে বাস করে। কালো স্কোয়ারগুলি অ্যাক্সেসযোগ্য। অন্যগুলি অ্যাক্সেসযোগ্য এবং তাদের মধ্যে কিছু তারা রয়েছে। লক্ষ্যটি হল কালো স্কোয়ারে পা না ফেলে বা মানচিত্রটি না পড়েই সমস্ত তারা সংগ্রহ করা। রোবটটি একটি স্কোয়ার দখল করে এবং একটি নির্দিষ্ট দিকের মুখোমুখি হয় - বাম, ডান, উপরে বা নীচে। এটি সাবরুটাইনস এফ 1, এফ 2, ..., এফ 5-তে বিভক্ত সমাবেশ-জাতীয় নির্দেশাবলী অনুসরণ করে। একটি নির্দেশ হ'ল একটি শিকারী ("কিছুই নয়", "লাল যদি লাল", "সবুজ গায়ে" "," যদি নীল হয় ") এবং একটি ক্রিয়া (" এগিয়ে যান "," বাম দিকে ঘুরুন "," ডানদিকে ঘুরুন "), "বর্তমান বর্গাকার লাল রঙ করুন", "এটি সবুজ রঙ করুন", "এটি নীল রঙ করুন", "কিছুই করবেন না", "এফ 1 কল করুন", ..., "কল করুন এফ 5")। সাবরুটাইনগুলিতে কল একটি স্ট্যাক ব্যবহার করে এবং পুনরাবৃত্ত হতে পারে। প্রচলিত প্রোগ্রামিংয়ের মতো, সাব্রোটিনের শেষ নির্দেশ শেষ হওয়ার পরে, সাব্রুটিনকে ডাকা হয়েছিল এমন জায়গা থেকে কার্যকর করা হয়। এফ 1 এর প্রথম নির্দেশনা থেকে মৃত্যুদন্ড শুরু হয় এবং রোবটটি তারকাদের সাথে সমস্ত স্কোয়ার পরিদর্শন না করা অবধি অব্যাহত থাকে বা রোবটটি যখন কোনও কালো বর্গাকারে বা মানচিত্রের বাইরের দিকে যায় বা 1000 নির্দেশাবলী কার্যকর করা হয় (ব্যর্থ পূর্বাভাস দেয় এবং "কিছুই না করে" ক্রিয়া করে) গণনা করবেন না) বা কার্যকর করার জন্য আর কোনও নির্দেশনা নেই (স্ট্যাক আন্ডারফ্লো)।

ইনপুট:

  • a- একটি 12x16 অক্ষর ম্যাট্রিক্স (সাধারণত আপনার ভাষায় উপস্থাপন করা হয়, যেমন স্ট্রিংগুলির অ্যারে) যা মানচিত্রকে এনকোড করে - '#'অ্যাক্সেসযোগ্য (কালো) স্কোয়ারের '*'জন্য, তারার সাথে স্কোয়ারের '.'জন্য, বাকি অংশের জন্য

  • c- অ্যাক্সেসযোগ্য স্কোয়ারগুলির বর্ণ বর্ণনা করে এমন একটি 12x16 অক্ষরের ম্যাট্রিক্স - 'R'(লাল), 'G'(সবুজ), বা 'B'(নীল)। অ্যাক্সেসযোগ্য স্কোয়ারগুলি তিনটির একটি স্বেচ্ছাসেবক চিঠি দ্বারা প্রতিনিধিত্ব করা হবে।

  • yএবং x- রোবটের 0 ভিত্তিক সারি এবং কলাম; a[y][x]হতে গ্যারান্টিযুক্ত হয়'.'

  • d- অভিমুখ রোবট হয় মুখোমুখি: 0 1 2 3অধিকার জন্য, নিচে, অর্থাত প্রতি বাম আপ, (y,x+1), (y+1,x), (y,x-1),(y-1,x)

  • f- একটি একক স্ট্রিং, F1 ... F5 এর সংক্ষিপ্ত বাস্তবায়ন। প্রতিটি বাস্তবায়ন হ'ল প্রিডিকেট-অ্যাকশন জোড়ার (সম্ভবত শূন্য) ক্রমানুসারে (সাব্রোটিনে সর্বাধিক 10 জোড়া), এর সাথে সমাপ্ত হয় '|'

    • পূর্বাভাস: '_'কোন, 'r'লাল, 'g'সবুজ, 'b'নীল

    • ক্রিয়া: 'F'এগিয়ে 'L'যান, বাম 'R'দিকে ঘুরুন, ডানদিকে ঘুরুন, 'r'লাল রঙ করুন, 'g'সবুজ রঙ করুন, 'b'নীল রঙ করুন, '1'F1 কল করুন ..., '5'F5 কল করুন, '_'কিছুই করবেন না

উপরের মতো আপনাকে নিজের ইনপুটগুলির নাম রাখতে হবে না, তবে তাদের মানগুলি অবশ্যই নির্দিষ্ট হিসাবে সুনির্দিষ্ট হতে হবে।

আউটপুট: 1(বা true) যদি রোবট নিয়ম অনুসারে সমস্ত তারা সংগ্রহ করে, 0( false) অন্যথায়।

উদাহরণ :

a=["################","################","##*....*...*#.##","##.####.#####.##","##.####.#####.##","##.####*...*#.##","##.########.####","##*........*#.##","################","################","################","################"]
c=["RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRBBBBRGGGGRRRR","RRBRRRRGRRRRRRRR","RRBRRRRGRRRRRRRR","RRBRRRRRGGGBRRRR","RRBRRRRRRRRGRRRR","RRRBBBBGGGGBRBRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR"]
y=2; x=6; d=2

// and then depending on "f":
f="_FrLg2_1|_FbLrR_2||||" // result:1
f="_FrRg2_1|_FbLrR_2||||" // result:0 (stepped on a black square)
f="_FrLrL_1|_FbLrR_2||||" // result:0 (1000-step limit exceeded)
f="_FrLg2__|________||||" // result:0 (stack underflow)

"পেইন্ট" নির্দেশাবলী জড়িত অন্য একটি উদাহরণ :

a=["#***************","#*###*###*###*##","#*###*###*###*##","***#***#***#***#","***#***#***#***#","*###*###*###*###","***#***#***#***#","***#***#***#***#","***#***#***#***#","*###*###*###*###","*.*#***#***#***#","***#***#***#***#"]
c=["RGGGGGGGGGGGGGGG","RBRRRGRRRGRRRGRR","RBRRRGRRRGRRRGRR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BRRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BGRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR"]
y=10; x=1; d=0
f="_2_R_R_1|_FgRgFgFg3rRr4b2_Fgb|_F_F_R|_2_L_r||"
// result:1

আপনার নিজের পরীক্ষা তৈরি করতে, robozzle.com এ তালিকা থেকে একটি ধাঁধাতে যান , এটি সমাধান করার চেষ্টা করুন (বা এটি সমাধান করবেন না), আপনার ব্রাউজারে F12 চাপুন, জেএস কনসোলে টাইপ করুন:

r=robozzle;s=JSON.stringify;with(r.level)console.log('a='+s(Items)+'\nc='+s(Colors)+'\ny='+RobotRow+'\nx='+RobotCol+'\nd='+RobotDir+'\nf='+s(r.encodeSolution()))

এবং আপনার ভাষার জন্য ফলাফল পুনরায় ফর্ম্যাট করুন।

সবচেয়ে কম জয়। কোনও ফাঁক নেই।


1
আমরা কি সরবরাহের পরিবর্তে ডেটা উপস্থাপনের জন্য কোনও স্বতন্ত্র অক্ষর ব্যবহার করতে পারি?
হাইপারনিউটারিনো

1
"লুপ এটি" চ্যালেঞ্জের জন্য আপনার এপিএলের উত্তরের জন্য, আপনি জটিল মাত্রা হ্রাস করে শেষ কোণ মানটি বাছাই করতে পারেন।
ব্যবহারকারী 202729

1
@ ব্যবহারকারী202729 উহ, আমি এখানে চ্যালেঞ্জ সম্পর্কে কোনও মন্তব্য আশা করিনি :) আপনার ধারণাটি কার্যকর, ধন্যবাদ! আমি চরিত্রের গণনাটিকে খুব বেশি অসম্মানজনক না করে এটিকে বাস্তবায়নের চেষ্টা করব।
ngn

1
আমরা কী অক্ষরের ম্যাট্রিকগুলি স্থান এবং অক্ষরের জোড়গুলির তালিকা হিসাবে নিতে পারি?
0 '

1
@ 0 'আমি যে নীতিটি এখানে অনুসরণ করছি (হাইপার নিউট্রিনোর মন্তব্যটিও দেখুন) হ'ল রোবজল ডট কম এ ব্যবহৃত ইনপুট ফর্ম্যাটটির যতটা সম্ভব দূরে থাকা, তাই আমি ভয় করি এটি জোড়গুলির তালিকা না হওয়া উচিত।
ngn

উত্তর:


5

প্রোলোগ (এসডাব্লুআই) , 574 বাইট

Z*A:-findall(X^Y-D,(nth0(Y,Z,O),nth0(X,O,C),plus(32,C,D)),L),list_to_assoc(L,A).
N^C^G^[P,I|R]^F^X^Y^D:-map_assoc(\=(74),G);N<1e3,get_assoc(X^Y,G,J),J>67,put_assoc(X^Y,G,78,H),T=N+1,((I\=95,(P=95;get_assoc(X^Y,C,P)))->(between(49,53,I),plus(48,M,I),nth1(M,F,Q),append(Q,R,S),T^C^H^S^F^X^Y^D;member(I,`RL`),E is(D-I//3)mod 4,T^C^H^R^F^X^Y^E;I=70,(D=0,U is X+1;D=1,V is Y+1;D=2,U is X-1;D=3,V is Y-1),(U=X;V=Y),T^C^H^R^F^U^V^D;I>97,put_assoc(X^Y,C,I,W),T^W^H^R^F^X^Y^D);N^C^H^R^F^X^Y^D).
A+C+F+L:-A*G,C*B,split_string(F,"|","",P),maplist(string_codes,P,[M|N]),0^B^G^M^[M|N]^L.

এটি অনলাইন চেষ্টা করুন!

এটি একটি প্রাকটিকটিকে সংজ্ঞায়িত করে যে যখন সমস্ত তারা সফলভাবে সংগ্রহ করা হয় এবং অন্যথায় ব্যর্থ হয় তখন তাকে সফল বলা হয়। সম্পৃক্ত যেমন আর্গুমেন্ট লাগে: a+c+f+x^y^d.aএবং cঅবশ্যই ব্যাকটিক উদ্ধৃত স্ট্রিংগুলির তালিকা থাকতে হবে, তবে fঅবশ্যই একটি ডাবল উদ্ধৃত স্ট্রিং হওয়া উচিত।

ব্যাখ্যা

এই প্রোগ্রামটি তিন predicates রয়েছে, */2, ^/2, এবং +/2*/2Predicates যা প্রথম লাইনে সংজ্ঞায়িত করা হয় ইনপুট প্রক্রিয়াকরণ অংশ জন্য দায়ী। ^/2সম্পৃক্ত যাও recursively হিসাব কিভাবে রোবট প্যাচসমূহ ধাপে ধাপে এবং সফল হলে রোবট আইনত সমস্ত তারকা সংগ্রহ এবং অন্যথায় ব্যর্থ। +/2সম্পৃক্ত প্রোগ্রামের প্রধান সম্পৃক্ত এবং জন্য ইনপুট দেয়ঃ ^/2থেকে কিছু সাহায্যে সম্পৃক্ত */2সম্পৃক্ত। নোট করুন যে এই পূর্বাভাসগুলির প্রত্যেকটিতে প্রযুক্তিগতভাবে কেবল দুটি যুক্তি লাগে তবে অপারেটর এবং প্যাটার্ন ম্যাচিং ব্যবহার করে তারা আচরণ করতে পারে যেন তাদের আরও যুক্তি রয়েছে (আমি এখানে এই বিষয়টিকে আরও গভীরতার সাথে আলোচনা করি )।

*/2

Z*A:-findall(X^Y-D,(nth0(Y,Z,O),nth0(X,O,C),plus(32,C,D)),L),list_to_assoc(L,A).

এই শিকারী দুটি আর্গুমেন্ট লাগে। প্রথমটি হ'ল অক্ষর কোডের তালিকার একটি তালিকা (এইভাবে প্রোলোগ ব্যাকটিককে উদ্ধৃত স্ট্রিংকে পার্স করে)। দ্বিতীয়টি 12x16 মানচিত্রে পয়েন্টগুলি থেকে একটি সম্মিলিত মানচিত্র (হিসাবে উপস্থাপিত)X^Y থেকে 32 প্লাস অক্ষর কোডের তালিকার তালিকায় সেই সাথে অক্ষর কোডটি সঞ্চিত । প্রতিটি অক্ষর কোডগুলিতে 32 টি যুক্ত করা হয়েছে যাতে রঙ ম্যাট্রিক্সের জন্য এটি বড় হাতের বর্ণকে ছোট হাতের বর্ণগুলিতে পরিণত করবে।

এটি যেভাবে এটি করে তা হল পয়েন্টের জোড়গুলির তালিকা এবং সেই সময়ে অক্ষর কোডগুলি তৈরি করে findall/3 । এরপরে list_to_assoc/2এটি বিন্দু থেকে সেই সময়ে অক্ষর কোডের জন্য সংশ্লিষ্ট সাহসী মানচিত্র তৈরি করতে ব্যবহার করে।

findall/3সম্পৃক্ত একটি builtin তার প্রথম যুক্তি, তার দ্বিতীয় যুক্তি হিসেবে একটি গোল এবং তার তৃতীয় আর্গুমেন্ট হিসাবে একটি তালিকা হিসাবে একটি "টেমপ্লেট" নেয়। প্রেডিকেটটি টেমপ্লেটের সমস্ত সম্ভাব্য মান দিয়ে তালিকাটি পূরণ করে যা লক্ষ্যকে সফল করার কারণ করে। অপারেটর প্রাধান্য, যে প্রেরণ করা টেমপ্লেট দরুন findall/3মধ্যে */2যেমন পার্স করা হয় (X^Y)-D-তাই ফর্মা বিন্দু এর অবস্থান (প্রতিনিধিত্ব করে অপারেটর Prolog দুটি মান একজোড়া প্রতিনিধিত্ব করে X^Y32 প্লাস পয়েন্ট এর চরিত্রের কোড সঙ্গে যুক্ত করা) ( D)। নোট করুন যে ^পয়েন্টটি উপস্থাপনে ব্যবহৃত ^/2কোনওভাবেই প্রাকটিকের সাথে সংযুক্ত নয় ।

আসুন আমরা লক্ষ্যটি বিবেচনা করি যা findall/3ভবিষ্যদ্বাণীকে পাস হয়েছে ।

nth0(Y,Z,O),nth0(X,O,C),plus(32,C,D) % Note that the O (oh) is not a 0 (zero)

লক্ষ্যটিতে তিনটি পূর্বাভাস থাকে যার প্রতিটি লক্ষ্য সফল হওয়ার জন্য সফল হওয়া প্রয়োজন। nth0/3(সম্পৃক্ত যা দুইবার ব্যবহার করা হয় তালিকার একটি নির্দিষ্ট সূচিতে মান পেতে ব্যবহার করা হয় 0তার নামে ইঙ্গিত শূন্য সূচীবদ্ধ করা হয়)। এটির প্রথম কলটি Yঅক্ষর ম্যাট্রিক্সের তম সারিটি সংরক্ষণ করে Oযখন দ্বিতীয় কলটি Xসেই সারির মধ্যম অক্ষর সংরক্ষণ করে Cplus/3যদি এর প্রথম দুটি যুক্তি তৃতীয় যুক্তির সাথে যোগ হয় তবে চূড়ান্ত প্রাকটিকেট সফল হয়। এই জোড়ের মধ্যে অক্ষর কোডটি তৈরি করতে ব্যবহৃত হয় অক্ষরের ম্যাট্রিক্সের অক্ষর কোডের চেয়ে 32 টি বৃহত্তর যা উপরে বর্ণিত হিসাবে সমস্ত বড় হাতের অক্ষরকে ছোট হাতের অক্ষরে পরিণত করবে।

অবশেষে findall/3সমস্ত X^Y-Dসংমিশ্রণগুলি সংরক্ষণ করে যা তার লক্ষ্যটিকে সেই তালিকাটিতে সাফল্যের কারণ Lহিসাবে তৈরি করে যা সহযোগী মানচিত্রটি তৈরি হয়েছিল।

আরও শীঘ্রই আসছে ...


4

জাভাস্ক্রিপ্ট (ES6), 298 276 264 বাইট

@Ngn- এর জন্য 8 টি বাইট সংরক্ষণ করা হয়েছে

অক্ষরের অ্যারেগুলির অ্যারে (a,c,x,y,d,f)কোথায় aএবং ইনপুট হিসাবে নেয় c। রিটার্ন 0বা 1

(a,c,x,y,d,f,k=1e3)=>(g=(F,p=0,s=f.split`|`[F],r=a[y])=>!k|!r|x&16||r[x]<'$'?2:/\*/.test(a)?(r[x]=o=0,(I=s[p+1],P=s[p])&&(P<'b'|P==c[y][x].toLowerCase()&&I!='_'&&k--?+I?o=g(I-1):I=='L'?d--:I=='R'?d++:I<'b'?y+=(d&=3,x-=~-d%2,2-d)%2:c[y][x]=I:0,o||g(F,p+2))):1)(0)&1

পরীক্ষার মামলা

মন্তব্য

(                                           // main function taking:
  a, c, x, y, d, f,                         //   - input variables
  k = 1e3                                   //   - k = instruction counter
) => (                                      //
  g = (                                     // g = recursive execution function, taking:
    F,                                      //   - F = subroutine id
    p = 0,                                  //   - p = instruction pointer
    s = f.split`|`[F],                      //   - s = instruction string
    r = a[y]                                //   - r = current row in a[]
  ) =>                                      //
    !k |                                    // if we've executed 1000 instructions
    !r | x & 16 ||                          // or we've felt out of the map
    r[x] < '$' ?                            // or we've reached a black square:
      2                                     //   exit with error code 2
    :                                       // else:
      /\*/.test(a) ? (                      //   if there are still some stars:
        r[x] = o = 0,                       //     mark the current cell as visited
        (I = s[p + 1], P = s[p]) &&         //     I = instruction, P = predicate
        (                                   //     if P is defined:
          P < 'b' |                         //       if the predicate is '_'
          P == c[y][x].toLowerCase()        //       or it matches the color of the cell
          && I != '_'                       //       and the instruction is not '_',
          && k-- ?                          //       then decrement k and:
            +I ?                            //         if I is '1' ... '5':
              o = g(I - 1)                  //           process call to subroutine
            :                               //         else:
              I == 'L' ?                    //           if I is 'L':
                d--                         //             turn left
              :                             //           else:
                I == 'R' ?                  //             if I is 'R':
                  d++                       //               turn right
                :                           //             else:
                  I < 'b' ? (               //               if I is not a color:
                    y += (                  //                 I must be 'F',
                      d &= 3,               //                 so make the bot advance
                      x -= ~-d % 2,         //                 by updating x
                      2 - d                 //                 and y
                    ) % 2                   //
                  ) :                       //               else:
                    c[y][x] = I             //                 paint the current cell
          :                                 //       else:
            0,                              //         do nothing
          o ||                              //       provided that o is equal to 0,
          g(F, p + 2)                       //       go on with the next instruction
        )                                   //     end of instruction execution
      ) :                                   //   else:
        1                                   //     success: return 1
  )(0) & 1                                  // initial call to the subroutine F1

x+='2101'[d&3]-1,y+='1210'[d&3]-1->d&=3,x+=(1-d)%2,y+=(2-d)%2
এনজিএন

1
xসবচেয়ে 1 দ্বারা পরিবর্তন তাই আমি মনে করি আপনি প্রতিস্থাপন করতে পারেন x&~15সঙ্গেx&16
ngn

1

এপিএল (ডায়ালগ ক্লাসিক) , 236 233 বাইট

-৩ এরিক দ্য আউটগোল্ফারকে ধন্যবাদ

এখন আমি বোনাসটি ছেড়ে দিয়েছি, আমি নিজের চ্যালেঞ্জের একটি নমুনা সমাধান পোস্ট করছি। এখানে উন্নতির জন্য জায়গা আছে - অনুলিপি এবং আরও গল্ফ বোধ করতে পারেন।

a c r d f←⎕⋄c819cF0,('|'1f)/⍳≢ftn0
{~(⊂r)∊⍳⍴a:0'#'=ra:0p q2f↓⍨⊃⌽t⋄(_p'|')∧×≢t:0_:∇t↓←¯1⋄(⊃⌽t)+←2⋄~p'_',rc:∇0n+←1n>999:0⋄(ra)←'.'⋄~'*'a:1r+←(q'F'11 90j1*dd+←4|'.R.L'qq'rgb':∇(rc)←qq∊⎕d:∇t,←F[⍎q]⋄∇0}0

এটি অনলাইন চেষ্টা করুন!

উপরের মত একই, মন্তব্য সহ প্রসারিত:

io0                    0-based indices (not counted in the score)
a c r d f←⎕              decompose eval'ed input (⎕) into variables
c←819⌶c                 ⍝ make c lowercase
F←0,('|'=¯1⌽f)/⍳≢f      ⍝ split f at the '|'-s
t←n←0                   ⍝ t:stack, n:step counter
{                       ⍝ lambda
  ~(⊂r)∊⍳⍴a:0           ⍝ if the robot is off the map, return 0
  '#'=r⌷a:0             ⍝ if the robot is on a wall, return 0
  p q2f↓⍨⊃⌽t           current instruction - p:predicate, q:action
  (_p'|')∧1≥≢t:0       if at end of func and stack is empty, return 0
  _:∇t↓←¯1               if at end of func, pop from stack and recurse
  (⊃⌽t)+←2               increment program counter (top of stack)
  ~p'_',rc:∇0          if predicate doesn't match cell colour, recurse
  n+←1⋄n>999:0          ⍝ if too meany steps, return 0
  (r⌷a)←'.'             ⍝ consume star
  ~'*'∊a:1              ⍝ if no more stars left, return 1
  r+←(q≡'F')×11 9○0j1*d ⍝ if action is F, move forward
  d+←4|'.R.L'⍳q         ⍝ if action is L or R, turn left or right
  q∊'rgb':∇(r⌷c)←q      ⍝ if action is paint (r,g,b), do it
  q∊⎕d:∇t,←F[⍎q]        ⍝ if action is F1...F5, push on stack and recurse
  ∇0                    ⍝ action is nop (_), recurse
}0                      ⍝ call the lambda (argument will be ignored)


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