লিপি আপার লিপ ইয়ার
চার বছর পর পর এক বছর পৃথিবী একটু অলস হয়ে যায়। তখন 365 দিনে সূর্যের চারপাশে ঘুরতে গিয়ে আলসেমি করে 1 দিন বেশি লাগায় ফেলে। তখন বাধ্য হয়ে 365 দিনে বছর না হয়ে 366 দিনে এক বছর হয়। সেই একদিন এক্সট্রাওয়ালা বছরকে লিপ ইয়ার (Leap Year) বলে।
এখন একটা প্রোগ্রাম লিখ, যেটা দিয়ে বোঝা যাবে, কোনো একটি বছর Leap Year কি না। যদিও কোনো একটি বছর Leap Year কি না, তা বোঝার জন্য দুটি সিস্টেম রয়েছে:
সহজ-সরল একটু গরল
কোনো একটি বছরকে 4 দিয়ে ভাগ করলে যদি কোনো ভাগশেষ না থাকে, তবে সেটি Leap Year। এখন একটা ফাংশন লেখ, যেটার মধ্যে year নামে একটা প্যারামিটার আছে, আর সেটিকে 4 দিয়ে ভাগ করবি। যদি ভাগশেষ 0 হয়, তাহলে true রিটার্ন করবি, অর্থাৎ বছরটি Leap Year। অন্যথায়, false রিটার্ন করবি।
উদাহরণস্বরূপ, 2043 সাল Leap Year নয়, কিন্তু 2052 সাল Leap Year।
function isLeapYear(year) {
if (year % 4 === 0) {
return true;
} else {
return false;
}
}
const isLipi1 = isLeapYear(2043);
const isLipi2 = isLeapYear(2052);
console.log(isLipi1);
console.log(isLipi2);
Output:
false
true এই সিস্টেমটি 100% সঠিক ফলাফল দেয় না। কারণ, শুধু 4 দিয়ে ভাগ গেলেই সব সময় লিপ ইয়ার হয়ে যায় না।
কিছু কিছু বছর ঝামেলা করে। বিশেষ করে শতকওয়ালা বছরগুলা ঝামেলা করে। সেজন্য 2100 সাল 4 দিয়ে ভাগ যায়, কিন্তু এইটা লিপ ইয়ার না। একইভাবে 2300 সাল 4 দিয়ে ভাগ হলেও লিপ ইয়ার না। অন্যদিকে 2400 সাল 4 দিয়ে বিভাজ্য, এইটা লিপ ইয়ার। অর্থাৎ শুধু 4 দিয়ে ভাগ হলেও সব বছর লিপ ইয়ার হয়ে যাবে না। আরেকটু কিন্তু আছে।
ভেজাইল্লা সঠিক সিস্টেম
সঠিক লিপ ইয়ার বের করার সিস্টেম হচ্ছে—
- যদি কোনো বছর 400 দিয়েও ভাগ যায়, তবে সেটি Leap Year হবে।
- আবার যদি 400 দিয়ে ভাগ যায় না, কিন্তু 100 দিয়ে ভাগ যায়, তবে সেটি Leap Year না।
- আর আগের হিসাবমতো শতকওয়ালা বছর বাদ দিলে যেসব বছর 4 দিয়ে ভাগ যায়, সেটা লিপ ইয়ার।
- আর যে বছরগুলা 4 দিয়ে ভাগ যাবে না, সেই বছর লিপ ইয়ার হবে না।
আসলে এইখানে ফর্মুলা মেইন ফ্যাক্টর না; বরং লজিক বুঝে সেটাকে কোডে বসাতে পারতেছস কি না, সেটা বড় ফ্যাক্টর।
প্রথম কাজ হচ্ছে, 400 দিয়ে ভাগ যাচ্ছে কি না। গেলেই সেটা লিপ ইয়ার। তারপর এর লজিক হচ্ছে 400 দিয়ে ভাগ না গেলে যদি 100 দিয়ে ভাগ যায়, তাহলে সেটা লিপ ইয়ার হবে না।
এইটুক যদি আমরা কোড লিখি, তাইলে কী হবে।
function isLeapYear(year) {
if (year % 400 === 0) {
return true;
}
else if ( year % 400 !== 0 && year % 100 === 0) {
return false;
}
}এইখানে else-if-এর কোড এইরকম থাকলেও জিনিসটা কাজ করবে। তবে প্রথম শর্ত যেহেতু if দিয়ে 400 দিয়ে ভাগ যাচ্ছে কি না চেক করতেছে। তারমানে ভাগ গেলে সে প্রথমেই আটক হয়ে যাবে। সে আর পরের লাইনে যাবে না। আর পরের লাইনে গেলে অটোমেটিকভাবেই সে 400 দিয়ে ভাগ যাচ্ছে না। সেটা বুঝাই যাচ্ছে। তাই else-if-এর মধ্যে আর 400 দিয়ে ভাগ যায় নাই, সেটা চেক না করলেও চলে।
function isLeapYear(year) {
if (year % 400 === 0) {
return true;
}
else if (year % 100 === 0) {
return false;
}
}এইভাবে প্রথম দুইটা ভেজাইল্লা লজিক তুই কোড করে ফেললি। তারপর কাজ হচ্ছে আগেরটার মতো। কারণ, শতকওয়ালা সংখ্যাগুলোর হিসাব শেষ। এখন বাকি সংখ্যাগুলোর মধ্যে যেগুলা 4 দিয়ে যাবে, সেগুলা লিপ ইয়ার। আর না গেলে লিপ ইয়ার না। সেটা আগের লজিকই। পুরা কোড দেখতে নিচের মতো।
function isLeapYear(year) {
if (year % 400 === 0) {
return true;
}
else if (year % 100 === 0) {
return false;
}
else if(year % 4 === 0){
return true;
}
else {
return false;
}
}
const isLipi1 = isLeapYear(2100);
const isLipi2 = isLeapYear(2400);
const isLipi3 = isLeapYear(1900);
const isLipi4 = isLeapYear(2052);
console.log(isLipi1, isLipi2, isLipi3, isLipi4);
Output: false true false trueএখানে দেখা যাচ্ছে, 2100 এবং 1900 সাল Leap Year নয়, কিন্তু 2400 এবং 2052 সাল Leap Year।
যদি এই লজিকটি প্রথমে সম্পূর্ণভাবে না বোঝা যায়, তাহলে চিন্তামুক্ত থাক। কারণ, একজন সুস্থ-সবল-স্বাভাবিক মানুষ প্রথম ধাক্কায় সব কিছু বুঝবে না; বরং অল্পকিছু জিনিস বুঝবি, আর বেশির ভাগ জিনিসই মাথার ওপর দিয়ে যাবে। আর যদি কোনো কারণে তুই এই জিনিস প্রথম ধাক্কায় বুঝে ফেলিছ, তাহলে সবাইকে দাওয়াত দিয়ে মেজবান খাওয়াইবি— তুই একটা জিনিয়াস।
Practice:
- একটা function লিখ, যেটা একটা income amount প্যারামিটার হিসেবে নিবে এবং কোনো tax bracket-এ পড়ে সেটা রিটার্ন করবে। ইনকাম যদি ≤ 50,000-এর নিচে হয়, তাহলে 10 রিটার্ন করবে। ইনকাম 50,001–100,000-এর মধ্যে হলে 20 ট্যাক্স হবে। আবার 100,001–200,000-এর মধ্যে হলে 30, আর $200,000 ওপরে হলে 40 পার্সেন্ট ট্যাক্স হবে। ফাংশন থেকে শুধু সংখ্যা রিটার্ন করবি। কোনো পার্সেন্টেজ চিহ্ন রিটার্ন করবি না।
- একটা প্যাকেজ ডেলিভারির খরচ হিসাব কর। যেখানে 10kg-এর কম হলে 100 টাকা। আর 20kg-এর কম হলে 300 টাকা। 50 kg-এর কম হলে 1000 টাকা। আর তার বেশি হলে কেজিপ্রতি 100 টাকা করে খরচ দিতে হবে।
- একটা function বানা, যেটা marks input নিবে এবং তারপর 80 বা তার ওপরে হলে A, 70 থেকে 79 হলে B, 60 থেকে 69-এর মধ্যে হলে C, 50 থেকে 59-এর মধ্যে হলে D, আর 50-এর নিচে হলে F গ্রেড return করবে।
- একটি ফাংশন লিখ যেটা ইনপুট হিসেবে একটা অ্যারে নিবে যে অ্যারের মধ্যে অনেকগুলা বছর থাকবে। তারপর সেই অ্যারের মধ্যে যতগুলো লিপ ইয়ার আছে সেটা কাউন্ট করবে। ফাইনালি মোট কয়টা লিপইয়ারওয়ালা বছর পাইছে সেই সংখ্যাটা রিটার্ন করবে।