দিক পরিবর্তনকারীদের দ্বারা তৈরি একটি পথ আঁকুন


25

এই চ্যালেঞ্জটি একটি গ্রিডে স্থান নেয়।

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

এটি যার 10 x 10, তবে এটি কোনও আয়তক্ষেত্রাকার আকার হতে পারে।

এই গ্রিডে চারটি দিক রয়েছে। উপরে, নীচে, বাম এবং ডানদিকে।

টাস্কটি হ'ল একটি পথ আঁকাই যা প্রাথমিক স্তরের দিকের দিক দিয়ে শুরু করে। এই উদাহরণে, ইউ থেকে সরাসরি উপরের দিকে চলে যাবে

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|   U      |
+----------+

পথটি উপরের দিকে যাবে এবং পূর্ণ-স্টপ অক্ষর (।) দ্বারা গঠিত হবে, যতক্ষণ না এটি প্রাচীরের সাথে আঘাত করে, যখন এটি একটি তারকাচিহ্ন (*) দিয়ে শেষ হবে।

+----------+
|   *      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

পাথ শুরুর পাশাপাশি, দিক পরিবর্তনকারীও রয়েছে, ছোট ছোট দিকের দিকনির্দেশক দ্বারা প্রতিনিধিত্ব করা হয়।

+----------+
|          |
|          |
|          |
|   r.....*|
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

এছাড়াও, একটি বড় আকারের এক্স আমাদের বাধা দেয় যা পথটি শেষ করে দেবে।

+----------+
|          |
|          |
|          |
|          |
|   r...*X |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

বিধি

  • ইনপুটটি একটি ফ্রেমের সমন্বয়ে একটি স্ট্রিং থাকে, (| এবং - + অক্ষর সমন্বিত) অক্ষর সম্বলিত পথ সূচনা করে, পথ পরিবর্তন করে এবং বাধা দেয়।
  • আপনার কোডটিতে শুরু এবং দিক পরিবর্তনকারীদের দ্বারা বর্ণিত পথ অনুসরণ করতে পুরো স্টপ অক্ষর যুক্ত করা উচিত এবং যখন / কোনও পথে কোনও প্রাচীর বা বাধা দেখা দেয় তখন একটি তারকাচিহ্ন।
  • একাধিক পথ শুরু হতে পারে।
  • যদি পথটি একটি লুপের বর্ণনা দেয় তবে কোডটি ত্রুটি ছাড়াই এখনও শেষ হবে।
  • কোনও পাথ যদি কোনও পথ শুরুর সাথে মিলিত হয় তবে এটি একটি দিক পরিবর্তনকারী হিসাবে কাজ করবে।
  • দয়া করে এটি কোড গল্ফ, লো-বাইট কোড এবং কোনও স্ট্যান্ডার্ড লুফোলস নয়।
  • আমি সর্বদা অন-লাইন ইন্টারপ্রেটারের লিঙ্কগুলি পছন্দ করি।

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

1: সরল

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|   *      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

2: ডান পালা

+----------+
|          |
|          |
|          |
|   r      |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|   r.....*|
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

3: চৌরাস্তা

+----------+
|          |
|          |
|          |
|   r  d   |
|          |
| u    l   |
|          |
|          |
|   U      |
+----------+


+----------+
| *        |
| .        |
| .        |
| . r..d   |
| . .  .   |
| u....l   |
|   .      |
|   .      |
|   U      |
+----------+

4: 4 অতিক্রমকারী পথ

+----------+
|      D   |
|          |
|          |
|R         |
|          |
|         L|
|          |
|          |
|   U      |
+----------+


+----------+
|   *  D   |
|   .  .   |
|   .  .   |
|R........*|
|   .  .   |
|*........L|
|   .  .   |
|   .  .   |
|   U  *   |
+----------+

5: প্রথম লুপ

+----------+
|          |
|          |
|          |
|   r  d   |
|          |
|   u  l   |
|          |
|          |
|   U      |
+----------+

