सरल समाधान के चरित्र से आवृत्ति के लिए मध्यवर्ती मानचित्रण स्टोर करने के लिए एक Data.Map
उपयोग करने के लिए है। फिर आप fromListWith
का उपयोग करके आसानी से गणना कर सकते हैं। चूंकि Data.Map
सॉर्ट किया गया है, इसलिए आप उन्हें ASCII ऑर्डर में मुफ्त में प्राप्त करते हैं।
λ> :m + Data.Map
λ> let input = "happy"
λ> toList $ fromListWith (+) [(c, 1) | c <- input]
[('a',1),('h',1),('p',2),('y',1)]
तो क्या यहाँ हो रहा है?
विचार Data.Map
(एक वृक्ष नक्शा) बनाने के लिए अक्षरों और आवृत्तियों के रूप में अक्षरों के रूप में उपयोग करना है।
सबसे पहले, हम इनपुट स्ट्रिंग लेते हैं और एक घटना को इंगित करने के लिए 1
के साथ प्रत्येक वर्ण के tuples बनाते हैं।
λ> [(c, 1) | c <- input]
[('h',1),('a',1),('p',1),('p',1),('y',1)]
इसके बाद, हम fromListWith
का उपयोग बार-बार किसी नक्शे में प्रत्येक कुंजी-मान पेयर डालकर इन कुंजी-मान जोड़ों से क्रमबद्ध नक्शा बनाने के लिए। हम इसे एक फ़ंक्शन भी देते हैं जिसका उपयोग तब किया जाएगा जब एक कुंजी पहले से ही मानचित्र में थी। हमारे मामले में, हम (+)
का उपयोग करते हैं ताकि जब एक वर्ण कई बार देखा जाता है, तो हम मौजूदा योग में गिनती जोड़ते हैं।
अंत में हम नक्शा को toList
का उपयोग करके कुंजी-मूल्य tuples की सूची में वापस ले जाते हैं।
आप पहली बार इनपुट सॉर्ट करने के लिए की तरह '" अब्बा "' मामलों को कवर करना होगा जहां 'पी' की घटनाएं संगत नहीं हैं। – hammar
धन्यवाद, तय। :-) –
और ध्यान दें कि '(\ x -> (हेड एक्स, लम्बाई x)) == head &&& length', जहां' (&&&) '' Control.Arrow' से है। – Conal