রুবিক-বাছাই করা একটি ম্যাট্রিক্স (ওরফে টরাস ধাঁধা)


16

এই জন্য ধারণাটি সহজ: একটি পূর্ণসংখ্যার একটি ম্যাট্রিক্স দেওয়া হয়েছে, আসুন এটি রুবিক-স্টাইলের গতিবিধি প্রয়োগ করে বাছাই করুন। এর অর্থ হ'ল আপনি একটি একক সারি বা কলাম নির্বাচন করতে পারেন এবং এর উপাদানগুলিকে যে কোনও দিকে ঘোরান:

[1, 3, 2, 4]  => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4]  => [4, 1, 3, 2] (rotate right for rows/down for columns)

সুতরাং, কোনও মাত্রার পূর্ণসংখ্যার একটি ম্যাট্রিক্স দেওয়া হয়েছে, কেবলমাত্র এই রুবিক-শৈলীর রূপান্তরগুলি প্রয়োগ করে এর উপাদানগুলিকে সাজান। একটি ম্যাট্রিক্স

[একটি11একটি12একটি13একটি14একটি21একটি22একটি23একটি24একটি31একটি32একটি33একটি34]

এর উপাদানগুলি নিম্নলিখিত সীমাবদ্ধতা মেনে চললে বাছাই হিসাবে বিবেচিত হবে:

একটি11একটি12একটি13একটি14একটি21একটি22একটি23একটি24একটি31একটি32একটি33একটি34

ইনপুট / আউটপুট

  • ইনপুটটি কোনও পুনরাবৃত্ত মানের সাথে ধনাত্মক পূর্ণ সংখ্যার ম্যাট্রিক্স হবে।
  • আউটপুট এটি বাছাই করার জন্য প্রয়োজনীয় গতিবিধি হবে। যেহেতু এটি কোনও কোড গল্ফ চ্যালেঞ্জ নয় এবং আপনার দৈর্ঘ্যের বিষয়ে আপনাকে চিন্তা করার দরকার নেই, তাই প্রতিটি আন্দোলনের প্রস্তাবিত ফর্ম্যাটটি #[UDLR]যেখানে #সারি করার জন্য সারি বা কলামের সংখ্যা (0-সূচিযুক্ত) এবং সেটিতে [UDLR]একটি একক চরিত্র is সীমা যে সারণি উপরে / নিচে (কলামগুলির জন্য) বা বাম / ডান (সারিগুলির জন্য) রয়েছে তা নির্দিষ্ট করে। সুতরাং 1U"1 তম কলামটি উপরের দিকে সরানো" অর্থ 1Rহবে তবে "1-তম সারিকে ডানদিকে সরানো" হবে। আন্দোলন, কমা চিহ্ন দ্বারা বিভাজিত করা হবে যাতে একটি সমাধান এই মত প্রকাশ করা হবে: 1R,1U,0L,2D

স্কোরিং

এই পদ্ধতিতে ম্যাট্রিক্সকে বাছাই করার চেষ্টা করা ব্যয়বহুল হতে পারে কারণ প্রচুর চলার সংমিশ্রণ প্রচুর পরিমাণে রয়েছে এবং চলনগুলির প্রচুর সম্ভাব্য তালিকাও রয়েছে যা এটি বাছাই করতে পারে, সুতরাং লক্ষ্যটি এমন কিছু কোড লিখুন যা এন * কে বাছাই করে নীচে এন ম্যাট্রিক্স। স্কোরটি সবচেয়ে বড় আকারের এন হবে যা আপনি 1 টি ত্রুটি ছাড়াই যুক্তিসঙ্গত পরিমাণে সমাধান করতে পারেন (ম্যাট্রিক্সের আকারটি যত বেশি সমাধান করা যায় তত ভাল)। টাই হওয়ার ক্ষেত্রে টাই-ব্রেকারটি আপনার পাওয়া পথে চলার সংখ্যা হবে (পথটি ছোট হবে, আরও ভাল) the

