Analog Clock

সোমবার, ১৮ জুলাই, ২০১৬

রিসোর্স কালেকশন - একটি নেশা

রিসোর্স কালেক্ট করা, ভিডিও টিউটোরিয়াল ডাউনলোড করা, অগ্রজদের পরামর্শ/উপদেশ চাওয়া, এসবই কিন্তু একটা নেশা হয়ে যেতে পারে। লম্বা লম্বা টিউটোরিয়াল ডাউনলোডে রেখে ডাউনলোড পার্সেন্টেজের দিকে তাকিয়ে থাকা আর ফিল করা "আহ !! আমার নেট কানেকশন টা বেশ", অথবা অগ্রজ দের কাছে পরামর্শ/উপদেশ চাওয়ার পরে তারা যখন আন্তরিক ভাবে রেসপন্স করে, তখন "আহ!! ভাই আমারে কত্তো আপন ভাবছে, ভাইয়ের ছোট ভাই হতে পেরেছি, এইটাই অনেক বড় কথা", এসব খুবই ডেঞ্জারাস। টিউটোরিয়াল/রিসোর্স কালেকশনের নেশায় পড়ে গেলে গিগাবাইট থেকে টেরাবাইট ভরে ফুলে ঢোল হয়ে যাবে, কিন্তু আপনার দেড় কেজি ভরের ঘিলুর মেমোরি গুলো ধুলিকণায় হাহাকার করে মরবে।
শত শত ভাইয়ার কাছে আজীবন উপদেশ চেয়ে গেলে, শতজনের শতরকম আইডিয়ায় মাথা লোড হয়ে খালি ভন ভন করেই ঘুরবে।
টপকোডার ভালো নাকি কোডফোর্সেস ভালো, uva ভালো নাকি uri ভালো, এসব তুলনা করতে করতে সবার ৫০০/১০০০ করে সলভ হয়ে যাবে, আপনি তখনও জাজমেন্টাল মাইন্ডে পঁচে মরবেন।
C ভালো নাকি পাইথন ভালো, C++ ভালো নাকি জাভা ভালো, এসব ডিসকাস করতে করতে ফেসবুকে কুটি কুটি "লিক কমান্ড" এ ভরে যাবে, কোন নৌকায় উঠবো ভাবতে ভাবতে শেষে কোনো নৌকাতেই আর ওঠা হবেনা।

C বলেন আর C++ বলেন, কোডফোর্সেস বলেন বা টপকোডার বলেন, uva বা uri বলেন, সবার উদ্দেশ্যই এক, প্রবলেম সলভ করা আর করানো।
একটা ফিল্ডে অনেক মানুষ ভালো করে, তাই বলে সবার কর্মপদ্ধতি সব সময় এক রকম হয়না, তাই খুব বেশি যাচাই বাছাই না করে, একটা পদ্ধতি ধরে কাজে নেমে পড়ুন, যখন আপনার নিজস্ব সেন্স তৈরী হবে, তখন নিজেই আস্তে আস্তে প্রয়োজন অনুযায়ী পদ্ধতিকে মোডিফাই করতে পারবেন।
নিজের কোডিং টেমপ্লেট নিজেই তৈরী করে ফেলবেন।
কাউন্ট ভেরিয়েবলের নাম cnt রাখবেন নাকি counter রাখবেন সেটা আপনার নিজস্ব স্টাইল।
টিউটোরিয়াল কালেক্ট করা দোষের কিছু না, টিউটোরিয়াল মাথায় না ঢুকানোই দোষ।

গ্রন্থগত বিদ্যা আর পর হস্তে ধন,
নহে বিদ্যা, নহে ধন, হলে প্রয়োজন..........

রবিবার, ১৭ জুলাই, ২০১৬

রিকার্শন -> দ্বিতীয় কিস্তিঃ ..........


আজ বলার চেষ্টা করবো রিকার্সিভ ফাংশন কিভাবে লিখতে হয়।

"ফাংশন লেখা তো এক্কেবারে সোজা একটা ব্যাপার, দুড়ুম দাড়াম করে ফাংশনের নাম, রিটার্ন টাইপ আর ভেতরে কলকব্জা গুলো লাগায় দিয়ে রিটার্ন স্টেটমেন্ট লিখে দিলেই হইলো, এ আবার আলাদা কি !!"