+----------+
|          |
|          |
|          |
|   r..d   |
|   .  .   |
|   u..l   |
|   .      |
|   .      |
|   U      |
+----------+

6: চেঞ্জার হিসাবে স্টার্টার

+----------+
|          |
|          |
|          |
|   L      |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|*..L      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

7: স্ট্রেট লুপ

+----------+
|          |
|          |
|          |
|          |
|   r  l   |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|          |
|   r..l   |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

8: টাইট নট

+----------+
|          |
|          |
|          |
|  d  l    |
|   r u    |
|  r u     |
|          |
|          |
|   U      |
+----------+


+----------+
|    *     |
|    .     |
|    .     |
|  d..l    |
|  .r.u    |
|  r.u     |
|   .      |
|   .      |
|   U      |
+----------+

9: একটি বাধা

+----------+
|          |
|          |
|          |
|          |
|   r    X |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|          |
|   r...*X |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+ 

10: এস শেপ

+----------+
|r     d   |
|          |
|  XXXXXXXX|
| d      l |
|ul        |
|XXXXXXX   |
|          |
|R       u |
|          |
+----------+


+----------+
|r.....d   |
|.     *   |
|. XXXXXXXX|
|.d......l |
|ul      . |
|XXXXXXX . |
|        . |
|R.......u |
|          |
+----------+

11: 4-ওয়ে নট

+----------+
|      D   |
|          |
|   r      |
|R    d    |
|          |
|    u    L|
|      l   |
|          |
|   U      |
+----------+


+----------+
|    * D   |
|    . .   |
|   r.....*|
|R....d.   |
|   ....   |
|   .u....L|
|*.....l   |
|   . .    |
|   U *    |
+----------+

12: ব্যস্ত জংশন

+----------+
|rrrrr rrrd|
| rlrl     |
|ul rrd    |
|ruX X     |
|udl ll    |
|ull       |
|rlr       |
|rdr  d    |
|Uruull    |
+----------+


+----------+
|rrrrr.rrrd|
|.rlrl    .|
|ul rrd   .|
|ruX.X.   .|
|udl.ll   .|
|ull.     .|
|rlr.     .|
|rdr..d   .|
|Uruull   *|
+----------+

13: প্রান্তে শুরু হয়

+----------+
|   U      |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

+----------+
|   U      |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

14: মৃত পথ অতিক্রম করা

+----------+
|          |
|          |
|          |
|      R   |
|          |
|          |
|          |
|          |
|         U|
+----------+


+----------+
|         *|
|         .|
|         .|
|      R..*|
|         .|
|         .|
|         .|
|         .|
|         U|
+----------+

@ টিফিল্ড যোগ হয়েছে, ধন্যবাদ!
এজেফারাডে

1
দেখে মনে হচ্ছে যে সমস্ত দিক পরিবর্তনকারীরা সর্বদা আপনার পরীক্ষার ক্ষেত্রে পৌঁছে যায়, যা অ্যালগরিদমকে সহজ করার অনুমতি দিতে পারে। আমি এটি পরীক্ষার কেস যুক্ত করার পরামর্শ দিচ্ছি যেখানে এটি সত্য নয়।
আর্নৌলদ

@ আরনাউল্ড আমি নিশ্চিত যে 12 এর ক্ষেত্রে কিছু অব্যবহৃত দিক পরিবর্তনকারী রয়েছে
এজেফারাডে


3
এটি গ্রিডটি কোনও আয়তক্ষেত্রাকার আকার হতে পারে তবে সমস্ত পরীক্ষার ক্ষেত্রে আকার এবং আকার একরকম বলে মনে হয়।
গ্যাস্ট্রোপনার

উত্তর:


9

জাভাস্ক্রিপ্ট (ES6),  191 183  181 বাইট

একটি বাগ ঠিক করতে সাহায্য করার জন্য @ টিএসএকে ধন্যবাদ

অক্ষরের ম্যাট্রিক্স হিসাবে ইনপুট নেয়। ইনপুট পরিবর্তন করে আউটপুট।

