ট্র্যাক
/
JavaScript
JavaScript
/
অনুশীলনী
/
ভাগ্যবান সংখ্যা
ভাগ্যবান সংখ্যা

ভাগ্যবান সংখ্যা

লার্নিং অনুশীলনী

ভূমিকা

JavaScript-এ মান বিভিন্ন টাইপের হতে পারে। এক্সপ্লিসিট টাইপ কনভার্সন-এর মাধ্যমে একটি ভ্যারিয়েবলের টাইপ পরিবর্তন করা যায়। এর পাশাপাশি, কনটেক্সটের প্রয়োজন হলে JavaScript টাইপ কোয়ার্সন (ইমপ্লিসিট টাইপ কনভার্সন)-ও করে।

টাইপ কনভার্সন

অনেক ভাষার মতো ভিন্ন টাইপে কাস্ট করার কোনো কনস্ট্রাক্ট JavaScript-এ নেই, তবে বদলে কিছু বিল্ট-ইন হেল্পার ব্যবহার করা যায়। বিশেষ করে, Boolean, Number ও String-কে ফাংশন হিসেবে ব্যবহার করে একটি মানকে সংশ্লিষ্ট টাইপে রূপান্তর করা যায়।

বুলিয়ানে রূপান্তর (ট্রুথি/ফালসি মান)

Boolean(value) দিয়ে আপনি যেকোনো মানকে বুলিয়ানে রূপান্তর করতে পারেন। এমন কিছু নির্দিষ্ট মান আছে, যাদের ফালসি মান বলা হয়, যেগুলো false-এ রূপান্তরিত হয়। সবচেয়ে গুরুত্বপূর্ণ হলো, false, 0, খালি স্ট্রিং, null, undefined ও NaN ফালসি।

বাকি সব মানের জন্য Boolean true ফেরত দেয়। এই মানগুলোকে ট্রুথি বলা হয়।

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

মনে রাখবেন, বর্ণিত নিয়ম অনুযায়ী JavaScript-এ '0', 'false', [] ও {} ট্রুথি।

সংখ্যায় রূপান্তর

Number(value) দিয়ে একটি মানকে সংখ্যায় রূপান্তর করা যায়। স্ট্রিংয়ের শুরুতে ও শেষে থাকা হোয়াইটস্পেস উপেক্ষা করা হয়, আর খালি স্ট্রিং 0-এ রূপান্তরিত হয়। আপনি যদি কোনো নন-প্রিমিটিভ ভ্যালু বা এমন স্ট্রিং রূপান্তর করতে চেষ্টা করেন যা কোনো সংখ্যা বোঝায় না, তাহলে ফলাফল হয় NaN (Not-A-Number)।

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

স্ট্রিংয়ে রূপান্তর

String(value) দিয়ে আপনি একটি মানকে স্ট্রিংয়ে রূপান্তর করতে পারেন। প্রিমিটিভ ভ্যালুর ক্ষেত্রে ফলাফল ঠিক যা আপনি আশা করবেন তাই।

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

অ্যারের ক্ষেত্রে String ফাংশন প্রতিটি এলিমেন্টের উপর স্ট্রিং কনভার্সন প্রয়োগ করে ফলাফলগুলো কমা দিয়ে জোড়া লাগায়। আপনি নিজেও join মেথড প্রয়োগ করতে পারেন, যেমন সেপারেটর কাস্টমাইজ করার জন্য। মনে রাখবেন, এসব ক্ষেত্রে null ও undefined খালি স্ট্রিংয়ে রূপান্তরিত হয়।

String([42, null, true, 'abc']);
// => '42,,true,abc'

অবজেক্টের ক্ষেত্রে ডিফল্টভাবে String কাজের নয় এমন একটি স্ট্রিং রিটার্ন করে।

String({ key: 'value' });
// => '[object Object]'

টাইপ কোয়ার্সন

কিছু কনটেক্সটে, কোনো স্টেটমেন্ট ইভ্যালুয়েট করার আগে JavaScript স্বয়ংক্রিয়ভাবে একটি মানকে অন্য ডেটা টাইপে রূপান্তর করে। এই ইমপ্লিসিট রূপান্তরকে টাইপ কোয়ার্সন বলা হয়।

বুলিয়ান কনটেক্সট

বুলিয়ান কনটেক্সটে কোনো নন-বুলিয়ান মান ব্যবহার করলে JavaScript Boolean ফাংশনের মতো একই নিয়ম প্রয়োগ করে মানটিকে ইমপ্লিসিটভাবে রূপান্তর করে।

বুলিয়ানে কোয়ার্সন সাধারণত ঘটে

  • একটি if স্টেটমেন্টের শর্তে
  • টারনারি অপারেটর ?-এর প্রথম অপারেন্ডে
  • লজিক্যাল NOT অপারেটর !-এর অপারেন্ডে
  • লজিক্যাল AND && এবং OR || অপারেটরের অপারেন্ডে (এক্সপ্রেশনের ফলাফল অপারেন্ডগুলোর একটি, সবসময় বুলিয়ান নয়)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

স্ট্রিং কনটেক্সট

প্রিমিটিভ ভ্যালুর ক্ষেত্রে যোগ অপারেটর + ব্যবহার করলে এবং একটি অপারেন্ড স্ট্রিং হলে, অন্যটিও স্ট্রিংয়ে কোয়ার্স করা হয়। রূপান্তরের যুক্তি String ফাংশন ব্যবহারের সময়ের মতোই। এরপর দুটি স্ট্রিং কনক্যাটিনেট করা হয়।

let name;
'hello ' + name;
// => 'hello undefined'

নিউমেরিক কনটেক্সট