হুম্ম ভাই, একটু আলাদাই, কারণ এই জিনিস টা যে "রিকার্সিভ" ;)
আপনাকে একটু স্পেশ্যাল কেয়ার নিতেই হবে, নয়তো আপনার প্রোগ্রাম হয়ে যাবে দড়ি ছিঁড়ে পালানো দুষ্টু গরুর মতো, যার শেষ অবস্থান খোয়াড়ে।

আগেই জানেন যে রিকার্সিভ ফাংশনের এক ( বা একাধিক ! ) বেজ কেস থাকে, যেখানে পৌঁছালে আরো গভীরে না যেয়ে সরাসরী কোনো কিছু রিটার্ন করে দেওয়া যায়। ফাংশন বডির শুরুতেই এই বেজ কেসের ব্যাপার টা হ্যান্ডেল করতে করে নেবেন। তা না করলে "আজীবন" ধরে আপনার প্রোগ্রাম থামার কোনো কারণ পাবে না, ( ক্রাশ করার আগ পর্যন্ত :/ )

ধরা যাক আপনি আপনি Fibonacci সিরিজ এর n তম পদ  টা বের করার জন্যে একটা রিকার্সিভ ফাংশন লিখবেন। এইটার বেজ কেস হইলো যদি n এর মান 1 বা 2 হয় তাহলে সরাসরী এন্সার হলো 1 ।
তাহলে ফাংশন বডির শুরুতেই লিখবেন if(n == 1 || n  == 2) return 1;
আবার ফ্যাক্টরিয়াল বের করার বেজ কেস হলো যদি n এর মান 0 হয় তবে সরাসরী সেটার এন্সার 1. তাহলে ফাংশন বডির শুরুতেই লিখবেন
if(n == 0) return 1;
ডায়নামিক প্রোগ্রামিং যদি রিকার্শন দিয়ে করেন সেক্ষেত্রে সাধারণত বেজ কেস হয় কোনো একটা স্টেটে আপনি আগে এসেছেন কিনা সেটা চেক করা। যদি আগে এসে থাকেন তবে সেই স্টেটের ভ্যালু আবার ক্যালকুলেশন না করে সরাসরী আগের সেভ করা জায়গা থেকে রিটার্ন করিয়ে দেওয়া যায়।
এটাই রিকার্সিভ ডায়নামিকের বেজ কেস। [ শাফায়েত ভাইয়ের ব্লগ থেকে ডায়নামিক প্রোগ্রামিং দেখতে পারেন ]

যাই হোক, বেজ কেসের কথা গেলো।

এবার আসলো ফাংশনের বাকি বডি লেখার পালা।
এবার আপনাকে একটু স্বার্থপরের মতো চিন্তা করতে হবে।

প্রথম কিস্তিতে বলেছিলাম আপনার উপরে অর্পিত কাজ টাকে আপনার ক্ষমতা যতোটুকু, ততোটুকু আপনার কাছে রেখে বাকি টুকু নতুন একটা "আপনি" তৈরী করে তাকে করতে দেওয়া।
স্বার্থপরের মতো চিন্তা করতে এইজন্যে বলছি যে ফাংশন বডি লেখার সময় আপনার ভাবা লাগবেনা যে আপনার অন্য "আমি" রা কিভাবে কাজ করবে, আপনি শুধু নিজের কথা ভাববেন আপনি কিভাবে আপনার কাজ টা করবেন, অর্থাৎ আপনি এখন যে ফাংশনের বডি টা লিখছেন, সে কিভাবে কাজ করবে আর কখন আরেকটা "নিজেকে" তৈরী করে তাকে কাজ গছিয়ে দিবে, আর সব শেষে কিভাবে নিজের "অন্য" কপি গুলো থেকে পাওয়া কাজের রেজাল্ট কে নিজের কাজের রেজাল্টের সাথে মার্জ করে ফাইনাল একটা রেজাল্ট রিটার্ণ করিয়ে দিবে, এগুলো ভাবলেই হচ্ছে।
যেমন Fibonacci সিরিজের n তম পদ বের করতে____
int fib(int n)
{
if(n == 1 || n == 2) return 1;
else return fib(n - 1) + fib(n - 2);
}
এখানে আপনার ভাবার দরকার নেই যে পরে যে দুটো  fib কে কল করেছেন তারা কিভাবে কাজ করবে।
জাস্ট লিখে ফেলেন :)

