আমার মোজা বাছাই করতে আমাকে সহায়তা করুন!


30

আমার কাছে পরিষ্কার মোজার একটি গাদা আছে যা আমি জোড়াগুলিতে সাজতে চাই। দুর্ভাগ্যক্রমে, আমি কেবল স্তূপের উভয় প্রান্ত থেকে মোজা নিতে পারি, মাঝেরটি নয়। আরও, আমি কেবল একবারে গাদা জুড়ি থেকে মুছে ফেলতে পারি। আমার কৌশলটি হ'ল প্রথমে স্তূপটিকে এক বা একাধিক ছোট পাইলগুলিতে ভাগ করা। আমি মনে করি কিছু উদাহরণ এটি পরিষ্কার করে দেবে। আমি প্রতিটি মোড়কে ধনাত্মক পূর্ণসংখ্যা হিসাবে উপস্থাপন করব (মিলের পূর্ণসংখ্যার সমান মোজা নির্দেশ করে)।

যদি মোজার প্রাথমিক স্তূপ হয়

1 2 3 3 2 1

তাহলে আমাকে কোনও বিভাজন করতে হবে না। আমি উভয় 1মোজা, তারপর উভয় 2মোজা, তারপর উভয় 3মোজা মুছতে পারি ।

পরিবর্তে প্রাথমিক স্তূপ হয়

1 2 3 2 3 1

তারপরে আমাকে প্রথমে এটি বিভক্ত করতে হবে কারণ আমি সমস্ত মোজাগুলি কেবল শেষ থেকে সরিয়ে নিয়ে জোড়া করতে সক্ষম হব না। একটি সম্ভাবনা এটি দুটি গাদা মধ্যে বিভক্ত হয়

1 2 3 and 2 3 1

এখন আমি 1মোজাগুলি, ছাড়ার 2 3 and 2 3পরে, 3মোজা অনুসরণ করে , ছেড়ে যাওয়া 2 and 2এবং অবশেষে মোজাগুলি মুছতে পারি 2

আপনার কাজ

মোজাগুলির প্রাথমিক স্তূপ দেওয়া, এমন একটি প্রোগ্রাম লিখুন যা এটি ছোট পাইলগুলিতে বিভক্ত করবে যা আমাকে মোজাগুলি বাছাই করতে দেয়। আপনার প্রোগ্রামটি গাদাটিকে কয়েকটি সংখ্যক পাইল সম্ভাব্য সংখ্যায় বিভক্ত করতে হবে (যদি একাধিক সেরা সমাধান থাকে তবে আপনাকে কেবল একটি সন্ধান করতে হবে)।

ইনপুটটি তালিকা, সীমানাযুক্ত স্ট্রিং বা অন্যান্য সুবিধাজনক ফর্ম হিসাবে দেওয়া হবে। এটিতে প্রতিটি পূর্ণসংখ্যার ঠিক দু'বার সংঘটিত হওয়ার সাথে কেবলমাত্র 1কয়েকটি পূর্ণসংখ্য এবং কয়েকটি সর্বাধিক মান nথাকে।

আউটপুটটি কোনও সুবিধাজনক আকারে দেওয়া ইনপুট তালিকাটিকে ছোট তালিকায় বিভক্ত হওয়া উচিত।

উদাহরণ

Input             Sample Output
1 1               1 1
1 2 1 2           1; 2 1 2
1 3 2 4 3 2 1 4   1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2   1; 2 3; 4 3 4 1 2
1 1 2 2 3 3       1 1 2; 2 3 3
4 3 4 2 2 1 1 3   4 3 4 2; 2 1 1 3

মনে রাখবেন যে এইগুলির বেশিরভাগ ইনপুটগুলির জন্য এটি কেবলমাত্র অনুমোদিত আউটপুট নয়। দ্বিতীয় ক্ষেত্রে, উদাহরণস্বরূপ, আউটপুট 1 2; 1 2বা 1 2 1; 2স্বীকৃত হবে।