f=(a,X,Y,d,n=0)=>a.map((r,y)=>r.map((v,x)=>(a+0)[i=' .*dlurDLUR'.indexOf(v),n]?X?X-x+~-d%2|Y-y+(d-2)%2?0:~i?f(a,x,y,i>2?i&3:d,n+1,r[x]=i?v:'.'):n?a[Y][X]='*':0:i>6&&f(a,x,y,i&3):0))

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

মন্তব্য

f = ( a,                           // a[]  = input matrix
      X, Y,                        // X, Y = coordinates of the previous cell
      d,                           // d    = current direction (0 .. 3)
      n = 0                        // n    = number of iterations for the current path
    ) =>                           //
  a.map((r, y) =>                  // for each row r[] a position y in a[]:
    r.map((v, x) =>                //   for each character v at position x in r[]:
      (a + 0)[                     //
        i = ' .*dlurDLUR'          //     i = index of the character
            .indexOf(v),           //     blocking characters '-', '|' and 'X' gives -1
        n                          //     by testing (a + 0)[n], we allow each cell to be
      ]                            //     visited twice (once horizontally, once vertically)
      ?                            //     if it is set:
        X ?                        //       if this is not the 1st iteration:
          X - x + ~-d % 2 |        //         if x - X is not equal to dx[d]
          Y - y + (d - 2) % 2 ?    //         or y - Y is not equal to dy[d]:
            0                      //           ignore this cell
          :                        //         else:
            ~i ?                   //           if this is not a blocking character:
              f(                   //             do a recursive call:
                a,                 //               pass a[] unchanged
                x, y,              //               pass the coordinates of this cell
                i > 2 ? i & 3 : d, //               update d if v is a direction char.
                n + 1,             //               increment n
                r[x] = i ? v : '.' //               if v is a space, set r[x] to '.'
              )                    //             end of recursive call
            :                      //           else (this is a blocking character):
              n ?                  //             if this is not the 1st iteration:
                a[Y][X] = '*'      //               set the previous cell to '*'
              :                    //             else:
                0                  //               do nothing
        :                          //       else (1st iteration):
          i > 6 &&                 //         if v is a capital letter:
            f(a, x, y, i & 3)      //           do a recursive call with this direction
      :                            //     else ((a + 0)[n] is not set):
        0                          //       we must be in an infinite loop: abort
    )                              //   end of inner map()
  )                                // end of outer map()

বিটিডব্লিউ, [...""+a].mapকমপক্ষে 2x দৈর্ঘ্যের একটি অ্যারে তৈরি করতে পারে। আমি নিশ্চিত না এটি সাহায্য করে কিনা।
tsh

(a+0)[n]একটি বাইট সংরক্ষণ করে, যদিও nএখন আরম্ভ করা প্রয়োজন।
আর্নৌল্ড

8

পাইথন 2 , 283 279 293 288 279 বাইট

e=enumerate
def f(M):
 s=[(x,y,c)for y,l in e(M)for x,c in e(l)if'A'<c<'X'];v=set(s)
 for x,y,C in s:
	d=ord(C)%87%5;q=d>1;X,Y=x-d+q*3,y+~-d-q;c=M[Y][X];N=(X,Y,[C,c]['a'<c<'x'])
	if'!'>c:M[Y][X]='.'
	if(c in'-|X')*('/'>M[y][x]):M[y][x]='*'
	if(c in'udlr. *')>({N}<v):v|={N};s+=N,

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

তালিকার একটি তালিকা নেয়।

ইনপুট অ্যারে পরিবর্তন করে আউটপুট।


6

পার্ল 5, 203 188 166 বাইট

$l='\K[ a-z](?=';$t='([-|X])?';$s=$_;/
/;$n='.'x"@-";{$_|=s/(?|R[.*]*$l$t)|$t${l}[.*]*L)|D$n(?:[.*]$n)*$l$n$t)|$t$n$l$n([.*]$n)*U))/$&eq$"?$1?'*':'.':uc$&/es?redo:$s}

Tio

