আমরা হইত ক্রিপ্টোগ্রাফি নাম টার সাতে একটু বেশি পরিচিত। এবার আমরা ক্রিপ্টোগ্রাফি এর পাওয়ার নিয়ে বিশ্লেষণ করব। আমরা তো প্রাই সবাই ক্যালকুলেটর ব্যবহার করি, এই ক্যালকুলেটর এর স্কোয়ার, কিউব ইত্যাদি এগুলো সবই পাওয়ার এর প্রোগ্রাম, এবার এসো আমরা ক্যালকুলেটর এর এই প্রোগ্রাম গুলো নিজেরাই করব এবং একটা ক্যালকুলেটর এ ব্যাপ্তি তো মাত্র ১০^৯৯ কিন্তু আমরা যে প্রোগ্রাম করব তাঁর ব্যাপ্তি আমরা ১০^১০১ পর্যন্ত নিব। যাই হোক প্রোগ্রাম টা আগে দেখো। এখানে বলা হইছে তুমি প্রথমে একটা সংখ্যা নিবা (n) যেটার ব্যাপ্তি মাত্র ২০০ পর্যন্ত এবং পরে আর একটা সংখ্যা নিবা (p) যেটার ব্যাপ্তি ১০^১০১ পর্যন্ত। আচ্ছা সংখ্যা তো দুইটা নিলাম কিন্তু এবার কি করব, আগেই বলে ছিলাম পাওয়ার নিয়ে বিশ্লেষণ সুতরাং একটু ভাঙ্গিয়ে বলি আমরা কি জানি , রুট=১/২ এইটুকু জানলেই এই প্রোগ্রাম টা সল্ভ করা যাবে, এখানে ২=n এবং ১৬=p তাহেলে উত্তর কি আসছে নিচ্ছই ৪ এটা তো ক্যালকুলেটর এ করলাম,
এই প্রোগ্রাম টাই এখন আমরা কোডব্লক এ করব প্রথমে বলে রাখি আমরা কোড করার জন্য যে প্লাটফর্ম ব্যবহার করি না কেন তাতে অবশ্যই math.h নামক একটা হেডার ফাইল আছে , এবং এটার কাজ মেথ এর বেশ কিছু যেমন sin,cos,tan,pow ইত্যাদি । এখন আমারা যদি কোন প্রোগ্রামে রুট পেতে চাই তাহেলে অবশ্যই পাওয়ার দিয়ে সম্ভব। কারন পাওয়ার এর কাজ হল পর পর দুইটা সংখ্যা কমা দিয়ে লিখলে দ্বিতীয় টা প্রথম টার পাওয়ার হবে। এখানে মুলত k = ১৬^(১/n) বোঝাচ্ছে তার মানে উত্তর টা ৪ পাচ্চি , আমাদের প্রোগ্রাম কিন্তু শেষ কিন্তু একটু ভাবতে হবে এখানে কিন্তু অনেক বড় সংখ্যা দিছে সুতরাং ব্যাপ্তি বড় এমন ডাটা টাইপ ব্যবহার করতে হবে। আমি একটু ধরনা দিতে পারি যেটার ব্যাপ্তি (১.৭E-৩০৮ থেকে ১.৭ E+৩০৮ ) এটা তোমরা ব্যবহার করতে পারো কারন তোমার দরকার ১০^১০১ , ব্যাপ্তি টা অবশ্যই এর মধ্যেই আছে।
“নিজে চেষ্টা কর না পারলে প্রোগ্রাম দেখে বোঝো কিন্তু কপি কর না , নিজের মেধা টা কে নষ্ট কর না”
৬+ ৯ = ১৫ ঠিক বলে মনে হয় । কিন্তু কিভাবে ৪ + ৬ = ২ ???? আসলে আমরা যখন প্রথম বিচ্ছন্ন গণিতে যোগ, বিয়োগ , গুণ , ভাগ করি প্রায় সবারি স্যার কে পাগল বলে মনে হয়, আমি তো মনে করছিলাম স্যার কি পাবনা থেকে মাত্র মুক্তি পাইল নাকি ? কিন্তু না স্যার সেদিন ঠিক ছিল হইত আমাদের বুঝতে কিছুটা সময় লেগেছিল নামটা বিচ্ছন্ন গণিত ছিল বলে। যাইহোক এবার আমাদের প্রোগ্রাম টা বিচ্ছন্ন গণিতে এর উপর। প্রোগ্রাম টা প্রথমে দেখো। আমার মনে হয় তোমরা কিছুটা হলেও বুঝোছো , এর মধ্যে ডেছিমাল ও তার বাইনারি দেওয়া আছে যেমন ৬ এর বাইনারি ১১০ আবার ৯ এর বাইনারি ১০০১ এই বাইনারি সংখ্যা দুইটা যোগ করলে ১১১১ হয় যেটার ডেছিমাল হল ১৫ তাহেলে তো যে কোন সংখ্যা কে বাইনারি তে রুপান্তর করে যোগ করলেই হবে , সত্যি কি হবে ? এবার ৪ এর বাইনারি ১০০ এবং ৬ এর বাইনারি ১১০ , এই বাইনারি সংখ্যা দুইটা যোগ করলে ১০১০ হয় যেটার ডেছিমাল হল ১০ কিন্তু উত্তর তো ২ যেটার বাইনারি ১০। তাহেলে আমাদের আর একটু বেশি ভাবতে হবে যেহেতু এখানে OR gate এবং AND gate দেওয়া আছে আমার মনে হয় এইগুলো দিয়ে হবে । আমরা এখন Bitwise AND , Bitwise OR, Bitwise XOR এর ট্রুথ টেবিল গুলো দেখি এখন লক্ষ্য কর আমাদের কাঙ্কিত উত্তর এর সাথে…
এবং উত্তর টা …উত্তর টা নিচ্ছই XOR এর সাথেই মিলে গেছে । এখন আমদের প্রোগ্রাম তো তেহেলে শেষ। XOR by default আমাদের কম্পাইলারে দেওয়া আছে আর XOR প্রতীক না পারলে ।
আগে গল্প , মনোযোগ দিয়ে শোন -তোমাকে বলা হল ২ জন ছাত্রের ল্যাপটপ এর ব্যাটারি এর ক্ষমতার গড় বের করতে ইনপুট নিয়ে তাদের গড় বের করতে। তুমি a, b নামের দুইটা int type এর ভ্যারিয়েবল ডিক্লেয়ার করলে। এরপর তাতে ইনপুট নিলে নিচের মত করেঃ
scanf(“%d”,&a);
scanf(“%d”,&b);
এরপর এদেরকে যোগ করে ২ দিয়ে ভাগ করে গড় বের করলে। এ পর্যন্ত করাতে কোন সমস্যা নাই।
সমস্যা শুরু হবে যদি বলি কোন ক্লাসের সবার ল্যাপটপ এর ব্যাটারি এর ক্ষমতা ইনপুট নিয়ে স্টোর কর। তাদের ল্যাপটপ এর ব্যাটারি এর ক্ষমতার গড় বের করে প্রিন্ট কর। তখন ১০০ জন ছাত্রের জন্য a,b,c,d,……….পর্যন্ত এত্তগুলা variable declare করে এরপর তাতে ইনপুট নিয়ে যোগ করে গড় বের করা কিন্তু কোন সহজ কাজ নয়।
চিন্তা করো, যদি এমন একটা সিসটেম করা যেত যে একটা ভ্যারিয়েবলের নাম রাখব ধরো Laptop_ battery. এই Laptop_ battery এর সাথে ছাত্রদের রোল নম্বর দিয়ে যার যার ল্যাপটপ এর ব্যাটারি এর ক্ষমতার ইনপুট দিয়ে রাখ। অর্থাৎ প্রথমে যেই কাজটা করতে চাচ্ছিলাম সেটাই করব তবে অটোমেটিক ভাবে। a,b,c,……. আলাদা আলাদা ভাবে ডিক্লেয়ার করে আলাদা আলাদা লাইনে ইনপুট নিতে হবে না। এই সিসটেমটার নামই হচ্ছে অ্যারে (Array).
Array: A Linear Data Structure (অ্যারে: একটি রৈখিক ডাটা স্ট্রাকচার)
দুই ধরণের ডেটা স্ট্রাকচার রয়েছে। একটা হচ্ছে Linear Data Structure, আরেকটি হচ্ছে Nonlinear Data Structure.
লিনিয়ার ডেটা স্ট্রাকচার হচ্ছে এমন এক ধরণের স্ট্রাকচার যা মেমরিতে sequence অনুযায়ী স্টোর হয়। এই স্ট্রাকচারের ডেটাগুলো একটার পর একটা সিরিয়াল্যি সাজানো থাকে। এই লিনিয়ার ডেটা স্ট্রাকচারের দুই ধরনের representation রয়েছে। একটা হচ্ছে Array. সোজা সাপটা ভাবে একই ডেটা টাইপের (int, float, double, char) ডেটাগুলো লাইন ধরে সাজানো থাকে অ্যারের মধ্যে। আরেকটা রিপ্রেজেন্টেশন হচ্ছে, লিস্টের element-গুলোর মধ্যকার সম্পর্ক। এর উদাহরন হচ্ছে Linked List.
নন লিনিয়ার ডেটা স্ট্রাকচারের উদাহরণ হিসেবে উল্লেখ করা যায় Tree স্ট্রাকচারের কথা। Tree-তে অ্যারের মত সিরিয়াল্যি ডেটা সাজানো থাকে না বা সম্ভবও না। কারণ এখানে root, শাখা-প্রশাখা ইত্যাদির হিসাব-নিকাশ রয়েছে।
অ্যারেকে এক কথায় সংজ্ঞায়িত করতে চাইলে এভাবে বলা যায়, নির্দিষ্ট সংখ্যক ডেটা স্টোর করার জন্য একটা স্ট্রাকচার যেখানে শুধুমাত্র এক ধরণের ডেটাই সংরক্ষণ করা যায়। অর্থাৎ অ্যারের একটা নির্দিষ্ট সাইজ থাকবে। এই সাইজের চেয়ে বেশি ডেটা কোন অ্যারে স্টোর করতে পারবে না। আর একই ধরণের ডেটাই স্টোর করতে হবে। int type ডেটা স্টোর করতে চাইলে সেই অ্যারেতে শুধুমাত্র int type এর ডেটাই স্টোর করা যাবে। সেখানে int, float, double, char ইত্যাদি মিক্স করে স্টোর করা যাবে না। যদি int type একটা ১০০ সাইজের অ্যারে ডিক্লেয়ার করি তাহলে এই অ্যারেতে সর্বোচ্চ ১০০ টা int-ই স্টোর করা যাবে।
যে কোন ডেটা স্ট্রাকচারেই data insert, traverse, update, delete, searching, sorting এর মত ব্যাসিক কিছু কাজ থাকে। এই পোস্টে অ্যারের Declaration, Insertion, Traverse এই অপারেশনগুলো দেখানোর চেষ্টা করা হবে।
Array Declaration:
প্রোগ্রামিং ল্যাঙ্গুয়েজ ভেদে অ্যারের ডিক্লেয়ারেশন একটু এদিক সেদিক হয়ে থাকে। এক্ষেত্রে সি প্রোগ্রামিং ল্যাঙ্গুয়েজে অ্যারের সকল অপারেশনগুলো দেখাবো। সি এর কোড বুঝলে যে কোন ল্যাঙ্গুয়েজেই অ্যারে ইমপ্লিমেন্ট করা যাবে।
সর্বোচ্চ ১০০ জন ছাত্রের বয়স যদি আমাদের স্টোর করে প্রসেস করার দরকার হয় সেক্ষেত্রে আমরা অ্যারেটা ডিক্লেয়ার করতে পারি নিচের মত করেঃ
int হচ্ছে ডেটা টাইপ। ধরে নিলাম বয়স হিসেবে শুধু পূর্ণ সংখ্যাই ইনপুট দেয়া হবে। তাই এখানে int টাইপের অ্যারে নিয়েছি। যদি ভগ্নাংশ নিয়ে কাজ করার দরকার হয় সেক্ষেত্রে float বা double ডেটা টাইপের অ্যারে ডিক্লেয়ার করতে হবে। এই অ্যারেতে সর্বোচ্চ ১০০ টি পূর্ণ সংখ্যা স্টোর করা যাবে।
Array Initialization (insert)
প্রথমত দেখি যদি কিছু ফিক্সড ভ্যালু অ্যারেতে স্টোর করতে চাই তাহলে কিভাবে করা যায়।
উপরে দেখা যাচ্ছে age নামক অ্যারের প্রথম ইন্ডেক্সে একটা ভ্যালু (45) assign করা হয়েছে। age[0] অ্যারেটির প্রথম ইন্ডেক্স। সব ল্যাঙ্গুয়েজেই অ্যারের ইন্ডেক্সিং শুরু হয় শূণ্য থেকে। সি ল্যাঙ্গুয়েজে অ্যারের প্রতিটা ইন্ডেক্স অ্যাক্সেস করতে হয় অ্যারের নাম দিয়ে এরপর 3rd bracket এর ভিতরে ইন্ডেক্সের নাম্বার লিখে। age অ্যারের সর্বশেষ ইন্ডেক্স হচ্ছে ৯৯। সর্বশেষ ইন্ডেক্স বা অ্যারের সর্বশেষ খোপে যদি কোন মান অ্যাসাইন করতে চাই তাহলে লিখতে হবে এভাবেঃ age[99] = 65;
একটা বিষয় লক্ষ্যনীয়, অ্যারের ইন্ডেক্স নাম্বার আর অ্যারের ইন্ডেক্সের ভ্যালু কিন্তু ভিন্ন জিনিস। age[1] = 17; বলতে বুঝায় age নামক অ্যারেতে যতগুলো ইন্ডেক্স বা খোপ আছে তাদের মধ্য থেকে ১ নাম্বার খোপে ১৭ মানটা বসিয়ে দাও। ১ হচ্ছে খোপের নাম্বার। এই নাম্বারিং এর মাধ্যমেই কিন্তু আমরা লিনিয়ার অ্যারে ইমপ্লিমেন্ট করতে পারছি। ০, ১, ২, ৩, … এভাবে এই খোপের সংখ্যাগুলো বাড়ছে। আর ১৭ হচ্ছে ছাত্রের বয়স। যেটা অরিজিনাল ডেটা বা ভ্যালু। এক কথায় বললে ১৭ ভ্যালুটাকে age অ্যারের 1 নাম্বার ইন্ডেক্সে বসানোর জন্য age[1] = 17; লিখতে হবে। আশা করি ইন্ডেক্স নাম্বার আর ইন্ডেক্স ভ্যালু গুলিয়ে ফেলবে না আর।
এখন দেখব সি ল্যাঙ্গুয়েজ দিয়ে একটা অ্যারেতে কিভাবে ইনপুট নিতে হয়। অ্যারে নিয়ে কাজ করতে গেলে Loop এর পরিষ্কার ধারণা থাকতে হবে। যদি লুপের মধ্যে ঝামেলা থাকে তাহলে উচিত হবে লুপটা একটু রিভাইস দিয়ে এসে বাকি লেখাটা পড়া।
তোমরা চাইলে ম্যারাথন স্টাইলে ইনপুট নিতে পারো কোন রকমের লুপের ইউজ ছাড়াই।
কিন্তু উপরের সিসটেমে কেউ অ্যারেতে ইনপুট করে না। লুপের মাধ্যমেই ইনপুট করতে হয়। আমরা নিচে নির্দিষ্ট সংখ্যক ছাত্রের বয়স ইনপুট দেয়ার জন্য কোড লিখব। number_of_student একটি int type variable. এতে ইনপুট নেয়া হচ্ছে কতজন ছাত্রের বয়স ইনপুট নেয়া হবে।
উপরের কোডে লুপের ভিতর ইনপুট নেয়ার কাজ চলতে থাকবে। একদম শুরুতে অ্যারের প্রথম ইন্ডেক্স 0-তে ইনপুট হবে। এরপর 1, 2, … (number_of_student-1) পর্যন্ত সবগুলো ইন্ডেক্সে ইনপুট হবে।
সব সময় যে সিরিয়াল্যি সবগুলো ইন্ডেক্সেই মান ইনপুট নিতে হবে এমন না। তুমি চাইলে এক ঘর বাদ দিয়ে দিয়েও ইনপুট নিতে পারো। যেমনঃ age[0], age[2], age[4]… এগুলোতে ইনপুট নিবে, কিন্তু বাকিগুলোতে নিবে না। এখানে তোমাকে ইনপুট নেয়া শেখানো হল। পরবর্তীতে কখন কিভাবে কী কাজে লাগাতে হবে সেটা তুমি সিদ্ধান্ত নিবা।
Array Traversing:
তুমি ১০০ সাইজের একটা অ্যারে ডিক্লেয়ার করলা। এরপর তাতে কিছু ডেটা রাখলা এরপর কাজ কী? এরপর হয় তোমাকে সেই ডেটাগুলো প্রিন্ট করতে হবে, বা নির্দিষ্ট কোন ডেটার উপর নির্দিষ্ট কোন কাজ করা লাগতে পারে। কোন একটা ডেটা সার্চ করার দরকার হতে পারে অথবা কোন একটা শর্ত অনুযায়ী ডেটাগুলোকে সাজানো লাগতে পারে। এর মানে হচ্ছে তোমার মেমরি সংরক্ষিত ডেটাগুলোতে তুমি অ্যাক্সেস করবে বা ডেটাগুলোর উপর তুমি ভ্রমণ (traverse) করবে।
যেভাবে লুপ চালিয়ে প্রতিটা ইন্ডেক্সে ইনপুট নিয়েছিলাম, একই ভাবে লুপ চালিয়ে প্রতিটা ইন্ডেক্সে ট্রাভার্স করতে পারি। এই ট্রাভার্সের মাধ্যমে চাইলে কোন ডেটা প্রিন্ট করতে পারি, কোন ডেটার সাথে অ্যারিথমেটিক কোন অপারেশন ঘটাতে পারি। কোন ডেটা মুছে দিতে পারি ইত্যাদি।
এখন সবগুলো ইন্ডেক্সের ভ্যালুগুলো একেকটা লাইনে প্রিন্ট করতে চাইলে নিচের কোডটা লিখা যায়ঃ
তাহলে age অ্যারের 0-তম ইন্ডেক্স থেকে (number_of_student – 1)-তম ইন্ডেক্স পর্যন্ত সবগুলো ইন্ডেক্সের ভ্যালু পরপর লাইনে প্রিন্ট করে দিবে। যদি শেষ থেকে শুরুর element-গুলো প্রিন্ট করতে চাও তাহলে লুপটাকে একটু মডিফাই করলেই কাজ করবে। যথাঃ for(i = number_of_student – 1; i>=0; i–){}. অর্থাৎ অ্যারের শেষ ইন্ডেক্স থেকে প্রথম ইন্ডেক্সের সবগুলো মান প্রিন্ট হবে।
তুমি ইচ্ছা করলে নির্দিষ্ট একটা ইন্ডেক্সের ভ্যালুও ইন্ডেক্স নাম্বারের সাহায্যে প্রিন্ট করতে পারোঃ
উপরের কোডে age array এর 3 নাম্বার ইন্ডেক্সের মানটা প্রিন্ট হবে।
কখনো যদি এমন হয় যে ইউজার লুপ ঘুরিয়ে ১০ টি ইন্ডেক্সের নাম্বার ইনপুট দিবে। যেই ইন্ডেক্সের নাম্বার ইনপুট দিবে সেই ইন্ডেক্সের ভ্যালু প্রিন্ট করতে হবে। তাহলে কী করবা?
উপরের কোডে প্রতিবার একটা ইন্ডেক্সের মান ইনপুট নেয়া হচ্ছে। পরের লাইনে সেই ইন্ডেক্স এর ভ্যালু প্রিন্ট করা হচ্ছে।
সব ছাত্রের বয়সের গড় বের করতে চাইলে কী করতে হবে? ধরো প্রথমে অ্যারেতে ইনপুট নেয়া হল। এরপর অ্যারেতে লুপ চালিয়ে ট্রাভার্স করব। প্রতিটা ইন্ডেক্সের ভ্যালু যোগ করব এরপর number_of_student দিয়ে ভাগ করব।
দীর্ঘ এই পোস্টের মাধ্যমে অ্যারে ডিক্লেয়ার করা, তাতে ভ্যালু অ্যাসাইন বা ইনপুট করা ও ভ্যালুগুলোতে ট্রাভার্স করার ব্যাপারে বিস্তারিত আলোচনা করার চেষ্টা করেছি। পরের পর্বে আলোচনা করব অ্যারের ভ্যালু আপডেট, ডিলেট, সার্চ, সর্ট ইত্যাদি নিয়ে।
কোথাও কোন ভুল পরীলক্ষিত হলে বা কোন পরামর্শ থাকলে কমেন্ট করার অনুরোধ রইলো। ধন্যবাদ।
গ্রেডি মেথড ?? কি এই গ্রেডি মেথড , চল আগে গ্রেডি মেথড সম্পর্কে জেনে নেই । গ্রেডি মেথড অ্যালগোরিদম এমন একটি অ্যালগরিদম যে একটি গ্লোবাল অপটিমাম খুঁজে বের করার আশায় প্রতিটি পর্যায়ে সমস্যা সমাধানের অনুসন্ধানমূলক কাজ । একটা উদাহরণ দিয়ে দেখি তাহলে স্পষ্ট হয়ে যাবে …এখানে আমরা ম্যাক্সিমাম যোগফল বের করব । এখন খেয়াল কর ঃ
এখানে অনেক গুলা উত্তর আছে কিন্তু আমরা কি সবগুলা উত্তর নিতে পারব ? না পারব না কারন আমাদের দরকার ম্যাক্সিমাম যোগফল, সুতরাং ম্যাক্সিমাম যোগফল বের করার অনেক গুলো প্রসেস থেকে সবচেয়ে ভাল প্রসেস টাই হল গ্রেডি মেথড। এখানে ২৬ হবে গ্রেডি মেথড ব্যবহার করে ম্যাক্সিমাম যোগফল।
এখন আমি মুল অ্যালগোরিদম নিয়ে কথা বলব। কি কি থাকবে এই অ্যালগোরিদমে ঃ
কাজের একটি নির্দিষ্ট সময়সীমা থাকবে।
কজের একটি মুনাফা থাকবে।
মুনাফা তখনি দেব কেবল যদি কাজ নির্ধারিত সময়সীমার মধ্যে সম্পন্ন করে দেওয়া হয়।
আমরা একটি কাজ শুধুমাত্র একবার করতে পারব ।
এখন প্রথমে আমাদের কাজ হল যে প্রফিট গুলো থাকবে সে গুলো সব সর্ট করে নেওয়া ।
উদাহরণ টা খেয়াল কর ঃ আমরা এখন প্রফিট আনুসেরে সর্ট করব ঃ সর্ট করা তো হলো এখন কি করব ?
আমাদের ডেডলাইন এর মান ম্যাক্সিমাম পর্যন্ত অ্যারে তে ডাটা রাখতে হবে , কারন আমাদের উক্ত ডেডলাইন এর মধ্যেই কাজ কমপ্লিট করতে হবে।
ডেডলাইন সমান হলে বা এমন ডাটা পরে পাওয়া গেল যার ইনডেক্স আগে ফিল হয়ে আছে তাহেলে এমন ভাবে ডাটা ফিল হবে যেন আগের ইনডেক্স এর অ্যারে তে সবচেয়ে ছোট ইনডেক্স টা আগে ফিল হয়। কথা টা একটু জটিল আর একটু ঠাণ্ডা মাথাই চিন্তা কর আর নিচে উদাহরণ টা খেয়াল কর ঃ
আমাদের এই উদাহরণ টা তে ডেডলাইন ম্যাক্সিমাম ৭ আছে , সুতরাং অ্যারে তে আমরা ৭ টা ইনডেক্স নিয়ে নিলামঃ
এখন আমার কাজ হল অ্যারে টা ফিল করা , উপরের শর্ত আনুসারে চল শুরু করিঃ
এখন খেয়াল কর ডেডলাইন কিন্তু আবার ২ আসছে কি করব এখন ? এখন দেখব ২ কি ফিল হয়ে গেছে ? হ্যাঁ ২ ইনডেক্স ফিল হয়ে গেছে তাহেলে আমরা এই ডাটা কি বাদ দিব ? না কারন আমি আগেই বলছি যদি ” … … ডাটা ফিল হবে যেন আগের ইনডেক্স এর অ্যারে তে সবচেয়ে ছোট ইনডেক্স টা আগে ফিল হয়” । এখন ২ আর চেয়ে ছোট কোন ইনডেক্স আছে অবশ্যই ১ ফাকা আছে । তাহেলে নিয়ম আনুসেরে ডাটা ১ ইনডেক্স এ যাবে ।
এভাবে ফিল কর সব ডাটা গুলোঃ
এখানে ডেড লাইন ৩ কেন কোন ইনডেক্স এ জাইগা পেল না ? কারন ৩ তো আগেই ফিল হয়ে ছিল আর তাঁর চেয়ে ছোট কোন ইনডেক্স ও ফাঁকা ছিল না।
নিচের ডেড লাইন ডাটা গুলা এই নিয়ম আনুসারে ফিল করঃ
এখন দেখো সব ইনডেক্স কিন্তু ফিল হয়ে গেছে । এখন আমার কাজ হোল যে ইনডেক্স গুলো কাজে লাগছে সেই ইনডেক্স এর প্রফিট গুলো যোগ করে টোটাল প্রফিট বের করা ।
হয়ে গেল সবচেয়ে বেশি প্রফিট নিয়ে ম্যাক্সিমাম জব এর কাজ করা।
অ্যালগোরিদম সহ কোড ঃ
কোড না বুঝলে নিজে করার চেষ্টা কর সেটা তোমার জন্য বেস্ট ।
টাওয়ার অফ হ্যানয় , প্রোগ্রামারদের কাছে খুবই পরিচিত একটি সমস্যার নাম। রিকার্শন দিয়ে সাধারণত আমরা এই সমস্যার সমাধান করে থাকি। এটি মূলত একটি গাণিতিক খেলা বা পাজল, যেখানে তিনটি খুঁটি এবং ছোটবড় বিভিন্ন আকারের অনেকগুলো চাকতি বা ডিস্ক দেয়া থাকে। খেলাটি হলো প্রথম খুঁটি থেকে তিন নাম্বার খুঁটিতে সবগুলো চাকতি নিয়ে যাওয়া।
মনে হতে পারে চাকতি সরানো আর এমন কী ব্যাপার! কিন্তু সহজ হলে তো আর খেলার মজা থাকে না। চাকতি গুলো সরানোর জন্য রয়েছে তিনটি শর্ত। শর্তগুলো হলোঃ
১. চাকতিগুলো থেকে একবারে একটি করে চাকতি অন্য খুঁটিতে স্থানান্তর করতে হবে। একের অধিক চাকতি একবারে নেয়া যাবে না।
২. সবসময় সবার উপরে যে চাকতিটি থাকবে সেই চাকতিটিই সরিয়ে নিতে হবে, এবং যে খুঁটিতে স্থানান্তর করা হবে সেখানেও সবার উপরের স্থানেই তার জায়গা হবে।
৩. কখনোই ছোট চাকতির উপর বড় চাকতি রাখা যাবে না।
নিচে টাওয়ার অফ হ্যানয় কিভাবে সাজাতে হয়..
১৮৮৩ সালে ফরাসি গণিতবিদ, এ্যাডুইয়ার্ড লুকাস , টাউয়ার অফ হ্যানয় পাজল্টি আবিষ্কার করেন। টাওয়ার অফ হ্যানয়ের রয়েছে মজার একটি গল্প। জনশ্রুতি যে ভারতের কাশি বিশ্বনাথে একটি মন্দিরের একটি বিশাল কক্ষে ৬৪টি স্বর্ণের চাকতিসহ তিনটি স্তম্ভ আছে। একজন ব্রাহ্মণ পুরোহিত ব্রহ্মার নির্দেশ অনুসারে সেই চাকতিগুলোকে ক্রমাগত নিয়ম মেনে আদিকাল থেকে স্থানান্তর করে যাচ্ছে। কিংবদন্তীদের মতে যখন পাজলের ৬৪টি চাকতির শেষ চাকতিটি সফলভাবে স্থানান্তর করা যাবে, তখন পৃথিবী ধ্বংস হয়ে যাবে!
এডুইয়ার্ড লুকাস
মজার ব্যাপার হচ্ছে যদি কিংবদন্তীদের কথা সত্যি হয়, এক সেকেন্ডে নিয়ম মেনে একটি চাকতি সঠিকভাবে সরানো গেলেও পুরোহিতের সময় লেগে যাবে ২৬৪-১ সেকেন্ড মানে ২৪৫ বিলিয়ন বছর!
গল্পটি বিভিন্নভাবে প্রচলিত আছে। কোথাও বলা আছে, একটি বৌদ্ধদের আশ্রম এবং ভিক্ষুদের কথা। মন্দির বা আশ্রমের অবস্থান নিয়েও রয়েছে মতভেদ। কারো মতে মন্দিরটি ভারতে আবার কারো মতে আশ্রমটি ভিয়েতনামের রাজধানী হ্যানয়ে। আবার অনেকের ধারণা টাওয়ারটি পৃথিবীর শুরু থেকেই আছে এবং পুরোহিতেরা রোজ একটি করে চাকতি সরিয়েই যাচ্ছেন।
কম্পিউটার বিজ্ঞানে রিকার্শন ধারণাটি ব্যবহার করে সাধারণত আমরা টাওয়ার অফ হ্যানয় সমস্যার সমাধান করে থাকি। সহজ বাংলায় রিকার্শন মানে হচ্ছে পুনরাবৃত্তি। রিকার্শন হচ্ছে এমন একটি পদ্ধতি যেখানে একটি ফাংশনকে এমনভাবে ব্যবহার করা হয় যেন ফাংশনটি নিজেই নিজের কাজে ব্যবহৃত হয় বা নিজের নাম ধরে নিজেই নিজেকে ডাকে। রিকার্শনের সাহায্যে বারবার একই কাজ করে একটা সমস্যার সমাধানে পৌঁছানো যায়।
টাওয়ার অফ হ্যানয়ের ক্ষেত্রে n সংখ্যক চাকতির জন্য 2n -1 সংখ্যক স্থানান্তরc(Move) হয়ে থাকে। সবচেয়ে সহজ টাওয়ার অফ হ্যানয় সমস্যায় তিনটি চাকতি থাকে।
N সংখ্যক চাকতির জন্য টাওয়ার অফ হ্যানয়ের এ্যালগোরিদমটি নিম্নরূপঃ
TOWER (N, BEG, AUX, END)
If N=1, then:
Write: BEG—>END
Return
Call TOWER (N-1, BEG, END, AUX)
Write: BEG—>END
Call TOWER(N-1, AUX,BEG,END)
Return
ধরা যাক, খুটি তিনটি যথাক্রমে A, B, C এবং N=3 ( যেহেতু আমরা তিনটি চাকতির জন্য সমাধান করবো।) সেক্ষেত্রে আমাদের স্থানান্তর সংখ্যা হবে 23 -1 = 7 . একদম শুরুতে আমাদের চিত্রটি হবে এমনঃ
N=3 এর জন্য টাওয়ার অফ হ্যানয়।
এখানে A , B এবং C যথাক্রমে BEG, AUX এবং END. এ্যালগোরিদম এর ফাংশন মতে আমরা লিখতে পারি, TOWER (3, A, B, C) . যেহেতু আমাদের N এর মান 1 এর থেকে বেশি তাই এ্যালগোরিদমের 1 নাম্বার পয়েন্ট আপাতত আমাদের কাজে লাগবে না। আমরা চলে যাই এ্যালগরিদমের 2,3 এবং 4 নাম্বার পয়েন্টের কাছে। সহজ এবং নির্ভুলভাবে টাওয়ার অফ হ্যানয় সমস্যাটি সমাধান করা জন্য আমরা নিচের তিনটি জিনিস মাথায় রাখবো।
Call Tower (N-1, BEG, END, AUX)
Write: BEG—>END
Call Tower (N-1, AUX, BEG, END)
যেকোন সংখ্যক চাকতির জন্য কতগুলো স্থানান্তর(movement) এবং স্থানান্তরের ক্রম বের করার জন্য TOWER (N, BEG, AUX, END) এর ডানদিকে আমরা রাখবো TOWER (N-1, BEG, END, AUX ) স্টেটমেন্টটিকে এবং বামদিক রাখবো TOWER (N-1, AUX, BEG, END) . এটার বেসিক স্ট্রাকচারটি হবে নিম্নরূপঃ
প্রতিবারেই আমাদের আউটপুট হবে BEG —> END . এক্ষেত্রে লক্ষণীয় ব্যাপার হচ্ছে এখানে BEG, AUX, END এগুলো জায়গা বদলালে এদের নাম বদলাবে। যেমনঃ বামদিকে TOWER (N-1, AUX, BEG, END) এ AUX কিন্তু আসলে BEG হয়ে গেছে কারণ সে প্রথমে।
এখন N=3 এর জন্য আমরা পাইঃ
উপরের চিত্রের প্রতিবার TOWER ফাংশন থেকে আমরা BEG—->END হিসেবে আউটপুট পাবো, যেটা হবে আমাদের টাওয়ার অফ হ্যানয় সমস্যার এক একটি স্থানান্তর। যেমনঃ
TOWER (3, A, B, C) ————————————— BEG —-> END —– A—>C
TOWER (3-1, B, A, C) = TOWER (2, B, A, C) ———- BEG—->END —– B—>C
ঠিক এভাবে N = 1 না হওয়া পর্যন্ত TOWER ফাংশনটি কাজ করেই যাবে। শেষ পর্যন্ত আমরা নিম্নরূপ আউটপুট পাবো যেগুলো প্রত্যেকটি টাওয়ার অফ হ্যানয়ের এক একটি স্থানান্তর। এভাবে প্রতিবার টাওয়ার অফ হ্যানয়ের এ্যালগরিদম ব্যবহার করে আমরা নিম্নোক্ত সমাধান পাইঃ
এই ছবিটিতে যে “MOVE” গুলো দেখা যাচ্ছে সেগুলো উপর থেকে নিচ পর্যন্ত পরপর সাজালেই আমরা তিনটি চাকতির জন্য টাওয়ার অফ হ্যানয়ের স্থানান্তরগুলো পেয়ে যাবো
টাওয়ার অফ হ্যানয় সমস্যার সমাধানের ক্ষেত্রে এই নিয়মটি দ্বারা N এর যেকোন মানের জন্য খুব সহজেই এর স্থানান্তর (Movement) বের করা সম্ভব।
ম্যাজিক বর্গ , নামটা শুনেই মনে হচ্ছে এবার মনে হয় আমরা কোন ম্যাজিক শিখতে যাচ্ছি । হা ম্যাজিক শিখবো তবে ভিন্ন উপায়ে , আমার কাছে মনে হয় কেও যদি অংক আর প্রোগ্রামিং নিয়ে বার বার কোন জিনিস না হওয়ার সত্ত্বেও লেগে থাকে , একদিন না একদিন ফল ঠিকি পাবেই । আর আমরা এখন যে বর্গ ম্যাজিক টা শিখতে যাচ্ছি সেটা অনেক টা এমনি কিছুটা সময় তোমাকে ব্যায় করতে হবে । আগে প্রোগ্রাম টা পড়ে নাও । কি বলছে প্রোগ্রামে তা নিচ্ছই তুমি বুঝে গেছো, আমি আর একবার বলছি শটকাটে , তোমাকে একটা যে কোন সংখ্যা দেওয়া হবে এবং বের করতে হবে সেই সংখ্যার সম্ভাব্য ম্যাজিক বর্গ । কিন্তু প্রশ্ন হল বর্গ টা কত অডার এর হবে ? তোমাকে যে সংখ্যা টা নিতে বলা হবে সেটার বর্গ হবে তাঁর অডার যেমন তুমি যদি ইনপুট ৩ নাও তাহলে অডার হবে ৩*৩ । এখানে তুমি অডার ৩*৩ নিছো , ঘটনা টা কি তাহেলে নিচ্ছই ২ ডাইমেনসনাল অ্যারে এর কাজ এবং তুমি যখন এখানে ৩ ইনপুট নিচ্ছ তখন মেমোরি তে ৯ টা ঘর তৈরি হচ্ছে । আমাদের মূল কাজ ৯ টা ঘর পূরণ করা এবং এমন ভাবে পূরণ করতে হবে যেন প্রতিটা সারি , কলাম , কর্ণ যোগ করলে একি হয়। এখন প্রশ্ন হল পূরণ তো আমরা করব যে ভাবে হোক না কেন কিন্তু প্রতিটা সারি , কলাম , কর্ণ যোগ করলে কত হবে এটা আমরা কিভাবে পাব ? সুত্র টা হল –এখানে n হল সারি অথবা কলাম এর সংখ্যা। তুমি এখানে ৩ নিছো যোগফল টা – ১৫ এবং এটাই হল ম্যাজিক নাম্বার । এবার প্রশ্ন হল কিভাবে পূরণ করলে প্রতিটা সারি , কলাম , কর্ণ যোগফল ১৫ পাবা। এখন তুমি বর্গ টা পূরণ করবা কিভাবে ? এখানে খেয়াল কর এখন তোমার অ্যারে তে যেভাবে ডাঁটা গুলো সাঁজাতে হবে –
তোমার ম্যাজিক বর্গ যেভাবে সাঁজাতে হবে –লক্ষ্য কর (০,১) তম স্থানে ১ আছে , (২,২) তম স্থানে ২ , (১,০) স্থানে ৩ … এভাবে (২,১) তম স্থানে ৯ আছে এখন যেহেতু ( i,J) সুতরাং খেয়াল কর-এবার i ও j এর মান নিয়ে একটু চিন্তা কর তাহেলে ১,২,৩,৪,৫,৬,৭,৮,৯ সঠিক স্থানে তুমি বসাতে পারবা ।
স্টেপ গুলা তোমার সুবাধার জন্য- এখন তোমার কোড করার পালা i ও j এমন মানের জন্য কন্ডিশন নিজে বানাও তাহেলে তুমি সার্থক।
আমরা এখন একটা গেম খেলবো , মনে কর তোমরা দুই জন আছো এখন খুব সহজে কিন্তু দুই জনের মধ্যে থেকে একজন উইনার বের করা সম্ভব। উইনার বের করার জন্য তোমরা কয়েন টেস্ট করতে পার এটা সবচেয়ে জনপ্রিয়, এটা ছাড়াও কিন্তু অনেক ভাবে বের করা সম্বব কিন্তু খেলা তো খেলাই রুল মেনে চলতে হবে এবং জনপ্রিয় তা খেয়াল করতে হবে। এখন মনে কর খেলা টাই দুই জন না হয়ে তিন জন হল এখন কিভাবে তুমি উইনার বের করবে ? তোমার কাছে কি কন ধরনা আছে, না থাকলে প্রোগ্রাম টা আগে পড় । এখানে অনেক জনপ্রিয় একটা খেলা বর্ণনা করা আছে, আমি সটকাটে একটু বলি মনে কর আমরা তিন জন আছি তুমি , আমি (শাওন ) ও আমার বন্ধু শামীম এবং আমরা তিনজন খুব ভাল বন্ধু কিন্তু আমাদের মধ্যে মাঝেমধ্যে ঝগড়া লাগে আমাদের রুম এর দরজাই কেও নক করলে কে রুম এর দরজা খুলবে, আর এই সমস্যা সমাধান এর জন্য এই গেম টা বেশ কাজে দিছে। কিন্তু গেম টা কি ? তোমার কাছে একটা কলম আছে এবং তোমাকে বলা হল ০ বা ১ যেকোন একটা সংখ্যা তুমি হাতে লিখ এবং আর কেও যেন না দেখে । পরে আমি ও একটা সংখ্যা লিখলাম এবং আমার বন্ধুও একটা সংখ্যা লিখল ।
কিন্তু ঘটনা টা কি হল , এখানে লক্ষ্য কর তিন টা একি হলে যাবে না এবং তাদের মধ্যে যেকোন একটা ভিন্ন হলে সে যাবে এখানে ১ ভিন্ন এবার লক্ষ্য কর …
এখানে লক্ষ্য কর তিন টা একি হলে যাবে না এবং তাদের মধ্যে যেকোন একটা ভিন্ন হলে সে যাবে এখানে ০ ভিন্ন । তাহেলে প্রোগ্রাম এর ভাষাই কিভাবে কন্ডিশন লিখব,
এইটুকুই ছিল লজিক এখন তোমার চেষ্টা করার পালা……।
“নিজে চেষ্টা কর না পারলে প্রোগ্রাম দেখে বোঝো কিন্তু কপি কর না , নিজের মেধা টা কে নষ্ট কর না”
৬+ ৯ = ১৫ ঠিক বলে মনে হয় । কিন্তু কিভাবে ৪ + ৬ = ২ ???? আসলে আমরা যখন প্রথম বিচ্ছন্ন গণিতে যোগ, বিয়োগ , গুণ , ভাগ করি প্রায় সবারি স্যার কে পাগল বলে মনে হয়, আমি তো মনে করছিলাম স্যার কি পাবনা থেকে মাত্র মুক্তি পাইল নাকি ? কিন্তু না স্যার সেদিন ঠিক ছিল হইত আমাদের বুঝতে কিছুটা সময় লেগেছিল নামটা বিচ্ছন্ন গণিত ছিল বলে। যাইহোক এবার আমাদের প্রোগ্রাম টা বিচ্ছন্ন গণিতে এর উপর। প্রোগ্রাম টা প্রথমে দেখো। আমার মনে হয় তোমরা কিছুটা হলেও বুঝোছো , এর মধ্যে ডেছিমাল ও তার বাইনারি দেওয়া আছে যেমন ৬ এর বাইনারি ১১০ আবার ৯ এর বাইনারি ১০০১ এই বাইনারি সংখ্যা দুইটা যোগ করলে ১১১১ হয় যেটার ডেছিমাল হল ১৫ তাহেলে তো যে কোন সংখ্যা কে বাইনারি তে রুপান্তর করে যোগ করলেই হবে , সত্যি কি হবে ? এবার ৪ এর বাইনারি ১০০ এবং ৬ এর বাইনারি ১১০ , এই বাইনারি সংখ্যা দুইটা যোগ করলে ১০১০ হয় যেটার ডেছিমাল হল ১০ কিন্তু উত্তর তো ২ যেটার বাইনারি ১০। তাহেলে আমাদের আর একটু বেশি ভাবতে হবে যেহেতু এখানে OR gate এবং AND gate দেওয়া আছে আমার মনে হয় এইগুলো দিয়ে হবে । আমরা এখন Bitwise AND , Bitwise OR, Bitwise XOR এর ট্রুথ টেবিল গুলো দেখি এখন লক্ষ্য কর আমাদের কাঙ্কিত উত্তর এর সাথে…
এবং উত্তর টা …উত্তর টা নিচ্ছই XOR এর সাথেই মিলে গেছে । এখন আমদের প্রোগ্রাম তো তেহেলে শেষ। XOR by default আমাদের কম্পাইলারে দেওয়া আছে আর XOR প্রতীক না পারলে ।
আমরা হইত ক্রিপ্টোগ্রাফি নাম টার সাতে একটু বেশি পরিচিত। এবার আমরা ক্রিপ্টোগ্রাফি এর পাওয়ার নিয়ে বিশ্লেষণ করব। আমরা তো প্রাই সবাই ক্যালকুলেটর ব্যবহার করি, এই ক্যালকুলেটর এর স্কোয়ার, কিউব ইত্যাদি এগুলো সবই পাওয়ার এর প্রোগ্রাম, এবার এসো আমরা ক্যালকুলেটর এর এই প্রোগ্রাম গুলো নিজেরাই করব এবং একটা ক্যালকুলেটর এ ব্যাপ্তি তো মাত্র ১০^৯৯ কিন্তু আমরা যে প্রোগ্রাম করব তাঁর ব্যাপ্তি আমরা ১০^১০১ পর্যন্ত নিব। যাই হোক প্রোগ্রাম টা আগে দেখো। এখানে বলা হইছে তুমি প্রথমে একটা সংখ্যা নিবা (n) যেটার ব্যাপ্তি মাত্র ২০০ পর্যন্ত এবং পরে আর একটা সংখ্যা নিবা (p) যেটার ব্যাপ্তি ১০^১০১ পর্যন্ত। আচ্ছা সংখ্যা তো দুইটা নিলাম কিন্তু এবার কি করব, আগেই বলে ছিলাম পাওয়ার নিয়ে বিশ্লেষণ সুতরাং একটু ভাঙ্গিয়ে বলি আমরা কি জানি , রুট=১/২ এইটুকু জানলেই এই প্রোগ্রাম টা সল্ভ করা যাবে, এখানে ২=n এবং ১৬=p তাহেলে উত্তর কি আসছে নিচ্ছই ৪ এটা তো ক্যালকুলেটর এ করলাম,
এই প্রোগ্রাম টাই এখন আমরা কোডব্লক এ করব প্রথমে বলে রাখি আমরা কোড করার জন্য যে প্লাটফর্ম ব্যবহার করি না কেন তাতে অবশ্যই math.h নামক একটা হেডার ফাইল আছে , এবং এটার কাজ মেথ এর বেশ কিছু যেমন sin,cos,tan,pow ইত্যাদি । এখন আমারা যদি কোন প্রোগ্রামে রুট পেতে চাই তাহেলে অবশ্যই পাওয়ার দিয়ে সম্ভব। কারন পাওয়ার এর কাজ হল পর পর দুইটা সংখ্যা কমা দিয়ে লিখলে দ্বিতীয় টা প্রথম টার পাওয়ার হবে। এখানে মুলত k = ১৬^(১/n) বোঝাচ্ছে তার মানে উত্তর টা ৪ পাচ্চি , আমাদের প্রোগ্রাম কিন্তু শেষ কিন্তু একটু ভাবতে হবে এখানে কিন্তু অনেক বড় সংখ্যা দিছে সুতরাং ব্যাপ্তি বড় এমন ডাটা টাইপ ব্যবহার করতে হবে। আমি একটু ধরনা দিতে পারি যেটার ব্যাপ্তি (১.৭E-৩০৮ থেকে ১.৭ E+৩০৮ ) এটা তোমরা ব্যবহার করতে পারো কারন তোমার দরকার ১০^১০১ , ব্যাপ্তি টা অবশ্যই এর মধ্যেই আছে।
“নিজে চেষ্টা কর না পারলে প্রোগ্রাম দেখে বোঝো কিন্তু কপি কর না , নিজের মেধা টা কে নষ্ট কর না”
একজন প্রোগ্রামার সব সমায় অঙ্ক নামক জিনিস টারে অনেক বেশি ভালবাসে। যাই হোক এবার আমরা ডিজিট গণনা নিয়ে বিশ্লেষণ করব। মনে কর তোমার কাছে একটা সংখ্যা দেওয়া হল -৩, এখন তুমি কি বলতে পারবা এতে কয়টা ডিজিট আছে, এক কথাই উত্তর এখানে একটা ডিজিট আছে, আবার তোমাকে যদি ৭৮০০ দেওয়া হই তাহালে বলত এখানে কইটা ডিজিট আছে,তুমি বলবে এখানে ৪ টা ডিজিট আছে। এখন আর একটু বেশি চিন্তা করি তোমার কাছে সেই আগের সংখ্যা দেওয়া হল -৩, এবং বলে দেওয়া হল এর ব্যাপ্তি ৩ পর্যন্ত। তাহেলে সংখ্যাগুলো হল ১ ,২ এবং ৩ আবার মনে কর সংখ্যাটি ১৩ তাহেলে সংখ্যাগুলো হল ১,২,৩,৪,৫,৬,৭,৮,৯,১০,১১,১২ এবং ১৩ আর তুমি নিচ্ছই জান যে প্রত্যেক টা সংখ্যা তাই যত বড় হোক না কেন তা ০ থেকে ৯ এর কোন না কোন ডিজিট এর সমষ্টি, যেমন ১৪০১২। প্রোগ্রাম টা এই লিঙ্ক এ ক্লিক কর। তুমি নিচ্ছই প্রোগ্রাম টা পড়ছো, এই প্রোগ্রাম টা তে বলা হইছে যে তোমাকে প্রথমে টেস্ট কেস নিতে হবে এবং যার ব্যাপ্তি ১ থেকে ১০০০০ পর্যন্ত। তোমরা নিচ্ছই টেস্ট কেস কিভাবে প্রগ্রামে লিখেতে হই এটা এত দিনে জেনে গেছো, আর না জানলে।
এখন তোমার কাজ হল একটা সংখ্যা নিতে হবে এবং সেই সংখ্যা কে তার ব্যাপ্তি পর্যন্ত লুপ ঘোরেতে হবে যেমন তুমি ৩ নিলে তাহেলে তোমাকে ১,২,৩ পর্যন্ত লুপ ঘোরেতে হবে কিন্তু কিভাবে ,
এর অর্থ কি আসলে, এটি প্রথমে ১ নিয়ে তারপর ২ নিয়ে তারপর ৩ নিয়ে কাজ করবে এবং সংখ্যা টা যতক্ষণ না পর্যন্ত ০ হই ততোক্ষণ পর্যন্ত কাজ করবে এর ০ হলে while লুপ এর কাজ শেষ হবে । এখন এক মাত্র কাজ ভেরিয়াবল গুলোর ডিজিট গণনা করা, আর ডিজিট গণনা করতে আমাদের চির চেনা নিয়ম ১০ দ্বারা ভাগ করা আর সেভাবেই ১০ দ্বারা ভাগ করে করে ডিজিট গণনা করি, এখানে যেহেতু ডিজিট গুলো অবশ্যই ০ এবং ৯ এর মধ্যে আছে সুতরাং তোমার ১০ টা ভিন্ন ভেরিয়াবল লাগবে ,
এখন তোমার প্রশ্ন আমি কেন শেষে ভেরিয়াবল কে ১০ দ্বারা ভাগ করে ভাগফল টা নিচ্ছি , কারন while লুপ এবং ০ এর সম্পর্ক তো জানিই, এখানেও ওই লক্ষ আমাদের লুপ থেকে বের হওয়া।
এবার আমরা ১৩ কে নিব এবং কেন এর আউটপুট এমন আশে দেখব; 1 6 2 2 1 1 1 1 1 1 এখানে ১৩ বলতে আমারা ; ১,২,৩,৪,৫,৬,৭,৮,৯,১০,১১,১২,১৩ কে বোঝাচ্চি , একটু লক্ষ্য করে দেখো এখানে ০ কিন্তু ১ টা , ১ কিন্তু ৬ টা ……এভাবে ৯ কিন্তু ১ টা, সুতরং আউটপুট এর মধ্যেই বলে দেওয়া আছে আমাদের কি গণনা করতে হবে। সম্পূর্ণ প্রোগ্রাম টা… প্রগ্রাম-১২২৫।
” নিজে চেষ্টা কর না পারলে প্রোগ্রাম দেখে বোজো কিন্তু কপি কর না , নিজের মেধা টা কে নষ্ট কর না”