विभाजन एक सूची!


10

इस चुनौती में, आपको एक सूची को विभाजित करने की आवश्यकता है, जहां विभाजन का अधिकतम आकार, न्यूनतम आकार और एक पसंदीदा आकार है। मैं (min,pref,max) इस चुनौती में आकारों को इंगित करने के लिए नोटेशन का उपयोग करूंगा ।

विभाजन से अपरिचित लोगों के लिए, निम्नलिखित सूची को 3 भागों में विभाजित किया गया है:
[0..9] -> [[0,1,2],[3,4,5],[6,7,8]]

जब सूची समान रूप से विभाज्य नहीं होती है, तो आपको विभाजन को यथासंभव पसंदीदा आकार के करीब होना चाहिए [0..10], (2,4,5) -> [[0,1,2,3],[4,5,6],[7,8,9]]:। यह विभाजन बेहतर है [[0,1,2,3],[4,5,6,7],[8,9]], भले ही उत्तरार्द्ध की पसंदीदा लंबाई अधिक हो। औपचारिक रूप से, हमें (partitionLength-preferredSize)^2प्रत्येक विभाजन के योग को कम करने की आवश्यकता है ।

विभाजन की लंबाई का क्रम मायने नहीं रखता है: के लिए [0..5], (2,3,3), या तो [[0,1,2],[3,4]]या [[0,1],[2,3,4]]काम करता है। यदि कोई विभाजन संभव नहीं है, तो खाली सरणी लौटाएँ [0..7], (4,4,5) -> []:।

आप यह मान सकते हैं 1<=min<=pref<=max, और यह कि आपके पास दिया गया सरणी पूर्णांक का एक गैर-रिक्त सरणी है। सरणी हमेशा पहला तर्क होगी। आप किसी भी क्रम में और टपल के रूप में या अलग-अलग तर्कों के रूप में न्यूनतम, अधिकतम और प्रीफ़ स्वीकार कर सकते हैं।

आपका कार्यक्रम कुछ सेकंड के लिए चलना चाहिए। मूल रूप से, सीमा के भीतर हर संभव विभाजन आकार के माध्यम से पुनरावृत्ति की अनुमति नहीं है।

परीक्षण के मामलों:

[1], (1,3,4)         -> [[1]]
[100], (1,2,3)       -> [[100]]
[1,2], (1,1,2)       -> [[1],[2]]
[1,2], (1,2,2)       -> [[1,2]]
[1,2], (1,3,3)       -> [[1,2]]
[1,2,3], (1,2,3)     -> [[1,2],[3]] or [[1,2,3]]
[1,2,3,4], (1,3,4)   -> [[1,2,3,4]]
[1,2,3,4,5], (3,3,4) -> []
[1,2,3,4,5], (2,2,2) -> []
[1,2,3,4,5], (3,3,5) -> [[1,2,3,4,5]]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49], (2,6,6) -> [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29],[30,31,32,33,34],[35,36,37,38,39],[40,41,42,43,44],[45,46,47,48,49]]

यह एक , इसलिए अपनी पसंदीदा भाषा में यथासंभव कम बाइट्स का लक्ष्य रखें!


आपके द्वारा [a..b]शामिल किए जाने aऔर बहिष्कृत करने की सूचना b, सही है?
एलेक्स ए।

एक समावेशी, बी एक्सक्लूसिव।
नाथन मेरिल

ध्यान दें कि आपकी व्याख्या सेट थ्योरी से विभाजन के समान नहीं है ...
20

लेकिन यह है प्रभावी रूप से पूर्णांक विभाजन के बराबर है।
नाथन मेरिल

अगर कोई समाधान नहीं है तो क्या होगा?
फ़ेरसम

जवाबों:


2

हास्केल, 152

_%0=[]
s%k|(a,b)<-splitAt(div(z s)k)s=a:b%(k-1)
z=length
f s n p x=snd$minimum$(z s*p^2,[]):[(sum[(z x-p)^2|x<-s%k],s%k)|k<-[-div(-z s)x..div(z s)n]]

किसी भी विभाजन में, यदि दो सूचियां हैं जिनकी लंबाई दो या दो से अधिक है, तो हमेशा बड़ी सूची को सिकोड़ना और छोटी सूची को बड़ा करना फायदेमंद होगा। इसलिए, हमें केवल दो सूची आकारों के साथ विभाजन पर विचार करने की आवश्यकता है, जो गणना को सरल करता है।

कार्यक्रम तो विभाजन में सूचियों के सभी संभव मात्रा पर चलता है। विभाजन में सूचियों की मात्रा को देखते हुए, स्कोर विशिष्ट रूप से निर्धारित किया जाता है। कार्यक्रम एक फिटिंग विभाजन और उसके स्कोर की गणना करता है।

तब यह समग्र न्यूनतम पाता है, और इसे वापस करता है।

उपयोग: जैसे इनपुट f [1,2,3,4,5] 1 3 4( fचुनौती को हल करने वाला कार्य है)

यद्यपि यह पूरी तरह से संख्यात्मक रूप से सर्वश्रेष्ठ विकल्प की गणना करना संभव है और उसके बाद ही सूची का विभाजन करते हुए, इसने बहुत सारे बाइट्स ले लिए। हालाँकि, इस दृष्टिकोण का मेरा अंतिम संस्करण है:

_%0=[]
s%k|(a,b)<-splitAt(div(length s)k)s=a:b%(k-1)
f s n p x|l<-length s=(s%)$snd$minimum$(l*p^2,0):[(k*j^2+mod l k*(1-2*j),k)|k<-[1..div l n],k*x>=l,j<-[p-div l k]]

1

सीजेम, 70

q~:S;_,[0L]a{_S2=e<),S0=>f{[__S1=-_*\]@@-j.+}[esL]a+:e<}j1={/(\e_}/;]p

इसे ऑनलाइन आज़माएं

कोड डायनामिक प्रोग्रामिंग (मेमोइज्ड रिकर्सन के माध्यम से) का उपयोग करके, सूची आकार के आधार पर विभाजन के आकार का एक इष्टतम अनुक्रम पाता है, फिर सूची को आगे और विभाजन करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.