কিছু পরীক্ষার পরামর্শের জন্য Sp3000 ধন্যবাদ!

আমি আমার জামাকাপড় বাছাই করা দীর্ঘ সময় ব্যয় করা ঘৃণা করি, তাই আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত করুন। বাইট জিতে স্বল্পতম উত্তর!

নোট

  • এর মোড়ের জুড়ি আছে কিনা তা দেখার জন্য আমি কোনও মোড়ের পিছনে তাকাতে চাই না, সুতরাং উভয় মোজা একই পাত্রে জোড়া লাগানোর অনুমতি নেই। উদাহরণস্বরূপ, যদি গাদাটি থাকে 1 1 2 2তবে আপনি এটিকে একটি গাদা হিসাবে ছেড়ে দিতে এবং 1বাম প্রান্ত থেকে উভয় মোজা নিতে পারবেন না ।

5
আমি বলতে পারি পিপিসিজি কার্মিস্টারকে স্বাগতম। এটি খুব ভাল প্রথম চ্যালেঞ্জ +1 is
লজিক নাইট

1
পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি খুব ভাল প্রথম প্রশ্ন। যদিও এই প্রশ্নের কোনও বড় সমস্যা রয়েছে বলে মনে হচ্ছে না, আমরা ব্যবহারকারীদের পোস্ট করার আগে তাদের চ্যালেঞ্জগুলির বিষয়ে প্রতিক্রিয়া জানাতে স্যান্ডবক্স ব্যবহার করতে উত্সাহিত করি।
মেগো

সুতরাং ( -> -> ) 123213ভাগ করা যায় ? 1; 23; 2131; 23; 2131; 2; 21; 2; 2
আর কাপ,

@ মেগো ধন্যবাদ! ভবিষ্যতে আমি তা নিশ্চিত করব। @ আর.ক্যাপ এটি এটিকে বিভক্ত করার একটি বৈধ উপায় হতে পারে তবে উত্তরের উত্তরটি এমন একটি বিভাজন দেওয়া উচিত যা এটি সম্ভব সংখ্যার নূন্যতম সংখ্যায় বিভক্ত করে। যেহেতু 123213শুধুমাত্র দুটি পাইল ব্যবহার করে বিভক্ত হওয়া সম্ভব , তাই আপনার উত্তরটি দুটি পাইল বিভক্ত করে দিতে হবে give
Carmeister

1
@ যদিও আমি আপনার প্রশ্নটি বুঝতে পেরেছি তা পুরোপুরি নিশ্চিত নই, তবে প্রাপ্ত মোজাগুলি প্রতিটি স্তূপের শুরুতে এবং প্রতিটি স্তূপের শেষে রয়েছে are
Carmeister

উত্তর:


6

পাইথ, 25 বাইট

hf!u #-R.-F{BhMs_BMGGT)./

পরীক্ষা স্যুট

ব্যাখ্যা:

hf!u #-R.-F{BhMs_BMGGT)./
                       ./    Form all partitions (implicitly) of the input.
 f                           Filter the permutations on
   u                 T)      Run the following function on the partition
                             until it reaches a fixed point:
                _BMG         Bifurcate the lists on reversal
               s             Concatenate
             hM              Take the first element of each list. 
                             These elements are all the ones on the ends of lists.
           {B                Bifurcate on deduplication
        .-F                  Bagwise subtraction.
                             Only elements repeated in ends of lists remain.
      -R            G        Remove these elements from each list.
   ' #'                      Filter out empty lists.
  !                          Negate. Only an empty list as fixed point succeeds.
h                            Output the first successful partition.

5

জাভাস্ক্রিপ্ট (ES6), 329

এমন কোনও ভাষার পক্ষে সহজ কাজ নয় যার কোনও সংমিশ্রণমূলক বিল্টিন নেই।

সম্ভবত চিকিত্সা আরও গল্ফযোগ্য।

দ্রষ্টব্য: সমস্ত বিভাজন কমপক্ষে 2 আকারের হয় কারণ একটি একক উপাদান সহ একটি পার্টিশন সর্বদা কম কার্যকর।

Example: [1] [2 3 4] // can take 1 or 2 or 4  
Better: [1 2] [3 4] // can take 3 too  
a=>{G=(v,i,u=v)=>{if(i--){for(;r[i]=--u;)if(G(u,i))return 1;}else for(w=[...r,n=l].map((x,i)=>a.slice(z,z=x-~i),z=0),y=w.join`;`;w.map(b=>[0,1].map(q=>(x=b[q*=~-b.length])&&(t[x]?([c,p]=t[x],n-=2,p?c.pop():c.shift(),q?b.pop():b.shift()):t[x]=[b,q])),c=0,t=[]),c;)if(!n)return 1};for(l=a.length,r=[],k=0;!G(l-k-1,k);k++);return y}

অংশে ব্যাখ্যা

(এটি অত্যধিক ভার্জোজ, তবে ব্যাখ্যা করা আমার কাছে শক্ত মনে হয়েছিল - অবশেষে "এগুলি সব একসাথে রেখে" এড়িয়ে যান)

একটি অ্যারের সমস্ত সম্ভাব্য বিভাজন গণনার জন্য পুনরাবৃত্ত ফাংশন

// v: array length
// i number of splits
// fill the global array r that must exists
G=(v,i,u=v)=>
{
  if(i--)
  {
    for(;r[i]=--u;)
      G(u,i)
  }
  else
  {
    // the current split position are in r, ready to use
    // for instance...
    parts = [...r,a.length].map(x=>a.slice(z,z=x),z=0)
    console.log(r, parts)
  }
};

r=[]
a=['A','B','C','D']
G(4, 2)

// output in console (firebug)
[2, 3] [["A", "B"], ["C"], ["D"]]
[1, 3] [["A"], ["B", "C"], ["D"]]
[1, 2] [["A"], ["B"], ["C", "D"]]

এখন, আমার 2 বা ততোধিক আকারের পার্টিশনগুলির প্রয়োজন, তাই আমার অবশ্যই এই ফাংশনটি সরলভাবে বিভিন্ন পরামিতিগুলি সহ ব্যবহার করতে হবে। প্যারামিটার ভি হ'ল "অ্যারের আকার - পছন্দসই পার্টিশনের সংখ্যা - 1"। তারপরে অবশ্যই পার্টিশনগুলি কিছুটা ভিন্ন উপায়ে তৈরি করতে হবে।

// Same call (4,2), same r, but the array b is of size 7
part = [...r,b.length].map((x,i)=>
          b.slice(z,z=x+i+1) // add 1 more element to each partition
       ,z=0))
// output in console (firebug) 
[2, 3] [["A", "B", "C"], ["D", "E"], ["F", "G"]]
[1, 3] [["A", "B"], ["C", "D", "E"], ["F", "G"]]
[1, 2] [["A", "B"], ["C", "D"], ["E", "F", "G"]]

সুতরাং, আমি বিভাজন, 1 বিভাজন, 2 বিভাজন এবং এর জন্য পার্টিশনের তালিকাটি গণনা করতে পারি। যখন আমি একটি কার্যকারী পার্টিশন পাই তখন আমি থামাব এবং ফলাফলটি আউটপুট করব।

পার্টিশন তালিকাটি পরীক্ষা করতে, স্ক্যান করতে, প্রতিটিটির শুরুতে এবং শেষে মানগুলি নোট করুন, যদি কোনও নামযুক্ত মান পাওয়া যায় তবে এটি মুছে ফেলুন। শেষ পর্যন্ত কিছুই অপসারণ না করা পর্যন্ত পুনরাবৃত্তি করুন: সমস্ত জোড় অপসারণ করা থাকলে এই বিভাজনটি ভাল।

