ম্যাট্রিক্স রোটেশন সাজান


12

নিম্নলিখিত হিসাবে অনন্য সংখ্যা সহ একটি খালি, অরক্ষিত এবং সসীম ম্যাট্রিক্স সংজ্ঞায়িত করতে দেয়:

N={457136}

4 ম্যাট্রিক্সের চালগুলি এটিকে সংজ্ঞায়িত করতে দেয়:

  • ↑ * (উপরে): একটি কলাম উপরে সরানো
  • ↓ * (নিচে): একটি কলাম নীচে সরায়
  • → * (ডান): একটি সারি ডানদিকে সরায়
  • ← * (বাম): একটি সারি বাম দিকে সরায়

তারকাচিহ্ন (*) কলাম / সারিটি উপস্থাপন করে যা এই পদক্ষেপের দ্বারা প্রভাবিত হয় (এটি 0-সূচকযুক্ত বা 1-সূচকযুক্ত হতে পারে। আপনার উপর নির্ভর করে Please আপনার উত্তরে কোনটি লিখুন)।


চ্যালেঞ্জটি হ'ল উপরের চালগুলি ব্যবহার করে ম্যাট্রিক্সকে একটি ক্রমবর্ধমান ক্রমে সাজান (উপরের বাম কোণটি নিম্নতম এবং নীচে ডান কোণটি সর্বোচ্চ)।

উদাহরণ

N={423156}
↑0↓0


N={231456}
→0


N={457136}
↑0↑1←1↑2


N={596824173}
↑0↑2→0→2↑0→2↑1↑2←1


N={127282961023451778139151112181426162119203022232425}
↑2↑1←3→0←3↓0←0←2→3↑3↑4


N={1}


N={1234}


মন্তব্য

  • বিভিন্ন সঠিক আউটপুট থাকতে পারে (পরীক্ষার কেস বা সংক্ষিপ্ততমগুলির মতো অগত্যা প্রয়োজন হবে না)
  • আপনি ধরে নিতে পারেন এটি ম্যাট্রিক্স অর্ডার করার জন্য সর্বদা উপায় হবে
  • প্রান্তগুলি সংযোগ করে (প্যাকম্যান: ভি এর মতো)
  • 9 টিরও বেশি কলাম বা / এবং সারি সহ একটি ম্যাট্রিক্স হবে না
  • ধরুন ম্যাট্রিক্সে কেবল ধনাত্মক অ-শূন্য স্বতন্ত্র পূর্ণসংখ্যা রয়েছে
  • চালগুলি প্রতিনিধিত্ব করতে আপনি সংখ্যা বাদে অন্য যে কোনও 4 টি স্বতন্ত্র মান ব্যবহার করতে পারেন (তার ক্ষেত্রে, দয়া করে আপনার জবাবে এটি লিখুন)
  • কলাম / সারি 0 বা 1 ইনডেক্স করা যেতে পারে
  • মানদণ্ড জিতেছে

অতিরিক্ত পরীক্ষার ক্ষেত্রে সর্বদা স্বাগত


5
এখানে এমন একটি ওয়েবসাইট রয়েছে যেখানে আপনি নিজেরাই এই ধাঁধাগুলি সমাধান করতে পারেন।
ডুরকনব

1
@ ডুরকনব আমি যখন ডেক্স চ্যালেঞ্জটি লিখছিলাম তখন এটি কার্যকর হত। যাই হোক ধন্যবাদ!
লুইস ফেলিপ দে জেসুস মুনোজ

আমি মনে করি না আপনি কোথাও বলবেন যে প্রদত্ত সমাধানটি যতটা সম্ভব সংক্ষিপ্ত হওয়া উচিত। এটা কি ইচ্ছাকৃত? উদাহরণস্বরূপ ←0←0দ্বিতীয় উদাহরণটির একটি বৈধ সমাধান যেখানে আপনি যেমন সমাধান দিয়েছেন →0। যদি এটি হয় তবে আমি মনে করি যে মুভ বিকল্পগুলির অর্ধেক ব্যবহার করা হবে না।
FryAmTheEggman


1
এছাড়াও কিছু লোক কেরিখ নামে একটি ইউটিউবার দ্বারা তৈরি ওপেনপ্রসেসিং.আর / স্কেচ/580366 চেষ্টা করতে চাইতে পারেন । একে "লুপওভার" বলা হয়
গ্যারেথ মা

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6),  226  219 বাইট

ডান ( "R") এবং নীচে ( "D") চালগুলি ব্যবহার করে ব্রুট ফোর্স অনুসন্ধান ।

হয় চলনগুলি বর্ণনা করে একটি স্ট্রিং, অথবা ইনপুট ম্যাট্রিক্স ইতিমধ্যে বাছাই করা থাকলে একটি ফাঁকা অ্যারে ফেরত দেয়। আউটপুটে কলাম এবং সারি 0-ইনডেক্স করা হয়।

f=(m,M=2)=>(g=(s,m)=>m[S='some'](p=r=>r[S](x=>p>(p=x)))?!s[M]&&m[0][S]((_,x,a)=>g(s+'D'+x,m.map(([...r],y)=>(r[x]=(m[y+1]||a)[x])&&r)))|m[S]((_,y)=>g(s+'R'+y,m.map(([...r])=>y--?r:[r.pop(),...r]))):o=s)([],m)?o:f(m,M+2)

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