উদাহরণ: যদি কোনও ব্যবহারকারী এন = 5 এর জন্য সমাধান এবং বি এন এর জন্য সমাধান খুঁজে পায় 6, বি উভয় পথের দৈর্ঘ্য নির্বিশেষে জয়ী হয়। যদি তারা উভয়ই এন = 6 এর সমাধান খুঁজে পান তবে এ দ্বারা পাওয়া সমাধানটির 50 টি পদক্ষেপ এবং বি এর সমাধানের 60 টি পদক্ষেপ রয়েছে, একটি জেতে।

আপনার কোড কীভাবে কাজ করে সে সম্পর্কে ব্যাখ্যাগুলি অত্যন্ত উত্সাহিত হয় এবং দয়া করে পাওয়া সমাধানগুলি পোস্ট করুন যাতে আমরা সেগুলি পরীক্ষা করতে পারি । সমাধানগুলি খুব বড় হলে আপনি পেস্টাবিন বা অনুরূপ সরঞ্জাম ব্যবহার করতে পারেন । এছাড়াও, আপনার সমাধানগুলি খুঁজে পেতে আপনার কোড দ্বারা ব্যয় করা সময়ের একটি অনুমান প্রশংসা করা হবে।

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

নিম্নলিখিত ম্যাট্রিকগুলি ( আরও অনুলিপি-পেস্টেবল সংস্করণের জন্য পেস্টবিন লিঙ্ক ) ইতিমধ্যে সাজানো ম্যাট্রিকগুলি থেকে 10 কে এলোমেলোভাবে, রুবিক-স্টাইলের গতিবিধিতে স্ক্র্যাম্বিং করে তৈরি করা হয়েছে:

[8561110131513]
[211012161762214851926132431]
[11381659402126221124143928321937310301736734]
[34214022354118333130124319113924282344136538451417916132683476254]
[20361711550187267341032355424396306139284154272357048132512465863523784533146859655673606422]
[85565275894441682715879132373973676419997846164221631004172131197309328403365070258058960845496172943342335776182482943866]
[567990617112211031551144284851306188443386611324962010275685888098351007713216410810601144023472731068232120263653936910454191111176217278873349155811695112571189151426545]

বাদী পরীক্ষার কেস:

[[8, 5, 6], [11, 10, 1], [3, 15, 13]]

[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]

[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]

[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]

[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]

[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]

[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]

আপনি যদি সেগুলির সমাধান করেন তবে দয়া করে আরও জিজ্ঞাসা করুন। :-) এবং স্যান্ডবক্সে থাকাকালীন যারা আমাকে এই চ্যালেঞ্জটি পরিমার্জন করতে সহায়তা করেছেন তাদের অনেক ধন্যবাদ ।


1 একটি যুক্তিসঙ্গত সময়: আপনার সমাধান পরীক্ষা করার সময় যে পরিমাণ পরিমাণ আমাদের ধৈর্যকে ক্ষুন্ন করে না। নোট করুন যে টিআইও কেবলমাত্র 60 সেকেন্ডের জন্য কোড চালায়, সেই সীমা ছাড়িয়ে যে কোনও সময় সময় আমাদের মেশিনে কোডটি পরীক্ষা করে তুলবে। উদাহরণ: আমার পরিবর্তে অদৃশ্য অ্যালগরিদমটি 3x3 এবং 4x4 অর্ডারটির ম্যাট্রিকগুলি সমাধান করতে কয়েক মিলি সেকেন্ড সময় নেয়, তবে আমি কেবল এটি 5x5 ম্যাট্রিক্স দিয়ে পরীক্ষা করেছি এবং এটি সমাধান করতে 317 সেকেন্ড সময় নিয়েছে (5 মিলিয়নেরও বেশি আন্দোলনে, আমরা যদি এটি বিবেচনা করি তবে খুব মজার সমাধানের ম্যাট্রিক্সটি কেবল 10K বার স্ক্র্যাম্বল হয়েছিল )। আমি চলাফেরার সংখ্যা 10 কে এর চেয়ে কম করার চেষ্টা করেছি তবে কোডটি কার্যকর করার 30 মিনিটের পরে আমি আত্মসমর্পণ করেছি।