কিভাবে এটা কাজ করে

  • $s=$_$sছোট হাতের পরিবর্তনকারীদের পুনরুদ্ধার করতে ইনপুট সংরক্ষণ করতে। $_|=$sকারণ বিটওয়াইস বা স্থান সহ কোনও পরিবর্তন হবে না .এবং *, ছোট হাতের অক্ষর urldবিটওয়াইস বা ক্রিয়াকলাপের সাথে পুনরুদ্ধার করা হবে।
  • /\n/;$n='.'x"@-""প্রস্থ" পেতে এবং $nকোনও অক্ষর "প্রস্থ" বারের সাথে মেলে
  • $l='\K[ a-z](?=';$t='([-|X])?'regex দৈর্ঘ্য হ্রাস; $lএকটি ছোট হাতের অক্ষর urldবা কোনও পথের কোনও জায়গার সাথে $tটার্মিনেটরের সাথে মেলে।

প্রতিস্থাপনের পরে: (?| R[.*]*\K[ a-z](?=([-|X])?) | ([-|X])?\K[ a-z](?=[.*]*L) | D$n(?:[.*]$n)*\K[ a-z](?=$n([-|X])?) | ([-|X])?$n\K[ a-z](?=$n([.*]$n)*U) )

  • খোলার /eজন্য স্যুইচ করুন, /sযাতে .(অভ্যন্তরীণ $n) একটি নতুন লাইনের চরিত্রও মেলে
  • $&eq$"?$1?'*':'.':uc$&যদি মিলেছে একটি স্থান, যদি termiator মিলেছে *অন্যথায় .অন্যথায় বড় হাতের অক্ষরে।

1
@ আরনল্ড, আপনি যদি একবারে একটি টেস্ট কেস ইনপুট করেন তবে এটি কাজ করে।
শেগি

হ্যাঁ আমি দ্রুত পোস্ট করেছি এবং এটি $sফুটারে পুনরায় সেট করার বিষয়টি স্থির করতে পারছি না। $sইনপুটটি সংরক্ষণ করতে এবং ছোট হাতের অক্ষরগুলি পুনরুদ্ধার করতে ব্যবহৃত হয় কারণ পথ আঁকানোর সময় বড় হাতের অক্ষরে স্যুইচ করা হয়
নাহুয়েল ফৌইলুল

4

পরিষ্কার , 409 বাইট

import StdEnv,Data.List
q=flatlines
$m=foldl(zipWith\a b|a=='*'||b=='*'='*'=max a b)(q m)[q(foldl(\m(_,y,x)=[[if(b<>x||a<>y)if(k=='*')'.'k'*'\\k<-r&b<-[0..]]\\r<-m&a<-[0..]])m(last(takeWhile(not o hasDup)(inits(f 0y 0x)))))\\l<-m&y<-[0..],c<-l&x<-[0..]|isUpper c]
where f a y b x=let(u,v)=(a+y,b+x)in(case toLower((m!!u)!!v)of' '=[((a,b),u,v):f a u b v];'r'=f 0u 1v;'l'=f 0u -1v;'u'=f -1u 0v;'d'=f 1u 0v;_=[])

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


3

পাইথন 2 , 250 বাইট

def f(G,e=enumerate):
 for i,k in e(G):
	for j,l in e(k):
	 v=X=x=y=m,=l,
	 while(m in'-X|')<(l in'DLRU')>(X in v):v+=X,;y,x=zip((1,0,0,-1,y),(0,-1,1,0,x))['DLRU dlru'.find(m)%5];G[i][j]=(m,'.*'[G[i+y][j+x]in'-X|'])[m<'!'];i+=y;j+=x;X=x,i,j;m=G[i][j]

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

ওপি দ্বারা স্পষ্টভাবে অনুমোদিত হিসাবে, 1-চর স্ট্রিংগুলির তালিকার একটি তালিকা নেয় T

তালিকায় স্থান পরিবর্তন করে।

আরও সহজ I / O এর জন্য এটি ব্যবহার করুন

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