সুতরাং, রিকার্সিভ ফাংশন লেখার মোটামুটি ৩টা ধাপ পেলাম আমরা...
১) সবার আগে বেজ কেস হ্যান্ডেল করা।
২) ফাংশনের ওয়ার্কিং কলকব্জা লেখা
৩) নিজের তৈরী করা নিজের অন্যান্য কপি থেকে প্রাপ্ত রেজাল্ট কে নিজের সাথে মার্জ করে একটা ফাইনাল রেজাল্ট রিটার্ন করে দেওয়া।

খুব ভালো হয় যদি আপনি শাফায়েত ভাইয়ের ব্লগ থেকে কয়েন চেঞ্জ শিখেন। রিকার্শনের সাথে ডায়নামিক ফ্রী ;)



মূল পোস্ট ছিলো এখানে...

রিকার্শন প্রথম কিস্তি এখানে...

শাফায়েত ভাইয়ের কয়েন চেঞ্জ এখানে :)

শাফায়েত ভাইয়ের এলগরিদম ব্লগ :)

সিনট্যাক্স টেমপ্লেট বনাম প্রবলেম সলভিং স্কিল, ডিম আগে না মুরগী আগে ???

অনেকের কোড বের করলে দেখবেন উপরে একগাদা জিনিস #include করা, #define করা, বিগিনার রা এগুলো দেখলে ভয় পেয়ে যান, অনেকে জিজ্ঞাসা করেন এগুলো দরকার নাকি দরকার না।
আমার যেটা মনে হয় সেটা বলিঃ ভাই কোড দিয়ে প্রবলেম সলভ করতে হইলেও কোড কিন্তু ব্যাপার না, ব্যাপার হইলো আপনার চিন্তা, আপনার জ্ঞান, আপনার ডেপথ, আপনার রাফ খাতা কলম/পেন্সিলে করা ডিজাইন, এগুলো ঠিক করতে পারলে যে ল্যাংগুয়েজই হোক সেটা কোনো সমস্যা না, অনেক সিনট্যাক্স জানা আসলে সুবিধাজনক কিন্তু আপনার মাথা যদি আইডিয়া ধরতে না পারে তবে সিনট্যাক্স লিখে কি করবেন। বিশ্বের ১ নম্বর স্পোর্টস প্রোগ্রামার গেন্নাডি করোটকেভিছ ( #ট্যুরিস্ট ) এর কোড দেখেন, পোলাটা প্রতিটা কোড করার সময় নতুন করে শুরু করে, কোনো টেমপ্লেট নাই কোনো ডিফাইন নাই।
একেবারে শুরু তে bits/stdc++.h ইনক্লুড করে আর using namespace std ব্যাবহার করে। এরপর তার কোড শুরু, আর সে এমন একটা এডিটর ব্যাবহার করে ( Far Manager ) যাতে auto-completion ও নাই, অর্থাৎ সে সম্পুর্ণ কোড টাই লিখে প্রতিবার।
তারপরেও সে সবার আগে সব কিছু সলভ করে, এর কারণ তার মাথায় দ্রুত কার্যকর আইডিয়া আসে যা সে ইমপ্লিমেন্ট করে।
সে এতোই ফাস্ট এর সাথে এতোই এক্যুরেট যে, কেউ তার আগে লার্জ ইনপুট ( ফেসবুক হ্যাকার কাপ, গুগল কোড জ্যাম ) সাবমিট করলে সেই ব্যাটার টা ভুল হয়, গেন্নাডি ঠিকই ফার্স্ট হয় ( লাস্ট ২ বছরের অবজার্ভেশন )।
তাই, ইনক্লুড, ডিফাইন এগুলোর চিন্তা আপাতত বাদ দিয়ে সলভিং স্কিলের দিকে বেশি নজর দেন।
আর একটা কথা, যারা বলেন "c shesh, ebar kon boi theke c++ shikhbo", তাদের উদ্দেশ্যেঃ যদি আপনি ল্যাংগুয়েজ এক্সপার্ট হইতে চান তাহলে আমার কিছু বলার নেই, যদি প্রবলেম সলভার হইতে চান তাহলে ডিরেক্ট প্রবলেম সলভিং আর কনটেস্টে নেমে পড়ুন, ঠ্যালায় পড়ে অনেক কিছু শিখে যাবেন :)

মূল পোস্ট ছিলো এখানে...

#theromeo421