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 में एक बयान है