নেকলেস বিভাজন সমস্যা


19

পটভূমি

নেকলেস বিভাজন সমস্যা (বা তিনি যেমন ডাকেন, চুরি করা নেকলেস সমস্যা) এবং বোরসুক-উলামের উপপাদ্যের সাথে এর সম্পর্ক সম্পর্কে আমি 3 ব্লু 1 ব্রাউনের সাম্প্রতিক ভিডিও থেকে অনুপ্রাণিত হয়েছি

এই সমস্যায়, দুই চোর বিভিন্ন ধরণের রত্ন সমন্বিত একটি মূল্যবান নেকলেস চুরি করেছে। রত্নের প্রতিটি ধরণের একটি এমনকি সংখ্যক রয়েছে এবং চোরেরা তাদের মধ্যে দুটি রত্নের মধ্যে সমানভাবে ভাগ করতে চায়। ক্যাচটি হ'ল তারা অবশ্যই নেকলেসকে কয়েকটি সংখ্যক সংক্ষিপ্ত অংশে বিভক্ত করে তাদের উভয়টির মধ্যে বিভাগগুলি বিতরণ করার মাধ্যমে তা করতে হবে।

এখানে চার মণি ধরনের প্রকাশ সঙ্গে একটি উদাহরণ S, E, D, এবং R(নীলকান্তমণি, পান্না, হীরা, এবং রুবি যথাক্রমে জন্য)। বলি যে নেকলেসটি নীচে রয়েছে:

[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]

আছে 8নীলকান্তমণি, 10পান্না, 4হীরা, এবং 6অমূল্য। আমরা নীচে নেকলেস বিভক্ত করতে পারেন:

[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]

তারপরে আমরা যদি প্রথম, তৃতীয় এবং পঞ্চম বিভাগকে একজন চোরকে এবং দ্বিতীয় এবং চতুর্থ অংশটি অন্য চোরকে দিয়ে থাকি তবে প্রত্যেকে 4নীলা, 5পান্না, 2হিরে এবং 3রুবি দিয়ে শেষ হবে :

[S],    [S,E,S,D,E,R,S],                            [R,R,D,E,E,E]
    [S],                [R,E,S,S,S,D,R,E,E,R,E,D,E],

0সূচকগুলি ব্যবহার করে , সূচকগুলিতে এই কাটাগুলি ঘটে [1,2,9,22]

লক্ষ্য

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

ইনপুট

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

আপনি ধরে নিতে পারেন ইনপুট নেকলেসটি বৈধ। যেখানে কোনও প্রদত্ত প্রকারের অদ্ভুত অলঙ্কার রয়েছে বা নেকলেস খালি রয়েছে সেই ক্ষেত্রে আপনার কেসটি পরিচালনা করার দরকার নেই।

আউটপুট

আবার, আউটপুট যে কোনও সুবিধাজনক বিন্যাসে হতে পারে; উদাহরণস্বরূপ বিভাগগুলির তালিকা, কাটা পজিশনের একটি তালিকা, দুই চোরের প্রতিনিধিত্বকারী কীগুলির একটি অভিধান এবং বিভাগগুলির তালিকা হিসাবে মূল্যগুলি ইত্যাদি values ​​বিভাগগুলি তাদের সূচক, সমাপ্ত সূচক, ধারাবাহিক সূচকের তালিকা, রত্নগুলির তালিকা, দ্বারা উপস্থাপিত হতে পারে তাদের দৈর্ঘ্য ইত্যাদি আপনি ব্যবহার করতে পারেন 0- বা 1- সূচক use যদি অর্ডারিংটি আপনার ফর্ম্যাটটির পক্ষে তাৎপর্যপূর্ণ না হয়, তবে আপনার আউটপুট কোনও ক্রমে হতে পারে। বেশ কয়েকটি বিভিন্ন ফর্ম্যাটে উপরের আউটপুটটি এখানে:

list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
list of cuts:     [1,2,9,22]
list of lengths:  [1,1,7,13,6]
dictionary:       {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]}

দ্রষ্টব্য যে বিভাগগুলি (চোরদের মধ্যে বিকল্প বিভাগগুলি) এবং দৈর্ঘ্যের তালিকায় (বিভাগগুলি চিহ্নিত করার জন্য) গুরুত্বপূর্ণ, তবে কাট বা অভিধানের তালিকায় নয় order সম্পাদনা করুন: গ্রেগ মার্টিন উল্লেখ করেছেন যে এগুলি বৈধ আউটপুট হবে না যেহেতু দুটি কাটতে ন্যায্য বিভাগ পাওয়া যায়

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

[1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]]
[1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]]
[1,1,1,1,1,1,1,1,1,1,1,1] -> [[1,1,1,1,1,1],[1,1,1,1,1,1]]
[1,1,1,1,2,3,4,2,3,4,2,2] -> [[1,1],[1,1,2,3,4,2],[3,4,2,2]]

মন্তব্য

  1. স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  2. এটি ; সংক্ষিপ্ত উত্তর (বাইটে) জেতা

2
নেকলেস কি বৃত্তাকার?
ডেনিস

