المجموعة المنفصلة (بنية الاتحاد والبحث) تحفظ مجموعة من القيم مقسّمة إلى مجموعات غير متداخلة، وتجيب بسرعة عن سؤال واحد: هل هاتان القيمتان في المجموعة نفسها؟ وهي توجد في مفردات 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 ( 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)
اختيار المجموعة لذرة معينة كممثل لها تفصيل داخلي، فلا تعتمد أبدًا على اختيار ذرة بعينها، بل اعتمد فقط على اتفاق ذرتين في المجموعة نفسها.
يبدأ نادي الشعر المحلي موسمًا جديدًا. ينضم الشعراء إلى النادي، وكلما كتب اثنان منهم قصيدة معًا صارا جزءًا من دائرة كتابة نفسها. يريد النادي تتبّع من يشارك من في أي دائرة، وقد طُلب منك كتابة الكلمات التي تدير ذلك.
تناسب المجموعات المنفصلة هذا الغرض تمامًا: فكل شاعر ذرّة، ودائرة الكتابة جماعة.
عرّف new-club، بحيث يأخذ متتالية من الشعراء ويُرجع مجموعة منفصلة جديدة مسجَّل فيها كل شاعر. يبدأ كل شاعر في دائرة كتابة خاصة به.
{ "Keats" "Byron" "Dickinson" } new-club
! => a disjoint set holding the three poets
عرّف collaborate، بحيث يأخذ شاعرين وناديًا. إنه يدمج دائرتي كتابة الشاعرين ويُرجع النادي، بحيث يمكن تسجيل التعاونات واحدًا بعد الآخر.
{ "Keats" "Byron" "Dickinson" } new-club
"Keats" "Byron" rot collaborate
! => the club, with Keats and Byron now in one circle
عرّف circle-of، بحيث يأخذ شاعرًا وناديًا ويُرجع ممثّل دائرة كتابة ذلك الشاعر. الشاعران اللذان يشتركان في دائرة واحدة يُبلّغان دائمًا بالممثّل نفسه.
{ "Keats" "Byron" "Dickinson" } new-club
"Dickinson" swap circle-of
! => "Dickinson" (still in a circle of their own)
عرّف 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
سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.