1
দুর্দান্ত চ্যালেঞ্জ! তবে, আমার কাছে কয়েকটি অনুরোধ / প্রশ্ন রয়েছে: 1) আপনি কি আরও কপি-পেস্ট বন্ধুত্বপূর্ণ বিন্যাসে পরীক্ষার কেসগুলি সরবরাহ করতে পারেন? (যেমন পেস্টবিন) ২) আপনি কি সময়সীমা ক্রমের আরও সুনির্দিষ্ট সংজ্ঞা দিতে পারেন? 3) ম্যাট্রিক্সটি বর্গক্ষেত্র হওয়ার নিশ্চয়তা কি? (পরীক্ষাগুলির কেসগুলি তাই প্রস্তাব করে তবে সংজ্ঞাটি দেয় না))
আর্নল্ড

@ আর্নল্ড ১) আমি এতে আছি। 2) আমি কোনও সময়সীমা স্থাপন করতে চাইনি, এবং চ্যালেঞ্জটি স্যান্ডবক্সে থাকাকালীন কেউই কোনও সীমা প্রস্তাব করেনি। আপনার যদি প্রয়োজন হয়, আপনি 30 মিনিটের একটি যুক্তিসঙ্গত সীমা বিবেচনা করবেন? 3) হ্যাঁ, পরীক্ষার ম্যাট্রিকগুলি সেগুলি দেখানো হয় এবং আরও বেশি প্রয়োজন হলে সেগুলি সমস্ত বর্গক্ষেত্র হবে।
চার্লি

এই চ্যালেঞ্জের একটি (অপেক্ষাকৃত সহজ) ও (ইনপুট আকার) অ্যালগরিদম উপস্থিত রয়েছে, তাই এটি প্রথম দেখার মতো আকর্ষণীয় নয়।
ব্যবহারকারী 202729

@ user202729 আপনার O(input size)তখন ইনপুট-আকারটি কী হবে ? 5x5 ম্যাট্রিক্সের জন্য এটি হবে O(25)? এটি অত্যন্ত দ্রুত বলে মনে হচ্ছে, সুতরাং আমি সেই অ্যালগরিদম বা আপনার বাস্তবায়ন দেখতে খুব আগ্রহী হব। সম্পাদনা: আপনি কি বুঝতে পেরেছেন যে আমরা 'স্ক্যাম্বলড' ম্যাট্রিক্স এবং আউটপুট আন্দোলনগুলি ঠিক করি? প্রায় অন্য উপায় না.
কেভিন ক্রুইজসেন

4
আমি মনে করি, এটি এই অ্যালগরিদমের
কিরিল এল।

উত্তর:


8

নিম

import algorithm, math, sequtils, strutils

let l = split(stdin.readLine())
var m = map(l, parseInt)
let n = int(sqrt(float(len(m))))
let o = sorted(m, system.cmp[int])

proc rotations(P, Q: int): tuple[D, L, R, U: string, P, Q: int]=
  result = (D: "D", L: "L", R: "R", U: "U", P: P, Q: Q)
  if P > n - P:
    result.D = "U"
    result.U = "D"
    result.P = n - P
  if Q > n - Q:
    result.L = "R"
    result.R = "L"
    result.Q = n - Q