1
@ ডেনিস না, নেকলেসটি লিনিয়ার is
ngenisis

1
আমরা কি পূর্ণসংখ্যার পরিবর্তে বিভিন্ন রত্ন প্রকারের নির্দেশ করে চিঠি / টোকেন হিসাবে ইনপুট নিতে পারি?
গ্রেগ মার্টিন

3
যদি বিভাগগুলির ক্রম পরিবর্তন না করা হয় তবে টুকরোগুলি আইফাই এ এবং থাইফ বি এর মধ্যে বিকল্প হিসাবে যেমন আউটপুটে থাকা তথ্যগুলি অনর্থক। উত্তরটি যদি রত্নগুলির ক্রম পরিবর্তন না করে তবে আমরা কী theif সূত্রটি বাদ দিতে পারি? আপনার কিছু পরীক্ষার কেস আছে?
লুক

2
আপনার উদাহরণস্বরূপ [S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E], মনে হচ্ছে আউটপুটটি হওয়া উচিত [[S,S,S,E,S,D,E,R],[S,R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]], যেহেতু এর চেয়ে কম কাট রয়েছে [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]। আমি কি অনুমানটি সঠিকভাবে বুঝতে পারি?
গ্রেগ মার্টিন

উত্তর:


3

ব্র্যাচল্যাগ , 13 বাইট

~c.ġ₂z₁Ċcᵐoᵛ∧

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

দ্রষ্টব্য: রূপকটি এই চ্যালেঞ্জের চেয়ে নতুন।

ব্যাখ্যা

~c.ġ₂z₁Ċcᵐoᵛ∧  Input is a list, say L = [1,2,2,2,1,2,3,3]
~c.            Output is a partition of the input: [[1,2,2],[2,1,2],[3],[3]]
  .ġ₂          Split the output into chunks of length 2: [[[1,2,2],[2,1,2]],[[3],[3]]]
     z₁        Zip (transpose) the chunks: [[[1,2,2],[3]],[[2,1,2],[3]]]
       Ċ       This is a 2-element list (forbid the trivial partition).
        cᵐ     Concatenate both: [[1,2,2,3],[2,1,2,3]]
          oᵛ   If you sort both lists, they are equal.
            ∧  Don't unify with the output.

পার্টিশনগুলি ব্লকের সংখ্যার ক্রম বৃদ্ধির জন্য গণনা করা হয়, সুতরাং ফলাফলটি যতটা সম্ভব ব্লক করে।


3

জেলি , 18 বাইট

s2ZFṢ$€E¬,L
ŒṖṖÇÞḢ

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

দক্ষ না - উদাহরণস্বরূপ হয়েছে 28 রত্ন যা অভ্যস্ত কাজ বিশাল সম্পদ ছাড়া যেহেতু এই বাস্তবায়ন প্রথম পদক্ষেপ একটি তালিকা তৈরী করতে হবে 2 27 সম্ভব পার্টিশন।

তালিকার একটি তালিকা ফেরত দেয় - সেগমেন্টগুলি যাতে তাদের চোরের মধ্যে আলাদা করে দেওয়া যায় dish (টিআইও আউটপুট পুনরায়: যখন তালিকার কেবল একটি আইটেম থাকে তবে অন্তর্ভুক্ত মুদ্রণটি বন্ধনীগুলির সাথে বিরক্ত করে না [])

কিভাবে?

