একটি ডিসজয়েন্ট সেট (একটি ইউনিয়ন-ফাইন্ড স্ট্রাকচার) একগুচ্ছ মানকে এমন দলে দলে ভাগ করে রাখে যেগুলো একে অপরের সঙ্গে ওভারল্যাপ করে না, এবং দ্রুত একটি প্রশ্নের উত্তর দেয়: এই দুটি মান কি একই দলে আছে? এটি 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 করলে, তিনটিই শেষে একই দলে গিয়ে দাঁড়ায়।
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।