proc triangle(r: int): string=
  let p = r div n
  let q = r mod n
  let i = find(m, o[r])
  let s = i div n
  let t = i mod n
  var u = s
  var v = q
  if s == p and t == q:
    return ""
  var patt = 0
  if p == s: 
    u = s + 1
    patt = 4
  elif q == t:
    if q == n - 1:
      v = t - 1
      patt = 8
    else:
      u = p
      v = t + 1
      patt = 3
  elif t > q:
    patt = 2
  else:
    patt = 7
  var Q = abs(max([q, t, v]) - min([q, t, v]))
  var P = abs(max([p, s, u]) - min([p, s, u]))
  let x = p*n + q
  let y = s*n + t
  let z = u*n + v
  let w = m[x]
  m[x] = m[y]
  m[y] = m[z]
  m[z] = w
  let R = rotations(P, Q)

  result = case patt:
    of 2:
      repeat("$#$#," % [$v, R.D], R.P) & 
        repeat("$#$#," % [$u, R.L], R.Q) &
        repeat("$#$#," % [$v, R.U], R.P) & 
        repeat("$#$#," % [$u, R.R], R.Q)
    of 3:
      repeat("$#$#," % [$q, R.U], R.P) & 
        repeat("$#$#," % [$p, R.L], R.Q) &
        repeat("$#$#," % [$q, R.D], R.P) & 
        repeat("$#$#," % [$p, R.R], R.Q)
    of 4:
      repeat("$#$#," % [$p, R.L], R.Q) & 
        repeat("$#$#," % [$q, R.U], R.P) &
        repeat("$#$#," % [$p, R.R], R.Q) & 
        repeat("$#$#," % [$q, R.D], R.P)
    of 7:
      repeat("$#$#," % [$v, R.D], R.P) & 
        repeat("$#$#," % [$u, R.R], R.Q) &
        repeat("$#$#," % [$v, R.U], R.P) & 
        repeat("$#$#," % [$u, R.L], R.Q)
    of 8:
      repeat("$#$#," % [$s, R.R], R.Q) & 
        repeat("$#$#," % [$t, R.D], R.P) &
        repeat("$#$#," % [$s, R.L], R.Q) & 
        repeat("$#$#," % [$t, R.U], R.P)
    else: ""

proc Tw(p, t, P, Q: int): string =
  let S = P + Q
  result = "$#D,$#$#U,$#$#D,$#$#U," % [
    $t, if P > n - P: repeat("$#L," % $p, n - P) else: repeat("$#R," % $p, P),
    $t, if S > n - S: repeat("$#R," % $p, n - S) else: repeat("$#L," % $p, S), 
    $t, if Q > n - Q: repeat("$#L," % $p, n - Q) else: repeat("$#R," % $p, Q), 
    $t]

proc line(r: int): string=
  let p = n - 1
  let q = r mod n
  let i = find(m, o[r])
  var t = i mod n
  if t == q: 
    return ""
  let j = t == n - 1
  var P = t - q
  let x = p*n + q
  let y = x + P
  let z = y + (if j: -1 else: 1)
  let w = m[x]
  m[x] = m[y]
  m[y] = m[z]
  m[z] = w
  if j:
    let R = rotations(1, P)
    result = "$#D,$#$#U,$#$#R,$#D,$#L,$#U," % [
      $t, repeat("$#$#," % [$p, R.R], R.Q), 
      $t, repeat("$#$#," % [$p, R.L], R.Q), 
      $p, $t, $p, $t]
  else:
    result = Tw(p, t, P, 1)  
  
proc swap: string=
  result = ""
  if m[^1] != o[^1]:
    m = o
    for i in 0..(n div 2-1):
      result &= Tw(n - 1, n - 2*i - 1, 1, 1)
    result &= "$#R," % $(n - 1)
  
var moves = ""
for r in 0..(n^2 - n - 1):
  moves &= triangle(r)
if n == 2 and m[^1] != o[^1]:
  m = o
  moves &= "1R"
else:
  for r in (n^2 - n)..(n^2 - 3):
    moves &= line(r)
  if n mod 2 == 0:
    moves &= swap()
  if len(moves) > 0:
    moves = moves[0..^2]
  
echo moves

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

অ্যালগরিদম 2012, 5, 18-29 এ প্রকাশিত একটি নিবন্ধ থেকে টরাস ধাঁধা সমাধান অ্যালগরিদম বাস্তবায়নের জন্য একটি দ্রুত প্রচেষ্টা যা আমি মন্তব্যে উল্লেখ করেছি।

স্পেস-সীমাবদ্ধ সংখ্যার লাইন হিসাবে সমতল আকারে ইনপুট ম্যাট্রিক্স গ্রহণ করে।