s2ZFṢ$€E¬,L - Link 1, get (isUnfair, Slices): A possible partition
s2          - split into slices of length 2 (any odd one on it's own at the end)
  Z         - transpose (first item is one thief's slices, second is the others)
     $€     - last two links as a monad for €ach
   F        -     flatten
    Ṣ       -     sort
       E    - equal? (theif1's jewels == theif2's jewels)
        ¬   - not
          L - length (number of slices in the partition)
         ,  - pair

ŒṖṖÇÞḢ - Main link: necklace
ŒṖ     - all partitions
  Ṗ    - pop, we must remove the rightmost one...
              because Link 1 will say it is fair, and it will have length 1!
              (a list of one thing has all entries equal)
    Þ  - sort by
   Ç   -     last link (1) as a monad
     Ḣ - head (get the first one, i.e. minimal isUnfair, then minimal length)

3

গণিত, 118 বাইট

প্রায় জেলিকে পরাজিত করলো ... মাত্র 1 টি বন্ধ;)

SelectFirst[l_±c_:=Append[-#±Most@c,#2]&@@l~TakeDrop~Last@c;l_±{}:={l};i=#;(i±#)&/@Range@#2~Subsets~#3,Tr[Tr/@#]==0&]&

খাঁটি ফাংশন তিনটি আর্গুমেন্ট গ্রহণ: নেকলেস যেমন টোকেনের একটি তালিকা হিসাবে {A, A, A, A, B, C, D, B, C, D, B, B}; নেকলেসের দৈর্ঘ্য; এবং স্বতন্ত্র মণি বার সংখ্যা। এটি ফর্মের সাবলিস্টগুলির একটি তালিকা ফেরত দেয় {{A, A}, {-A, -A, -B, -C, -D, -B}, {C, D, B, B}}, যেখানে নেতিবাচক চিহ্ন ছাড়া টোকেনগুলি একটি চোরের কাছে যায় এবং নেতিবাচক চিহ্নগুলির সাথে টোকেনগুলি অন্য চোরের কাছে যায়। (যদিও এটি অপ্রয়োজনীয় তথ্য, তবে অ্যালগোরিদম এই প্রতিনিধিত্বের দিকে পরিচালিত করে এবং নেতিবাচক চিহ্নগুলি অপসারণে বেশ কয়েকটি বাইট খরচ পড়বে))

প্রথমে আমাদের একটি ফাংশন প্রয়োগ করতে হবে যা একটি তালিকা এবং nকাটা জায়গাগুলির একটি সেট n+1গ্রহণ করে এবং সেই nকাট-জায়গাগুলিতে ইনপুট তালিকাটি কেটে প্রাপ্ত সাবলিস্টগুলির তালিকা ফেরত দেয় ; বাইনারি ইনফিক্স অপারেটরটি ±এই উদ্দেশ্যে ব্যবহৃত হয় এবং পুনরাবৃত্তির মাধ্যমে সংজ্ঞায়িত হয় l_±c_:=Append[-#±Most@c,#2]&@@l~TakeDrop~Last@c;l_±{}:={l};। ঠিক পরে নেতিবাচক চিহ্নের কারণে Append, ফলাফলটি হ'ল সাবলিস্টগুলি পর্যায়ক্রমে প্রতিটি টোকেনের সাথে নেতিবাচক চিহ্নগুলি সংযুক্ত করে না এবং থাকে।

তারপরে আমরা সমস্ত সম্ভাব্য কাট-প্লেস সেট তৈরি করি যার দৈর্ঘ্য সর্বাধিক রত্ন প্রকারের সংখ্যা, ব্যবহার Range@#2~Subsets~#3এবং এই পরিবর্তিত প্রতিটি কাট-প্লে সেটগুলিতে অপারেটর (রত্নগুলির ইনপুট তালিকা সহ) i=#;(i±#)&/@প্রয়োগ করতে ব্যবহার ±করুন।

অবশেষে, SelectFirst[...,Tr[Tr/@#]==0&]&ফলস্বরূপ নেকলেস বিভাগগুলির প্রথমটি বেছে নিন যা ন্যায্য। এটি সমস্ত সাবলিস্টগুলিতে সমস্ত উপাদানকে আক্ষরিকভাবে যুক্ত করে তা করে; গাণিতিক প্রতিটি টোকেনের ইতিবাচক এবং নেতিবাচক অনুলিপিগুলি সুস্পষ্ট উপায়ে বাতিল করতে যথেষ্ট বুদ্ধিমান।


3

পাইথ, 16 বাইট

hfqFSMsM.TcT2t./

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

hfqFSMsM.TcT2t./Q   implicit Q (=input) at the end
              ./Q   create all partitions of the input list 
                    (they are already sorted by number of cuts)
             t      remove the partition with zero splits
 f                  filter for partitions T, which satisfy:
          cT2          chop into pieces of length 2
        .T             transpose to get the pieces of each thieve
    SMsM               combine all pieces for each thieve and sort the results
  qF                   check if they got the same jewels
h                   print the first such partition

1

05 এ বি 1 ই , 14 বাইট

.œ¨ʒ2ôζε˜{}Ë}¤

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

                # All partitions of the (implicit) input
                  #  i.e. [2,3,2,1,3,1]
                  #   → [[[2],[3],[2],[1],[3],[1]],[[2],[3],[2],[1],[3,1]],
                  #      ...,[[2,3,2,1,3,1]]]
  ¨               # Remove the last one
   ʒ        }     # Filter this list by:
    2ô            # Split it into parts of 2
                  #  i.e. [[2,3],[2],[1],[3,1]] → [[[2,3],[2]],[[1],[3,1]]]
                  #  i.e. [[2,3,2],[1,3],[1]] → [[[2,3,2],[1,3]],[[1]]]
      ζ           # Swap rows and columns (using space as filler if necessary)
                  #  i.e. [[[2,3],[2]],[[1],[3,1]]] → [[[2,3],[1]],[[2],[3,1]]]
                  #  i.e. [[[2,3,2],[1,3]],[[1]]] → [[[2,3,2],[1]],[[1,3]," "]]
       ε  }       # Map each inner list to:
        ˜         # Flatten the list
                  #  i.e. [[2,3],[1]] → [2,3,1]
                  #  i.e. [[1,3]," "] → [1,3," "]
         {        # Sort the list
                  #  i.e. [2,3,1] → [1,2,3]
                  #  i.e. [1,3," "] → [1,3," "]
           Ë      # Check if both sorted lists are equal
                  # (if not, remove them from the partitions)
             ¤    # After filtering, take the last one as result (and output implicitly)
                  #  i.e. [[[2],[3,2],[1,3],[1]],[[2,3],[2],[1],[3,1]]]
                  #   → [[2,3],[2],[1],[3,1]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.