অনেক অপারেটর উপরে ব্যাখ্যা করা Number ফাংশনের যুক্তি অনুযায়ী অপারেন্ডগুলোকে (প্রয়োজনে) সংখ্যায় কোয়ার্স করে।

  • অ্যারিথমেটিক অপারেটর: + (কোনো স্ট্রিং জড়িত না থাকলে), -, *, /, %, **
  • ইউনারি প্লাস ও ইউনারি নেগেশন অপারেটর: +, -
  • রিলেশনাল অপারেটর (নন-স্ট্রিং অপারেন্ডের ক্ষেত্রে): >, >=, <, <=
  • বিটওয়াইজ অপারেটর: |, &, ^, ~

ওই অপারেটরগুলোর যেকোনোটির ব্যাপারে আরও বিস্তারিত জানতে MDN অপারেটরের তালিকা দেখুন।

ভুল এড়াতে, এসব অপারেটর প্রয়োগ করার আগে সবসময় স্পষ্টভাবে Number কল করা ভালো অভ্যাস।

নির্দেশনা

আপনার বন্ধু কোজো সংখ্যার বড় ভক্ত। তার 'fun-with-numbers' নামে একটি ছোট ওয়েবসাইট আছে। কোজো প্রোগ্রামিংয়ে খুব একটা ভালো নন, তাই তিনি আপনার কাছে সাহায্য চেয়েছেন।

আপনি কোজোর ওয়েবসাইটে নতুন সংখ্যার গেমের জন্য দুটি হেল্পার ফাংশন বানাবেন, আর ব্যবহারকারীর দেওয়া কিছু ইনপুট যাচাই করার জন্য একটি তৃতীয় ফাংশন বানাবেন।

1. স্লট মেশিনের সংখ্যাগুলোর যোগফল বের করুন

কোজোর ওয়েবসাইটের একটি গেম দেখতে স্লট মেশিনের মতো, যেখানে অঙ্ক লেখা চাকার দুটি দল দেখা যায়। অঙ্কের প্রতিটি দল একটি সংখ্যা বোঝায়। গেমের কার্যপ্রণালীর জন্য কোজোকে ওই দুই সংখ্যার যোগফল জানতে হবে।

এমন একটি ফাংশন twoSum লিখুন, যা প্যারামিটার হিসেবে দুটি অ্যারে নেয়। প্রতিটি অ্যারে 0 থেকে 9-এর মধ্যে এক বা একাধিক সংখ্যা নিয়ে গঠিত। ফাংশনটি প্রতিটি অ্যারেকে একটি সংখ্যা হিসেবে ধরে নেবে এবং ওই দুই সংখ্যার যোগফল রিটার্ন করবে।

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. একটি সংখ্যা প্যালিনড্রোম কি না তা নির্ণয় করুন

ওয়েবসাইটের আরেকটি গেম হলো "Lucky Numbers" নামের একটি ছোট কুইজ। একজন ব্যবহারকারী একটি সংখ্যা লিখতে পারেন এবং তারপর দেখেন সংখ্যাটি কোনো গোপন ক্রম বা প্যাটার্নের অন্তর্গত কি না। "lucky numbers"-এর ক্রম বা প্যাটার্ন প্রতি মাসে বদলে যায়, আর প্রতিটি ব্যবহারকারীর তা অনুমান করার সুযোগ থাকে সীমিত সংখ্যকবার।

এই মাসের lucky numbers হবে এমন সংখ্যা, যেগুলো প্যালিনড্রোম। অঙ্কগুলো উল্টে দিলেও প্যালিনড্রোমিক সংখ্যা একই থাকে।

এমন নতুন একটি ফাংশন luckyNumber তৈরি করুন, যা প্যারামিটার হিসেবে একটি সংখ্যা নেয়। সংখ্যাটি প্যালিনড্রোম হলে ফাংশনটি true রিটার্ন করবে, নাহলে false। ইনপুট সংখ্যাটি সবসময় একটি ধনাত্মক ইন্টিজার হবে।

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. ব্যবহারকারীর ভুল ইনপুটের জন্য একটি এরর মেসেজ তৈরি করুন

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

একটি ইনপুট ফিল্ডের ভ্যালু কীভাবে পাওয়া যায়, সে সম্পর্কে আরও কিছু তথ্য নিচে দেওয়া হলো।

  • ব্যবহারকারী কোনো ফিল্ডে কিছু লিখলে সংশ্লিষ্ট ভ্যালুটি সবসময় একটি স্ট্রিং হয়, এমনকি তিনি কেবল সংখ্যাই লিখে থাকলেও।
  • ব্যবহারকারী কিছু লিখে আবার মুছে ফেললে ভ্যারিয়েবলটি একটি খালি স্ট্রিং হবে।
  • ব্যবহারকারী টাইপ করা শুরু করার আগে ভ্যারিয়েবলটি undefined বা null হতে পারে।

ব্যবহারকারীর ইনপুট প্যারামিটার হিসেবে নেয় এমন একটি ফাংশন errorMessage লিখুন। ব্যবহারকারী কোনো ইনপুট না দিলে errorMessage ফেরত দেবে 'Required field'। ইনপুটটি যদি (JavaScript-এর কনভার্সন নিয়ম অনুযায়ী) শূন্য নয় এমন কোনো সংখ্যা প্রকাশ না করে, তাহলে ফেরত দেওয়া উচিত 'Must be a number besides 0'। বাকি সব ক্ষেত্রে ধরে নিতে পারেন ইনপুটটি বৈধ, রিটার্ন ভ্যালুটি হবে একটি খালি স্ট্রিং।

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
JavaScript Exercism

ভাগ্যবান সংখ্যা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।