এখানে পাইথন 2-তে একটি বৈধতা প্রদানকারীও রয়েছে । এটি ইনপুট হিসাবে দুটি লাইন লাগে: মূল কোড হিসাবে একই আকারে মূল স্ক্র্যাম্বলড ম্যাট্রিক্স এবং চলার প্রস্তাবিত ক্রম। এই চলনগুলির প্রয়োগের ফলে বৈধকারীর আউটপুট ম্যাট্রিক্স হয়।

ব্যাখ্যা

অ্যালগরিদমের প্রথম অংশে, আমরা শেষটি বাদে সমস্ত সারি অর্ডার করি।

আমরা "ত্রিভুজ ঘূর্ণন" ( proc triangle) এর সিরিজ সম্পাদন করে এটি করি - ক্রমের ক্রমগুলি যার ফলস্বরূপ কেবল তিনটি ঘরই অদলবদল করে, এবং বাকি সমস্তটি অপরিবর্তিত থাকে। আমরা স্থানাঙ্ক সহ প্রতিটি ক্রমাগত "কার্যকারী" সেল নিই[পি,কুই], তারপরে ঘরটি সন্ধান করুন [গুলি,টি] এটিতে বর্তমানে যাওয়ার সংখ্যাটি রয়েছে [পি,কুই], এবং তৃতীয় পয়েন্ট নির্বাচন করে ডান ত্রিভুজটি সম্পূর্ণ করুন [তোমার দর্শন লগ করা,বনাম] কিছু নিদর্শন অনুযায়ী লিঙ্কিত নিবন্ধের চিত্র 4 এ দেখানো হয়েছে।

চিত্র 2-তে, লেখকরা 8 টি সম্ভাব্য নিদর্শন এবং চলনের সাথে সম্পর্কিত অনুক্রমগুলি উপস্থাপন করেছেন, তবে আমার কোডে সমস্ত ক্ষেত্রে আসলে কেবল 5 টি প্যাটার্ন দ্বারা আবৃত করা হয়েছে, যাতে না। 1, 5, এবং 6 ব্যবহার করা হয় না।

দ্বিতীয় অংশে, দুটি শেষ উপাদান ব্যতীত শেষ সারিটি একটি লাইনে "তিনটি উপাদান ঘূর্ণন" চালিয়ে অর্ডার করা হয় (proc line ), যার প্রতিটি দুটি ত্রিভুজ ঘূর্ণন থাকে (নিবন্ধের চিত্র 3 দেখুন)।

আমরা আমাদের বর্তমান ওয়ার্কিং সেলটি নির্বাচন করি [পি,কুই] বাম পয়েন্ট হিসাবে, লক্ষ্য মান সহ ঘর cell [গুলি,টি] কেন্দ্রীয় পয়েন্ট হিসাবে এবং [গুলি,টি+ +1]সঠিক পয়েন্ট হিসাবে। এই পশ্চিম দিকের আন্দোলনের নামকরণ করা হয়েছেটিওয়াটনিবন্ধে, এবং তাই আমার স্ট্রিং এটির জন্য প্রকর্ম গঠন করছে। যদিটি ইতিমধ্যে শেষ কলাম, তাই যে টি+ +1 আমরা নেই [গুলি,টি-1] তৃতীয় পয়েন্ট হিসাবে এবং সেই অনুযায়ী ক্রিয়াটি সংশোধন করুন: দুটি ত্রিভুজ ঘূর্ণন 7 এবং 8 নিদর্শন দ্বারা সম্পাদিত হয় (মূল 7 এবং 1 এর পরিবর্তে) টিওয়াট ক্রম).