মন্তব্য

f =                              // f = main recursive function taking:
(m, M = 2) => (                  //   m[] = input matrix; M = maximum length of the solution
  g =                            // g = recursive solver taking:
  (s, m) =>                      //   s = solution, m[] = current matrix
    m[S = 'some'](p =            // we first test whether m[] is sorted
      r =>                       // by iterating on each row
        r[S](x =>                // and each column
          p > (p = x)            // and comparing each cell x with the previous cell p
        )                        //
    ) ?                          // if the matrix is not sorted:
      !s[M] &&                   //   if we haven't reached the maximum length:
      m[0][S]((_, x, a) =>       //     try all 'down' moves:
        g(                       //       do a recursive call:
          s + 'D' + x,           //         append the move to s
          m.map(([...r], y) =>   //         for each row r[] at position y:
            (r[x] =              //           rotate the column x by replacing r[x] with
              (m[y + 1] || a)[x] //           m[y + 1][x] or a[x] for the last row (a = m[0])
            ) && r               //           yield the updated row
      ))) |                      //
      m[S]((_, y) =>             //     try all 'right' moves:
        g(                       //       do a recursive call:
          s + 'R' + y,           //         append the move to s
          m.map(([...r]) =>      //         for each row:
            y-- ?                //           if this is not the row we're looking for:
              r                  //             leave it unchanged
            :                    //           else:
              [r.pop(), ...r]    //             rotate it to the right
      )))                        //
    :                            // else (the matrix is sorted):
      o = s                      //   store the solution in o
)([], m) ?                       // initial call to g(); if we have a solution:
  o                              //   return it
:                                // else:
  f(m, M + 2)                    //   try again with a larger maximum length

চমৎকার উত্তর. আপনি কি জানেন যে এটির জন্য কোনও দক্ষ আলগো বিদ্যমান আছে, বা যদি কোন সমাধানের জন্য জোর করে চাপ না দিয়ে সমাধানের সর্বোচ্চ সংখ্যাটি নির্ধারণ করা সম্ভব হয়?
জোনা

1
@ জোনাঃ এখানে একটি কাগজ রয়েছে যা একটি সমাধান বর্ণনা করে এবং চালনার সংখ্যার উপরের সীমা প্রদান করে। ( এই চ্যালেঞ্জটিও দেখুন যা মূলত ভিন্ন জয়ের মানদণ্ডের সাথে একই কাজ))
আর্নল্ড

বাহ, আপনাকে ধন্যবাদ @ আর্নল্ড
জোনা

2

পাইথন 2 , 296 277 245 পাইথন 3 , 200 194 বাইট

from numpy import*
def f(p):
 s='';u=[]
 while any(ediff1d(p)<0):u+=[(copy(p),s+f'v{v}',f':,{v}')for v in r_[:shape(p)[1]]]+[(p,s+'>0',0)];p,s,i=u.pop(0);exec(f'p[{i}]=roll(p[{i}],1)')
 return s

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

-19: ইউনিকোড তীর প্রয়োজন ছিল না ...
-32: সামান্য পুনরায় কাজ করা হয়েছে, তবে গড়ে বেশ ধীর পারফরম্যান্স performance
-45: @ আরনাউল্ডের উত্তর থেকে কিছুটা অনুপ্রেরণা নিয়েছে। f''(-4 বাইট)
-6: range( )r_[: ] , Py এর জন্য পাইথন 3 এ স্যুইচ করা হয়েছে diff(ravel( ))ediff1d( )


নিঃসন্দেহে সমস্ত সম্ভাব্য পদক্ষেপ এবং এর সংমিশ্রণ অনুসন্ধান করে →0। তৃতীয় পরীক্ষার মামলায় টাইমস আউট।

যেহেতু →nসমান

01...↓(c-1) 	... repeated r-n times
0
01...↓(c-1)	... repeated n times

যেখানে rএবং cসারি এবং কলামগুলির সংখ্যা, এই পদক্ষেপগুলি প্রতিটি সমাধান খুঁজে পেতে যথেষ্ট are


from numpy import*
def f(p):
    s=''                                    #s: sequence of moves, as string
    u=[]                                    #u: queue of states to check
    while any(ediff1d(p)<0):                #while p is not sorted
        u+=[(copy(p),s+f'v{v}',f':,{v}')    #add p,↓v to queue
            for v in r_[:shape(p)[1]]]      # for all 0<=v<#columns
        u+=[(p,s+'>0',0)]                   #add p,→0
        p,s,i=u.pop(0)                      #get the first item of queue
        exec(f'p[{i}]=roll(p[{i}],1)')      #transform it
    return s                                #return the moves taken

>vযথাক্রমে অনুরূপ →↓। (অন্যদের অপরিশোধিত)


0

জেলি , 35 বাইট

ṙ€LXȮƊ¦1
ÇZÇZƊ⁾ULXȮOịØ.¤?F⁻Ṣ$$¿,“”Ṫ

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

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

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