ट्रैक
/
Factor
Factor
/
अभ्यास
/
कविता क्लब
कविता क्लब

कविता क्लब

सीखने का अभ्यास

परिचय

एक डिसजॉइंट सेट (यानी यूनियन-फाइंड स्ट्रक्चर) वैल्यू के एक संग्रह को ऐसे समूहों में बाँटे रखता है जो आपस में नहीं मिलते। यह एक सवाल का जवाब जल्दी दे देता है: क्या ये दो वैल्यू एक ही समूह में हैं? यह disjoint-sets वोकैबुलरी में रहता है।

डिसजॉइंट सेट बनाना

<disjoint-set> एक खाली स्ट्रक्चर बनाता है। इसमें वैल्यू, जिन्हें एटम कहते हैं, एक-एक करके add-atom से जोड़ी जाती हैं, या किसी सीक्वेंस से add-atoms की मदद से जोड़ी जाती हैं। हर एटम शुरू में अपने अलग समूह में होता है।

<disjoint-set> ( -- disjoint-set )
add-atom       ( atom disjoint-set -- )
add-atoms      ( seq disjoint-set -- )
USING: disjoint-sets ;

<disjoint-set>
{ 1 2 3 } over add-atoms   ! 1, 2 and 3 each in their own group

डिसजॉइंट सेट म्यूटेबल होता है: add-atom, add-atoms और equate उसे उसी जगह बदल देते हैं, नया सेट लौटाते नहीं। जब इनमें से कोई वर्ड उसे इस्तेमाल कर चुका हो और आपको डिसजॉइंट सेट वापस स्टैक पर चाहिए, तो keep काम आता है।

समूहों को जोड़ना

equate उन दो समूहों को जोड़ देता है जिनमें उसके एटम होते हैं। समूहों को जोड़ना ट्रांज़िटिव होता है: दो एटम को equate कीजिए, फिर उनमें से एक को तीसरे के साथ, और तीनों एक ही समूह में आ जाते हैं।

equate ( atom1 atom2 disjoint-set -- )

प्रतिनिधि

हर समूह का एक तय सदस्य होता है, जिसे उसका प्रतिनिधि कहते हैं। representative उसी को लौटाता है, और दो एटम ठीक तभी एक ही समूह के होते हैं जब उनके प्रतिनिधि बराबर हों।

representative ( atom disjoint-set -- representative )
USING: disjoint-sets ;

<disjoint-set>
{ 1 2 3 } over add-atoms
1 2 pick equate
1 over representative .   ! => 1
2 over representative .   ! => 1   (same representative as 1)
3 over representative .   ! => 3   (still on its own)

किसी समूह का प्रतिनिधि कौन-सा एटम बनेगा, यह अंदरूनी बात है। कभी यह न मानिए कि कोई खास एटम ही चुना जाएगा। आप केवल इतना मानिए कि एक ही समूह के दो एटम का प्रतिनिधि एक ही होगा।

निर्देश

स्थानीय कविता क्लब एक नया सीज़न शुरू कर रहा है। कवि इस क्लब से जुड़ते हैं, और जब भी उनमें से दो मिलकर कोई कविता लिखते हैं, वे एक ही लेखन मंडल का हिस्सा बन जाते हैं। क्लब यह दर्ज रखना चाहता है कि कौन किसके साथ एक मंडल में है, और आपसे यह काम दिया गया है कि आप वे शब्द लिखें जो इसे सँभालें।

एक डिसजॉइंट सेट इसके लिए एकदम सही है: हर कवि एक परमाणु है, और हर लेखन मंडल एक समूह।

1. क्लब खोलिए

new-club बनाइए। यह कवियों का एक सीक्वेंस लेता है और एक नया डिसजॉइंट सेट लौटाता है जिसमें हर कवि पंजीकृत होता है। हर कवि अपने ही लेखन मंडल से शुरुआत करता है।

{ "Keats" "Byron" "Dickinson" } new-club
! => a disjoint set holding the three poets

2. सहयोग दर्ज कीजिए

collaborate बनाइए। यह दो कवियों और एक क्लब को लेता है। यह दोनों कवियों के लेखन मंडलों को जोड़ देता है और क्लब लौटाता है, ताकि सहयोग एक के बाद एक दर्ज किए जा सकें।

{ "Keats" "Byron" "Dickinson" } new-club
"Keats" "Byron" rot collaborate
! => the club, with Keats and Byron now in one circle

3. कवि का लेखन मंडल ढूँढिए

circle-of बनाइए। यह एक कवि और एक क्लब को लेता है और उस कवि के लेखन मंडल का प्रतिनिधि लौटाता है। जो दो कवि एक ही मंडल में रहते हैं, उनके लिए यह हमेशा वही प्रतिनिधि लौटाता है।

{ "Keats" "Byron" "Dickinson" } new-club
"Dickinson" swap circle-of
! => "Dickinson"   (still in a circle of their own)

4. एक ही मंडल?

same-circle? बनाइए। यह दो कवियों और एक क्लब को लेता है और तब t लौटाता है जब दोनों कवि एक ही लेखन मंडल में हों, वरना f लौटाता है। कवियों के प्रतिनिधियों की आपस में तुलना कीजिए, भाषा में पहले से मौजूद किसी समतुल्यता जाँच का उपयोग न कीजिए।

{ "Keats" "Byron" "Dickinson" } new-club
"Keats" "Byron" rot collaborate
dup [ "Keats" "Byron" ] dip same-circle? .      ! => t
    [ "Keats" "Dickinson" ] dip same-circle? .  ! => f
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Factor Exercism

कविता क्लब शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।