অবশেষে, যদি এনঅদ্ভুত, বাকি দুটি উপাদান অবশ্যই ইতিমধ্যে স্থানে থাকা উচিত, কারণ আমাদের নিশ্চিত যে কোনও সমাধান রয়েছে। যদিএন এমনকি সমান, এবং বাকি দুটি উপাদান স্থানে নেই, তবে লেমা 1 (পৃষ্ঠা 22) অনুসারে সেগুলি একটি সিরিজ দ্বারা অদলবদল করা যেতে পারে টিওয়াট একটি চাল পূর্বের পরে চলুন,=আর)। যেহেতু প্রদত্ত উদাহরণটি প্রথম দুটি এন্ট্রিগুলিকে অদলবদল করে এবং আমাদের শেষ দুটিটি স্যুপ করা দরকার, তাই আমাদের সম্পাদনা proc swapকরেটিওয়াট বিপরীত ক্রমে সরানো।

প্রান্ত ক্ষেত্রে এন=2 আমাদের এই সমস্ত জটিল প্রক্রিয়াটি মোটেই প্রয়োজন নেই - যদি প্রথম সারির উপাদানগুলি অংশ 1 এর পরে স্থানে না থাকে তবে এককভাবে 1আর ম্যাট্রিক্স পুরোপুরি অর্ডার করার জন্য সরানো যথেষ্ট।

আপডেট: নতুন যুক্ত করা হয়েছে proc rotationsযা পদক্ষেপের দিকটিকে বিপরীত করে যদি এর ফলে কম পদক্ষেপ হয়।


চিত্তাকর্ষক! আমি তখন আরও কিছু পরীক্ষার কেস তৈরি করব। এদিকে, আমি নিশ্চিত যে এই সমাধানটি অনুকূলিত হতে পারে, কারণ এখানে 7L,7L,7L,7L,7D,7D,7D,7Dহ্রাস করা যেতে পারে এবং 9x9 ম্যাট্রিক্সের জন্য 8R,8R,8R,8R,8R,8R,8Rরূপান্তরিত হতে পারে বলে 8L,8Lমতগুলি রয়েছে।
চার্লি

আমি আপনার অ্যালগরিদমটি 100x100 ম্যাট্রিক্স দিয়ে চেষ্টা করেছি এবং এটি 4 সেকেন্ডেরও কম সময়ে সলভ করে। আমি সত্যিই এই সমস্যার লিনিয়ার-সময় সমাধানের আশা করিনি। আমি ভবিষ্যতে আরও ভাল চ্যালেঞ্জ লেখার চেষ্টা করব!
চার্লি

একমাত্র পরীক্ষার কেস হিসাবে একক, স্থির ম্যাট্রিক্স দিয়ে এই চ্যালেঞ্জটি উত্থাপন করা আরও ভাল হত এবং বিজয়ী মানদণ্ডটিকে সমাধানের সন্ধানের পথের আকার হিসাবে সেট করা ভাল হত, যদি আমি জানতাম যে এই সমস্যাটির ও আছে (n ^ 2) সমাধান। আপনি কি এই জাতীয় জয়ের মানদণ্ডের সাথে একটি নতুন প্রশ্নের উত্তরটি পোর্টিং বিবেচনা করবেন?
চার্লি

@ চার্লি যদিও আমি এখনও বর্তমান সমাধানটিকে কিছুটা পরিমার্জন করার চেষ্টা করব, সামগ্রিক পথের অপ্টিমাইজেশান সমস্যাটি কীভাবে মোকাবেলা করা যায় তা সম্পর্কে আমার সত্যিই ধারণা নেই ...
ক্যারিল এল।

5

পাইথন 2 , টিআইওতে <30 সেকেন্ডে আকার 100

