পুনঃনির্দিষ্ট সাবসেটের উপর ভিত্তি করে একটি মাস্টার তালিকার পুনঃক্রম করুন


19

আমার সম্প্রতি দুটি কার্যক্ষেত্রে কাজ করার সময় আমার সমস্যা সমাধান করতে সমস্যা হয়েছিল: একটি মাস্টার তালিকা এবং একটি ছোট তালিকাতে যে মাস্টার তালিকায় থাকা আইটেমগুলির একটি উপসেট সম্ভাব্যভাবে আলাদাভাবে রয়েছে। আমাকে মাস্টার তালিকাটি এমনভাবে পুনঃক্রম করতে হবে যাতে সাবসেটের আইটেমগুলি তালিকায় পাওয়া যায় না এমন আইটেমগুলির ক্রম পরিবর্তন না করে এবং যখনই সম্ভব সম্ভব আইটেমগুলিকে একই স্থানে না রেখে একই ক্রমে উপস্থিত হয়। ঠিক আছে, এটি সম্ভবত বিভ্রান্তিকর শোনায়, তাই আমি এটিকে ভেঙে দেব:

  • মাস্টার তালিকা আইটেমগুলির ডিফল্ট ক্রম সংজ্ঞায়িত করে।
  • সাবসেটের তালিকা নির্দিষ্ট আইটেমগুলির আপেক্ষিক ক্রম সংজ্ঞায়িত করে।
  • সাবসেট তালিকা অনুসারে যেখানে মাস্টার তালিকার দু'টি উপাদান রয়েছে, সেখানে মাস্টার তালিকার আগে থাকা আইটেমটি প্রাথমিক সূচীতে স্থানান্তরিত করা উচিত যেখানে এটি সাবসেট তালিকার অন্যান্য আইটেমের তুলনায় সঠিক অবস্থানে রয়েছে। (যেমন পরবর্তী আইটেমের সাথে সাথে)

আপনার কাজ হ'ল এই পুনর্নির্মাণ অ্যালগরিদমটি কার্যকর করা।

উদাহরণ পরীক্ষার ক্ষেত্রে

Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]

Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]

Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]

Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]

Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]

Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]

Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]

Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]

Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]

Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]

বিধি

  • স্ট্যান্ডার্ড লুফোলস, ইয়াড্ডা ইয়াড্ডা, সুবিধাজনক আই / ও, ব্লাহ ব্লাহ।
  • যদিও উদাহরণগুলি সংখ্যা এবং স্ট্রিং ব্যবহার করে, আপনার কেবলমাত্র একটি উপাদান ধরণের সমর্থন করতে হবে, সেগুলি ইঙ্গিতগুলি, স্ট্রিংগুলি, বা ভিন্নরূপের তালিকাসমূহের সাথে সুসংজ্ঞায়িত সমতা শব্দার্থবিজ্ঞানের সাথে অন্য কোনও কিছুর ক্ষেত্রে আপনার ভাষাতে সুবিধাজনক।
  • আপনি উভয় মাস্টার তালিকা এবং উপসেট তালিকার কোনও সদৃশ নেই বলে ধরে নিতে পারেন
  • আপনি ধরে নিতে পারেন যে সাবসেট তালিকায় পাওয়া সমস্ত আইটেমগুলি মাস্টার তালিকায় পাওয়া গেছে
  • হয় তালিকা খালি হতে পারে
  • আপনাকে অবশ্যই সর্বনিম্ন, 100 টি উপাদান পর্যন্ত দীর্ঘ অ্যারে সমর্থন করতে হবে।
  • পুনরায় ক্রম স্থানে বা নতুন তালিকা / অ্যারে তৈরির মাধ্যমে প্রয়োগ করা যেতে পারে।

শুভ গল্ফিং!


1
একটি দুর্দান্ত, মৌমাছির সমস্যা।
জোনাহ

কি 8 1 3 4 5 6 7 2 9 12 11 10দ্বিতীয়-টু-গত এক একটি বৈধ সমাধান?
ভেন

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

একাধিক সঠিক উত্তর আছে কেন এটি বিবেচনা করে? দয়া করে চ্যালেঞ্জের নিয়মগুলিতে সীমাবদ্ধতা যুক্ত করুন।
ভেন

উত্তর:


4

রেটিনা 0.8.2 , 51 বাইট

+`(\b(\w+),(\w+)\b.*¶.*\b)\3,(.*\b\2\b)
$1$4,$3
1A`

এটি অনলাইন চেষ্টা করুন! প্রথম লাইনে সাবওয়ার্ডের কমা-বিচ্ছিন্ন তালিকা এবং দ্বিতীয় লাইনে কমা-বিচ্ছিন্ন শব্দের মাস্টার তালিকা হিসাবে ইনপুট নেয়। ব্যাখ্যা:

(\b(\w+),(\w+)\b.*¶.*\b)\3,(.*\b\2\b)

দুটি সংলগ্ন সাবওয়ার্ড সন্ধান করুন যেখানে দ্বিতীয় শব্দটি মাস্টার তালিকার প্রথমের আগে।

$1$4,$3

মাস্টার তালিকায় প্রথম শব্দের পরে দ্বিতীয় শব্দটি প্রদর্শিত হবে Move

+`

কোনও শব্দ ক্রমানুসারে উপস্থিত না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

1A`

সাবওয়ার্ডস মুছুন।


4

জাভাস্ক্রিপ্ট (ES6),  96 89 74  71 বাইট

এটি একটি বিশাল গণ্ডগোল হিসাবে শুরু হয়েছিল এবং শেষ পর্যন্ত একটি সংক্ষিপ্ত এবং মার্জিত আকারে সঙ্কুচিত হয়েছিল। আমি ধন্যবাদ জানাতে চাই এটির ফলস্বরূপ সহযোগিতার জন্য .splice () পদ্ধতিটি । ;)

হিসাবে ইনপুট লাগে (master)(subset)। মাস্টার তালিকা আপডেট করে আউটপুট।

m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))

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

কিভাবে?

আমিপি

m.splice(p, 0, ...m.splice(i, condition))

1

  • আমি[মিএনটি]
  • ছড়িয়ে পড়া সিনট্যাক্সের জন্য ধন্যবাদ , এই উপাদানটি বাহ্যিক .splice () এর 3 য় আর্গুমেন্ট হিসাবে প্রসারিত করা হয়েছে , যার ফলে এটি পজিশনে ফিরে to োকানো হয় causesপি

0

  • অভ্যন্তরীণ .splice () কিছুই অপসারণ করে এবং খালি অ্যারে প্রদান করে
  • ফলে বাইরের .splice () পায় undefined তার 3 য় আর্গুমেন্ট হিসাবে এবং কিছুই পারেন ঢোকানো হয়

মন্তব্য

m => s =>                 // m[] = master list, s[] = subset list
  s.map(                  //
    p =                   // p = position in the master list of the last element from
                          //     the subset list (initialized to a non-numeric value)
    x =>                  // for each element x in the subset list:
    m.splice(             //   insert in the master list:
      p,                  //     at position p
      0,                  //     without removing any element
      ...m.splice(        //     remove from the master list and flatten:
        i = m.indexOf(x), //       i = position of x in the master list
        p > i             //       if p is greater than i, remove x from its current
                          //       position and insert it at position p
        || !(p = i)       //       otherwise, set p to i and don't remove/insert anything
      )                   //     end of inner splice()
    )                     //   end of outer splice()
  )                       // end of map()

1
"আমি ... স্প্লাইস () পদ্ধতির জন্য ধন্যবাদ জানাতে চাই ..." কিউ পিপিসি অস্কারের সংগীত ... :)
চ্যাস ব্রাউন

আরও সঠিকভাবে, বহিরাগত স্প্লাইস কলটি যথাক্রমে 3 বা 2 টি আর্গুমেন্ট গ্রহণ করে, যা এটি সঠিক কাজটি করে।
নীল

2

হাস্কেল, 79 বাইট

(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m

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

(m:n)#u@(s:t)                 -- m: head of master list
                              -- n: tail of master list
                              -- s: head of subset
                              -- t: tail of subset
                              -- u: whole subset
   |m==s                      -- if m==s
        =m:n#t                -- return 'm' and append a recursive call with 'n' and 't'
   |all(/=m)u                 -- if 'm' is not in 'u'
             =m:n#u           -- return 'm' and append a recursive call with 'n' and 'u'
   |                          -- else (note: 's' is element of 'n')
    (x,_:z)<-span(/=s)n       -- split 'n' into a list 'x' before element 's' and
                              -- a list 'z' after element 's' and
       = (x++s:m:z)#u         -- make a recursive call with
                              -- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's') 
                              -- and 'u'
m # _ = m                     -- if either list is emtpy, return the master list

2

রুবি , 73 68 বাইট

->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}

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

কিভাবে?

  • এর মধ্যে ছেদটি aএবং bএর সমস্ত উপাদান রয়েছে bতবে আমরা তাদের যেমন খুঁজে পেয়েছি ঠিক একই ক্রমেa
  • সুতরাং, আমরা যদি পুনরাবৃত্তি b সমান্তরালভাবে এবং আমরা কোনও পার্থক্য পেয়েছি, আমরা একটি উপাদানকে স্থানান্তর করতে পারি।
  • aআমরা যে উপাদানটির সন্ধান পেয়েছি সেটির অবস্থান কেটে পুনঃস্থাপন করা হয়b , তার পরে ছেদটিতে থাকা উপাদানটি সরিয়ে, এবং তারপরে একটি এর অবশিষ্ট অংশ যুক্ত করে পুনঃস্থাপন করা হয়।
  • সমস্ত উপাদান bসঠিক ক্রমে না হওয়া পর্যন্ত শুরু থেকে পুনরাবৃত্তি করুনa

