نادي الشعر

نادي الشعر

تمرين تعلّمي

مقدمة

المجموعة المنفصلة (بنية الاتحاد والبحث) تحفظ مجموعة من القيم مقسّمة إلى مجموعات غير متداخلة، وتجيب بسرعة عن سؤال واحد: هل هاتان القيمتان في المجموعة نفسها؟ وهي توجد في مفردات 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)

اختيار المجموعة لذرة معينة كممثل لها تفصيل داخلي، فلا تعتمد أبدًا على اختيار ذرة بعينها، بل اعتمد فقط على اتفاق ذرتين في المجموعة نفسها.

التعليمات

يبدأ نادي الشعر المحلي موسمًا جديدًا. ينضم الشعراء إلى النادي، وكلما كتب اثنان منهم قصيدة معًا صارا جزءًا من دائرة كتابة نفسها. يريد النادي تتبّع من يشارك من في أي دائرة، وقد طُلب منك كتابة الكلمات التي تدير ذلك.

تناسب المجموعات المنفصلة هذا الغرض تمامًا: فكل شاعر ذرّة، ودائرة الكتابة جماعة.

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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.