Two Numbers Swap()

দুটি সংখ্যা সোয়াপ (Swap)

আজ রাফির বিবাহ। ^_^

আদর আপ্যায়নের সাথে তার শ্যালিকাগণ কিঞ্চিত ‘মজাক’ করার চেষ্টা করছে। রাফির সামনে তিনটা একই সাইজের গ্লাস রাখা হল। চিনতে সুবিধা হবে তাই গ্লাসগুলোকে a, bc নাম দিলাম। শ্যালিকাগণ a নামক গ্লাসে রেখেছেন চিরতা ভেজানো পানি, b নামক গ্লাসে রেখেছেন কোকাকোলা। আর c গ্লাসটা খালি।

রাফি অন্দর মহল ( < 3 ) থেকে গোপন সূত্রে জানতে পেরেছে প্রথম দুটি গ্লাসের যে কোন একটা গ্লাসের তরল বস্তু তাকে পান করতে বাধ্য করা হবে। আর কোন্‌ গ্লাসটির তরল তাকে গলদকরণ করানো হবে সেটা নির্বাচন করার জন্য “ওবু দশ কুড়ি নাড়ি-ভূড়ি, চিংড়ি মাছের চচ্চরি…” টাইপের একটি ছড়াও বানানো হয়েছে। তার একজন স্নেহের শ্যালিকা ছড়া আবৃত্তি করে ঠিক ঠিক a নামক গ্লাসে এসেই থামবে। ফলে জামাই বাবাজিকে চিরতার পানিই খেতে হবে। রাফির চিন্তায় অন্দর মহলের সেই রমনী বড়ই পেরেশান! সেই রমনীই এই c নামক খালি গ্লাসের ব্যবস্থা করেছেন। এখন রাফি ঠিক কিভাবে এই আতিথিয়তা থেকে বাঁচতে পারে? ঠিক ধরেছ! কোন ক্রমে যদি a গ্লাসের চিরতার পানিটুকু b গ্লাসে, আর b গ্লাসের কোকাকোলাটুকু a গ্লাসে ঢেলে দেয়া যায় তাহলেই একমাত্র রক্ষা! অর্থাৎ গ্লাসদুটির পানীয়গুলোকে অদল-বদল করতে হবে। ধর কেউ গ্লাস-ট্রের দিকে তাকিয়ে নেই। এখন রাফি কিভাবে গ্লাসের তরলগুলোকে অদল-বদল করতে পারে?

খুব সোজা তাই না? রাফি যা করতে পারে সেগুলোকে নিচে লিখছি-


a গ্লাসের চিরতার পানি c গ্লাসে ঢালো [এখন c গ্লাসে চিরতার পানি আছে]
 
a যেহেতু খালি তাই, b গ্লাসের কোকাকোলা a গ্লাসে ঢালো [এখন a গ্লাসে কোকাকোলা আছে, b গ্লাসটা খালি]
 
c গ্লাসের চিরতার পানি b গ্লাসে ঢালো

খেয়াল করে দেখ, তিনটা কাজ করার ফলে কিন্তু আমরা গ্লাস দুটোর তরলকে অন্য পাত্রে স্থানান্তর করে দিয়েছি। একদম সিম্পল না?

প্রোগ্রামিং করার সময়ও এরকম দুটি variable এর মান পরস্পরের মধ্যে অদল-বদলের দরকার হয়। আর এর একটা গাল ভরা নাম আছে। তা হচ্ছে সোয়াপ (Swap). ধর, ab দুটি ভেরিয়েবলে দুইটি মান আছে। তুমি তাদের মধ্যে সোয়াপ করতে চাও। তাহলে উপরের তিনটা কাজই করতে হবে।


int a = 5, b = 6, c; //c কিন্তু ফাঁকা
 
c = a;
a = b; //a ফাঁকা না, কিন্তু b এর মান a তে assign হচ্ছে, ফলে a এর পূর্বের মান আর সেখানে থাকছে না
b = c; // b এর মান আগের লাইনে a তে রিপ্লেস করে দেয়া হয়েছে। এখন a এর যেই মান c তে ছিল সেই মানটাই b তে assign হচ্ছে

এবার তোমার কাছে প্রশ্নঃ তৃতীয় কোন variable এর সাহায্য ছাড়া কি সোয়াপ করা সম্ভব? একটু চিন্তা কর।

হিন্টস দিচ্ছিঃ দুটি ভেরিয়েবল দিয়েই সোয়াপ করা সম্ভব তাদের মধ্যে যোগ বিয়োগের কিছু হিসাব-নিকাশ করে। গুণ-ভাগ দিয়েও করা যাবে। XOR operation চালিয়েও করা যায়। তোমার কাজ হচ্ছে তৃতীয় ভ্যারিয়েবল ছাড়া যে কোন ভাবে দুটি number swap করা। এটা আরেকটা way

Swap two numbers using XOR

 int a=10, b=5;
 
 a = a ^ b; // x now becomes 15 (1111)
 b = a ^ b; // y becomes 10 (1010)
 a = a ^ b; // x becomes 5 (0101)
 
//উপরের তিন লাইনের কাজ নিচের এক লাইনে করা যায়ঃ
 
a^=b^=a^=b;

এবার আসি swap function এর ব্যাপারে। C++swap() নামের একটা method আছে যেটা ব্যবহার করে দুটি ভেরিয়েবলের মধ্যে সোয়াপ করা যায়। আর সি প্রোগ্রামিং ল্যাঙ্গুয়েজে যেহেতু swap() নাই তাই নিজেরা ফাংশন লিখে ব্যবহার করা যেতে পারে।

Swap two numbers using their reference

void swapFunction(int *a, int *b)
{
        int c = *a;
        *a = *b;
        *b = c;
}
 
 
int main()
{
 int a = 5, b = 6;
 
 swapFunction(&a, &b); // value না পাঠিয়ে তাদের reference পাঠানো হয়েছে
 
 printf("%d %d," a, b); 
 
 return 0;
}

পয়েন্টার ব্যবহার করে হয়ত আরো কোন ভাবে সোয়াপ করা যেতে পারে। ঘাটাঘাটি করে দেখো।