t = []; // array to note the repeated values
// t[x] == [
//           subarray holding value x, 
//           position of value x (I care zero or nonzero)
//         ]
n = a.length // counter start, must reach 0
// remember part just in case, because this check will destroy it 
result = part.join(';') // a string representation for return value
do
{
  // in the golfed code there is a forr loop
  // all this body is inside the for condition
  c = 0; // init c to a falsy, if a pair is found c becomes truthy
  part.forEach(b=> // b: array, current partition
    [0,1].forEach(q=> ( // exec for 0 (start), 1 (end)
      q *= b.length-1, // now q is the correct index
      x = b[q]) // x is the value at start or end
      x && ( // b could be empty, check that x is not 'undefined'
        t[x] ? // is there a value in t at position x?
           ( // yes, remove the pair
             n-=2, // pair found, decrement counter
             [c, p] = t[x], // get stored array and position
             p ? c.pop() : c.shift(), // remove from c at start or end
             q ? b.pop() : b.shift()  // remove twin value from b
           )
           : // no, remember the value in t
             t[x] = [b, q]
    )) // end [0,1].forEach
  ) // end part.forEach
}
while (c) // repeat until nothing can be removed
if(!n) return 1 // wow, result found (in 'result' variable)

তারপরে, অনুপস্থিত অংশটি পার্টিশন গণনা বৃদ্ধি করে জি ফাংশনটি কল করে কেবল একটি লুপ। ফলাফল পাওয়া গেলে লুপটি প্রস্থান করুন।

সব একসাথে রাখুন

F=a=>{
  G=(v,i,u=v)=>{
    if (i--)
    {
      for(; r[i]=--u; )
        if (G(u,i)) 
          return 1;
    }
    else
    {
      w = [...r,n=l].map((x,i)=>a.slice(z, z = x-~i), z = 0);
      y = w.join`;`;
      for(; // almost all the for body is inside the condition
        w.map(b=>
          [0,1].map(q=>
            (x=b[q*=~-b.length])
             &&(t[x]
                ?([c,p]=t[x],n-=2,
                   p?c.pop():c.shift(),
                   q?b.pop():b.shift())
                :t[x]=[b,q])) // end [0,1].map
          ,c=0,t=[] // init variables for w.map
        ),c; // the loop condition is on c
      )
        if(!n)return 1 // this is the for body
    }
  };
  for(l = a.length, r = [], k = 0; !G(l-k-1, k); k++);
  return y
}

পরীক্ষা

F=a=>{G=(v,i,u=v)=>{if(i--){for(;r[i]=--u;)if(G(u,i))return 1;}else for(w=[...r,n=l].map((x,i)=>a.slice(z,z=x-~i),z=0),y=w.join`;`;w.map(b=>[0,1].map(q=>(x=b[q*=~-b.length])&&(t[x]?([c,p]=t[x],n-=2,p?c.pop():c.shift(),q?b.pop():b.shift()):t[x]=[b,q])),c=0,t=[]),c;)if(!n)return 1};for(l=a.length,r=[],k=0;!G(l-k-1,k);k++);return y}

console.log=x=>O.textContent+=x+'\n'

TestData=[[1,1],[1,2,1,2],[1,3,2,4,3,2,1,4],[1,2,3,4,3,4,1,2],[1,1,2,2,3,3],[4,3,4,2,2,1,1,3]]

TestData.forEach(t=>console.log(t+' -> '+F(t)))

function RandomTest() {
  var l=I.value*2
  var a=[...Array(l)].map((_,i)=>1+i/2|0)
  a.map((v,i)=>a[a[i]=a[j=0|i+Math.random()*(a.length-i)],j]=v) // shuffle
  Q.textContent=a+''+'\n\n'+F(a).replace(/;/g, ';\n') // better readability
}
Base test
<pre id=O></pre>
Random test. Number of pairs: <input id=I value=15><button onclick="RandomTest()">-></button>
<pre id=Q></pre>

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