import random
def f(a):
 d = len(a)
 r = []
 def V(j, b = -1):
  b %= d
  if d - b < b:
   for k in range(d - b):
    if r and r[-1] == "U%d" % j:r.pop()
    else:r.append("D%d" % j)
    b = a[-1][j]
    for i in range(len(a) - 1):
     a[-1 - i][j] = a[-2 - i][j]
    a[0][j] = b
  else:
   for k in range(b):
    if r and r[-1] == "D%d" % j:r.pop()
    else:r.append("U%d" % j)
    b = a[0][j]
    for i in range(len(a) - 1):
     a[i][j] = a[i + 1][j]
    a[-1][j] = b
 def H(i, b = -1):
  b %= d
  if d - b < b:
   for k in range(d - b):
    if r and r[-1] == "L%d" % i:r.pop()
    else:r.append("R%d" % i)
    a[i] = a[i][-1:] + a[i][:-1]
  else:
   for k in range(b):
    if r and r[-1] == "R%d" % i:r.pop()
    else:r.append("L%d" % i)
    a[i] = a[i][1:] + a[i][:1]
 b = sorted(sum(a, []))
 for i in range(d - 1):
  for j in range(d):
   c = b.pop(0)
   e = sum(a, []).index(c)
   if e / d == i:
    if j == 0:H(i, e - j)
    elif j < e % d:
     if i:
      V(e % d, 1)
      H(i, j - e)
      V(e % d)
      H(i, e - j)
     else:
      V(e)
      H(1, e - j)
      V(j, 1)
   else:
    if j == e % d:
     H(e / d)
     e += 1
     if e % d == 0:e -= d
    if i:
     V(j, i - e / d)
    H(e / d, e - j)
    V(j, e / d - i)
 c = [b.index(e) for e in a[-1]]
 c = [sum(c[(i + j) % d] < c[(i + k) % d] for j in range(d) for k in range(j)) % 2 and d * d or sum(abs(c[(i + j) % d] - j) for j in range(d)) for i in range(d)]
 e = min(~c[::-1].index(min(c)), c.index(min(c)), key = abs)
 H(d - 1, e)
 for j in range(d - 2):
  e = a[-1].index(b[j])
  if e > j:
   c = b.index(a[-1][j])
   if c == e:
    if e - j == 1:c = j + 2
    else:c = j + 1
   V(e)
   H(d - 1, j - e)
   V(e, 1)
   H(d - 1, c - j)
   V(e)
   H(d - 1, e - c)
   V(e, 1)
 return r

এটি অনলাইন চেষ্টা করুন! লিঙ্কটিতে পূর্ণ পদক্ষেপের আউটপুট সহ তিনটি ছোট পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে, এবং কোডটি কাজ করে তা দেখানোর জন্য 100x100 এর নীরব পরীক্ষা (সরানো আউটপুট টিআইওর সীমা ছাড়িয়ে যাবে)। ব্যাখ্যা: কোড অ্যারেতে একটি সন্নিবেশ বাছাই করার চেষ্টা করে, এটি আরোহণের ক্রম হিসাবে এটি চলে যাওয়ার সাথে সাথে তৈরি করে। শেষ সারি বাদে সমস্ত সারির জন্য, এখানে বেশ কয়েকটি কেস রয়েছে:

  • উপাদানটি সঠিক সারিতে রয়েছে তবে এটি কলাম 0 এর সাথে সম্পর্কিত this এই ক্ষেত্রে, এটি 0 কলামে পৌঁছানো অবধি ঘোরানো হবে।
  • উপাদানটি সঠিক জায়গায় রয়েছে। এই ক্ষেত্রে, কিছুই ঘটে না। (উপাদানটি কলাম 0-এ অন্তর্ভুক্ত থাকলে এটিও সত্য, কেবল 0 টি আবর্তন সে ক্ষেত্রে ঘটে))
  • উপাদানটি শীর্ষ সারিতে রয়েছে তবে ভুল কলামে রয়েছে। সেক্ষেত্রে এটি নীচে আবর্তিত হয়, তারপরে অনুভূমিকভাবে অ্যালিমেন্টটি সঠিক কলামে না আসা পর্যন্ত, তারপরে আবার ঘোরানো হয়।
  • উপাদানটি সঠিক সারিতে তবে ভুল কলামে রয়েছে। সেক্ষেত্রে এটি ঘোরানো হয়, তারপরে সারিটি তার কলামে আবর্তিত হয়, তারপরে এটি নীচে ঘোরানো হয়, তারপরে সারিটি আবার ঘোরানো হয়। (কার্যকরভাবে এটি পরবর্তী ক্ষেত্রে একটি ঘূর্ণন is)
  • উপাদানটি সঠিক কলামে তবে ভুল সারিতে রয়েছে। সেক্ষেত্রে, শেষের ক্ষেত্রে এটি হ্রাস করতে, সারিটি ডানদিকে ঘোরানো হয়।
  • উপাদানটি ভুল সারি এবং ভুল কলামে রয়েছে। এই ক্ষেত্রে, সঠিক কলামটি ভুল সারিটিতে আবর্তিত হয় (শীর্ষ সারির জন্য এড়িয়ে যায়), সেই সারিটি পরে সঠিক কলামে আবর্তিত হয় এবং কলামটি আবার ঘোরানো হয়।