0 কি করছে 0while?
জোনাহ

এটি কেবল একটি এনওপি।
জিবি

কেন এটি প্রয়োজন?
জোনাহ

1
কারণ লুপটি শুরু করার আগে কোনও ভেরিয়েবলের ঘোষণা এড়াতে, তুলনা এবং হেরফেরটি একটি একক ব্লকেই করা হয়। এর অর্থ: "অপারেশনটি সত্য হয়ে উঠাকালীন কিছুই করবেন না" ", কোড" অপারেশন করার পরে ফলাফল সত্য হওয়ার চেয়ে "সংক্ষিপ্ত
জিবি


1

পার্ল 6 , 40 বাইট

{*.permutations.first(*.grep(.any)eq$_)}

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

বেনামি কোড ব্লক যা ইনপুটটি কারিটেড লাগে (যেমন f(subList)(masterList)বেনামি ক্রিটিড করে তোলে , এবং মাস্টার তালিকার সূচকের প্রথম লেক্সোগ্রাফিক ক্রমায়ন খুঁজে পায় যেখানে সাব তালিকার উপাদানগুলি সঠিক ক্রমে রয়েছে।

স্বজ্ঞাতভাবে, প্রথম সন্তোষজনক ক্রমানুসারে সঠিক অর্ডার করা উপাদানগুলি মূল ক্রমে রেখে দেবে, যখন ভুলভাবে স্থাপন করা হয় তাদের সঠিক ক্রমে রাখার জন্য ন্যূনতম প্রয়োজনীয় দূরত্বকে এগিয়ে নিয়ে যায়, যা এটিকে সাবসেটের পূর্ববর্তী উপাদানগুলির পরে সরাসরি রাখে।

ব্যাখ্যা:

{*                                     } # Anonymous code block that returns a lambda
  .permutations                          # In all permutations of the master list
               .first(                )  # Find the first permutation
                     (*.grep(.any)       # Where the order of the subset
                                  eq$_   # Is the same as the given order


1

জেলি , 9 বাইট

Œ!iⱮṢƑ¥ƇḢ

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

অপর্যাপ্ত, বিশেষত বৃহত্তর মাস্টার তালিকাগুলি সহ। সমস্ত সম্ভাব্য ক্রম তৈরি করে, যেখানে সাবসেটটি ভুল ক্রমে থাকে তাদের ফিল্টার করে এবং তারপরে প্রথমটি ফিরিয়ে দেয়।

ব্যাখ্যা

Œ!        | Generate all permutations of the master list
      ¥Ƈ  | Filter including only those where...
  iⱮ      |   the index of each sublist item in this permutation...
     Ƒ    |   is...
    Ṣ     |   in order. 
        Ḣ | Finally take the first item

এটি এই নিয়মের সাথে সঙ্গতিপূর্ণ বলে মনে হয় না "যেখানে সাবসেটের তালিকা অনুসারে মাস্টার তালিকার দুটি উপাদান যথাযথভাবে বাইরে রয়েছে সেখানে মাস্টার তালিকার আগে যে আইটেমটি রয়েছে সেটিকে প্রাথমিক সূচীতে স্থানান্তরিত করা উচিত যেখানে এটি রয়েছে উপসেট তালিকা মধ্যে থাকা অন্যান্য আইটেম সঠিক অবস্থানে আপেক্ষিক (অর্থাত অবিলম্বে পরে আইটেমের পরে) "।
Beefster

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

@ উইফস্টার আমি এখন মহিলাদের নাম এবং 1..12 বাদে আপনার সমস্ত উদাহরণ ব্যবহার করে দেখেছি এবং ফলাফলের ক্রমটি সঠিক।
নিক কেনেডি

2
@ বিফস্টার আমার উত্তরটির কেন এটি কাজ করে তার একটি আংশিক ব্যাখ্যা রয়েছে
জো কিং

1

জে , 49 বাইট

[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<\[

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

ব্যাখ্যা

আমরা সাবসেটটি বাম দিকের আর্গ হিসাবে এবং পুরো ইনপুটটিকে ডান হিসাবে নিই।

আমরা স্বচ্ছতার জন্য একটি নির্দিষ্ট উদাহরণ সহ কোডটির মাধ্যমে কাজ করব:

5 2 4 f 1 2 3 4 5

সাবসেটের দুটি আকারের বক্সযুক্ত ইনফিক্সগুলি নিন:

2 <\ [

উৎপাদন:

┌───┬───┐
│5 2│2 4│
└───┴───┘

এগুলি মূল ইনপুটগুলিতে যুক্ত করুন এবং পুরো জিনিসটি বিপরীত করুন:

] |.@;

আমরা পেতে:

┌───┬───┬─────────┐
│2 4│5 2│1 2 3 4 5│
└───┴───┴─────────┘

সমস্যা সমাধান করা উপরের অংশে ডান থেকে বাম হ্রাস হয়ে যায়। Sertোকানোর জন্য আমাদের কেবল সঠিক ক্রিয়াটি খুঁজে পাওয়া দরকার/আইটেমগুলির মধ্যে ।

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

যদি জোড়ার ক্রমটি ইনপুটটিতে অর্ডার দেওয়ার মতো হয় তবে নিম্নলিখিত 0টি মূল্যায়ন করবে এবং আমরা কিছুই করব না:

^:(>/@i.~)

অন্যথায় এটি 1 এর মূল্যায়ন করবে এবং আমরা ক্রিয়াটি বামে প্রয়োগ করব ^:

   {: + i.@>:@-/)@i.~ C. ]

যা বাম আইটেমটিকে ডান আইটেমের ডানে সরিয়ে দেয়। এই আন্দোলনটি কেবল একটি চক্রীয় অনুক্রম হয় দুটি উপাদান (এবং সহ) এর মধ্যে সমস্ত আইটেমের ।

জে যেমন একটি চক্রীয় অনুমান প্রয়োগ আদিম আছে:

<cyclic permutation definition> C. ]

এবং ক্রিয়াটির বাকী অংশগুলি আমাদের চক্র করতে হবে এমন সূচকগুলি বেছে নেওয়া ছাড়া কিছুই করে না:

{: + i.@>:@-/)@i.~

যা এটি হওয়া উচিত তার চেয়ে দীর্ঘ মনে হয়, তবে আমি এই বাক্যাংশটি আরও গল্ফ করতে সক্ষম হইনি।

অবশেষে আমরা ফলাফলটি পুনরায় বাক্স <@করব এবং আমরা সম্পন্ন করেছি।


0

জেলি , 24 বাইট

i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị

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

ব্যাখ্যা

একটি ডায়াডিক লিঙ্ক যা সাবসেটটি বাম হিসাবে এবং মাস্টার তালিকার ডান আর্গুমেন্ট হিসাবে গ্রহণ করে। নীচের উদাহরণটি 9001, 42, 69, 1337, 420, 99, 255 মাস্টার হিসাবে এবং 69, 9001, 1337 উপসেট হিসাবে ব্যবহার করে।

i@€                      | Find the index of each subset item in the master list [3, 1, 4]
         Ʋ               | Previous 4 links as a monad
   MƤ                    | Find the index of the maximum for each prefix of this list [1, 1, 3]
     F                   | Flatten (because the previous result are actually each length one lists)
      Ṭ                  | Convert to a boolean list [1,0,1]
       œṗ                | Partition the [3, 1, 4] list before each 1 [[], [3, 1], [4]]
          Ḋ              | Remove the empty first list [[3, 1], [4]]
                    ¥    | Previous two links as a dyad
                  ʋ@     | Previous 4 links as a dyad with reversed arguments
            J            | Sequence along the master list [1, 2, 3, 4, 5, 6, 7]
             ḟF}         | Filter out items in the flattened [3, 1, 4] list
                W€       | Wrap each item as a list [[2], [5], [6], [7]]
           ;             | Concatenate rhis to the [[3, 1], [4]] list
                     Ṣ   | Sort (effectively by first item in each list) [[2], [3, 1], [4], [5], [6], [7]]
                      F  | Flatten
                       ị | Look up in original master list (and implicitly output)

0

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 118 বাইট

a=>b=>{for(int j;b.Any();)foreach(var e in b.Intersect(a.Take(j=a.IndexOf(b.Dequeue())))){a.Remove(e);a.Insert(j,e);}}

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

System.Collections.Genericনেমস্পেসে কয়েকটি ক্লাসের সুবিধা নেওয়া । মাস্টার একটি List<T>এবং উপসেটটি একটি Queue<T>

// a: master
// b: subset
a=>b=>{
  // continue until b is empty
  for(int j;b.Any();)
    // iterate over values that are out of order in a
    // per the head of b using loop variable e
    foreach(var e in
      // the out of order values are determined by
      // intersecting remaining values in b with
      b.Intersect(
        // values in a occurring before the current head of b
        // save the position in a to variable j and remove the head of b
        a.Take(j=a.IndexOf(b.Dequeue()))
      )
    ){
      // push back the out of order element in a
      a.Remove(e);
      a.Insert(j,e);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.