पृष्ठभूमि
मैं 3Blue1Brown के हाल के वीडियो से हार के बंटवारे की समस्या (या जैसा कि वह इसे, चुरा हुआ हार समस्या कहता है) और बोरसुक-उलम प्रमेय के साथ इसके संबंध से प्रेरित था ।
इस समस्या में, दो चोरों ने एक मूल्यवान हार चुरा लिया है जिसमें कई अलग-अलग प्रकार के गहने हैं। प्रत्येक प्रकार के गहने की एक समान संख्या होती है और चोर प्रत्येक आभूषण के प्रकार को समान रूप से उन दोनों के बीच विभाजित करना चाहते हैं। पकड़ यह है कि उन्हें ऐसा करना चाहिए कि कुछ संख्या में सन्निहित खंडों में हार को विभाजित करके उन दोनों के बीच के खंडों को वितरित करें।
यहाँ चार गहना प्रकार निरूपित किया जाता के साथ एक उदाहरण है 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
-Indexing का उपयोग करते हुए, ये कटौती सूचकांकों में होती हैं [1,2,9,22]
।
लक्ष्य
यह पता चला है कि इस तरह के एक निष्पक्ष विभाजन हमेशा सबसे अधिक n
कटौती का उपयोग करके किया जा सकता है , जहां n
गहने प्रकारों की संख्या है। आपका कार्य एक संपूर्ण कार्यक्रम या फ़ंक्शन लिखना है जो इनपुट के रूप में एक हार लेता है और न्यूनतम ऐसे विभाजन (कट्स की सबसे कम संख्या) को आउटपुट करता है।
इनपुट
इनपुट किसी भी सुविधाजनक प्रारूप में हो सकता है। हार गहने का एक क्रम होना चाहिए और कुछ भी नहीं; पूर्णांक की एक सूची, उदाहरण के लिए, गहने प्रकारों और मूल्यों का प्रतिनिधित्व करने वाली कुंजियों के साथ शब्दकोश। आप वैकल्पिक रूप से हार की लंबाई या अलग-अलग गहना प्रकारों की संख्या शामिल कर सकते हैं, लेकिन आपको कोई अन्य इनपुट नहीं लेना चाहिए।
आप मान सकते हैं कि इनपुट हार वैध है। आपको उस मामले को संभालने की आवश्यकता नहीं है जहां किसी प्रकार के गहने की एक विषम संख्या है या हार खाली है।
उत्पादन
फिर से, उत्पादन किसी भी सुविधाजनक प्रारूप में हो सकता है; जैसे खंडों की एक सूची, कट पदों की एक सूची, दो चोरों का प्रतिनिधित्व करने वाली कुंजियों वाला एक शब्दकोश और खंडों की सूची के मूल्यों का प्रतिनिधित्व करते हैं, आदि खंडों को उनके शुरुआती सूचकांक, अंत सूचकांक, लगातार सूचकांकों की सूची, जवाहरात की सूची, द्वारा दर्शाया जा सकता है, उनकी लंबाई, आदि आप 0
- या 1
- अनुक्रमण कर सकते हैं। यदि ऑर्डरिंग आपके प्रारूप के लिए महत्वपूर्ण नहीं है, तो आपका आउटपुट किसी भी क्रम में हो सकता है। यहाँ कई अलग-अलग स्वरूपों में उपरोक्त आउटपुट है:
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)]}
ध्यान दें कि खंडों की सूची में महत्वपूर्ण है (चोरों के बीच वैकल्पिक खंड) और लंबाई की सूची (खंडों की पहचान करने के लिए), लेकिन कटौती या शब्दकोश की सूची में नहीं। संपादित करें: ग्रेग मार्टिन ने कहा कि ये वैध आउटपुट नहीं होंगे क्योंकि एक निष्पक्ष विभाजन को दो कटौती में प्राप्त किया जा सकता है
परीक्षण के मामलों
[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]]
टिप्पणियाँ
- मानक खामियों को मना किया जाता है।
- यह कोड-गोल्फ है ; सबसे छोटा जवाब (बाइट्स में) जीतता है।
[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]]
। क्या मैं युक्ति को सही ढंग से समझ रहा हूँ?