উপরের রোটেশনগুলি যে কোনও দিকে পদক্ষেপের সংখ্যা হ্রাস করে; উপরের বর্ণনাকে বিবেচনা না করে একটি আকার 2 বর্গক্ষেত্র সর্বদা বাম এবং উপরের চালগুলি দিয়ে সমাধান করা হয়।

নীচের সারিটি সম্পন্ন হওয়ার আগে, এটি স্থানের বাইরে মোট দূরত্ব হ্রাস করার জন্য ঘোরানো হয়, তবে নীচের সারিটির সমতাও সমান হয় তা নিশ্চিত করতে, কারণ এটি অ্যালগরিদমের চূড়ান্ত অংশ দ্বারা পরিবর্তন করা যায় না। যদি একই ন্যূনতম দূরত্ব সহ একাধিক আবর্তন হয় তবে ক্ষুদ্রতম সংখ্যক চালগুলির সাথে ঘূর্ণনটি বেছে নেওয়া হয়।

নীচের সারিটির অ্যালগরিদম একটি 7-অপারেশন ক্রমের উপর নির্ভর করে যা তিনটি কলামে উপাদানগুলির বিনিময় করে। ক্রমটি তাদের পছন্দসই স্থানে আনার জন্য নীচের সারির অবশিষ্ট সংখ্যাগুলির প্রত্যেকটিতে প্রয়োগ করা হয়; যদি সম্ভব হয় তবে সেই অবস্থানের উপাদানটিকে তার পছন্দসই স্থানে স্থানান্তরিত করা হয়েছে, তবে যদি কোনও সোজা অদলবদলের প্রয়োজন হয় তবে উপাদানটি কেবলমাত্র নিকটতম উপলব্ধ কলামে স্থানান্তরিত হবে, আশা করা যায় এটি পরের বার স্থির করার অনুমতি দেয়।


আপনার উত্তরের জন্য আপনাকে অনেক ধন্যবাদ, নীল! তবে মনে রাখবেন, এটি কোনও কোড গল্ফ নয়। কোডটির দৈর্ঘ্যের পরিবর্তে আপনার সমাধান হওয়া এনএক্সএন ম্যাট্রিক্সের সবচেয়ে বড় আকারের এন এবং সেই ম্যাট্রিক্স সমাধানের জন্য আন্দোলনের তালিকার দৈর্ঘ্যটি নির্দেশ করা উচিত।
চার্লি

@ চার্লি ওয়েল, এটি 6, তবে কেবলমাত্র আমি বড় ম্যাট্রিক্সে পেস্ট করতে খুব অলস হয়েছি। যদিও এটি নিষ্ঠুর শক্তি, এটি ক্ষেত্রের সাথে সামঞ্জস্যপূর্ণভাবে স্কেল করে, তাই এটি বড় ম্যাট্রিক্সে সক্ষম হওয়া উচিত।
নিল

প্রকৃতপক্ষে, সবচেয়ে খারাপ ক্ষেত্রেটি ক্ষেত্রের সাথে চতুর্ভুজ হতে পারে।
নীল

1
@ চার্লি টিআইও লিঙ্কটি এখন এলোমেলো 100x100 ম্যাট্রিক্স সমাধান করে।
নীল

1
@ চারলি আমি এখন নীচের সারির জন্য একটি বড় অনুকূলতা নিয়ে এসেছি, তবে আমি মনে করি এটিই শেষ পরিবর্তন যা আমি এই উত্তরটি নিয়ে যাচ্ছি।
নীল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.