pएक प्रकार (बहुरूप वर्ग बहुरूपिक) फ़ंक्शन है जो Intएस की एक सूची के रूप में क्रमपरिवर्तन ले रहा है , और एक नेस्टेड सूची Intएस के बहुआयामी सरणी का प्रतिनिधित्व करता है ।
p [2,1] [[10,20,30],[40,50,60]]वैसे भी कॉल करें , यदि टाइप करने में चूक सफल नहीं होती है, तो आपको :: [[Int]]परिणाम का प्रकार देते हुए एक प्रकार का एनोटेशन जोड़ना होगा ( जैसे नेस्टेडली)।
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
इसे ऑनलाइन आज़माएं!
मनमानी गहराई के नेस्टेड सरणियों के साथ गोल्फिंग चुनौतियां हास्केल में थोड़ी अजीब हैं, क्योंकि स्थिर टाइपिंग रास्ते में मिल जाती है। जबकि हास्केल सूचियों (चुनौती विवरण में सटीक सिंटैक्स के साथ) को केवल ठीक से घोंसला बनाया जा सकता है, विभिन्न घोंसले की गहराई की सूची असंगत प्रकार की होती है। इसके अलावा, मानक हास्केल पार्सिंग फ़ंक्शन को उस मूल्य के प्रकार को जानने की आवश्यकता होती है जिसे आप पार्स करने की कोशिश कर रहे हैं।
नतीजतन, यह अपरिहार्य लगता है कि कार्यक्रम में टाइप-संबंधित घोषणाओं को शामिल करने की आवश्यकता है, जो अपेक्षाकृत क्रिया हैं। गोल्फ वाले हिस्से के लिए, मैं एक प्रकार के वर्ग को परिभाषित करने पर बस गया P, जैसे कि pसरणी के प्रकार पर बहुरूपी हो सकता है।
इस बीच, TIO की टेस्टिंग हार्नेस पार्सिंग समस्या के आसपास आने का रास्ता दिखाती है।
यह काम किस प्रकार करता है
इस एल्गोरिथ्म के सार को सारांशित करने के लिए: यह क्रमबद्धता सूचकांकों की अदला-बदली होने पर पड़ोसी आयामों को स्थानांतरित करते हुए, क्रमचय सूची पर एक बुलबुला छाँट देता है।
जैसा कि class P aघोषणा द्वारा दिया गया है , किसी भी उदाहरण में, pदो तर्क, एक क्रमपरिवर्तन (हमेशा प्रकार [Int]) और एक सरणी लेता है ।
- क्रमबद्धता को चुनौती के विवरण के रूप में दिया जा सकता है, हालांकि एल्गोरिथ्म के काम करने का तरीका, सूचकांकों का चुनाव मनमाना है, सिवाय उनके सापेक्ष क्रम के। (तो दोनों 0- और 1- आधारित काम।)
- आधार
instance P Intआयाम 1 के सरणियों को संभालता है, जो pकेवल अपरिवर्तित रिटर्न देता है, क्योंकि एक आयाम केवल खुद को मैप किया जा सकता है।
- दूसरे
instance P a => P [a]को पुनरावर्ती रूप से परिभाषित किया गया है, आयाम n + 1 सरणियों के लिए इसे परिभाषित करने के लिए pआयाम n सबरेज़ के साथ कॉल करना ।
p(x:r)mपहले p rप्रत्येक तत्व पर पुनरावर्ती कॉल करता है m, एक परिणाम सरणी nदेता है जिसमें पहले को छोड़कर सभी आयाम एक दूसरे के लिए अपेक्षाकृत सही ढंग से अनुमत होते हैं।
- शेष क्रमपरिवर्तन जिसे करने की आवश्यकता
nहै, द्वारा दिया जाता है x:y:z = x:sort r।
- यदि
x<yतब पहले आयाम को nसही ढंग से रखा गया है, और nबस वापस आ गया है।
- यदि
x>y, तब पहले और दूसरे आयाम की nआवश्यकता होती है, जिसे स्वैप किया जाता है, जो transposeफ़ंक्शन के साथ किया जाता है । अंत p(x:z)में परिणाम के प्रत्येक तत्व के लिए पुनरावर्ती रूप से लागू किया जाता है, यह सुनिश्चित करते हुए कि मूल पहले आयाम को सही स्थिति में स्थानांतरित किया जाता है।
exec(दो बाइट्स को बचाने के लिए ) , क्योंकि यह पायथन 2 में एक बयान है