مسیرها
/
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

توجه کنید که طبق قواعد توضیح‌داده‌شده، '0'، 'false'، [] و {} در JavaScript صادق هستند.

تبدیل به عدد

از Number(value) می‌توان برای تبدیل یک مقدار به عدد استفاده کرد. فاصله‌های سفید در ابتدا و انتهای رشته نادیده گرفته می‌شوند و رشته‌ی خالی به 0 تبدیل می‌شود. اگر بخواهید مقداری غیراولیه یا رشته‌ای را تبدیل کنید که نمایانگر یک عدد نیست، نتیجه NaN (عدد نیست) خواهد بود.

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 را برای تبدیل ضمنی آن مقدار اعمال می‌کند.

هم‌نوع‌سازی به مقدار منطقی معمولاً در این موارد رخ می‌دهد:

  • شرط یک دستور شرطی
  • عملوند اول عملگر سه‌تایی ?
  • عملوند عملگر نقیض منطقی !
  • عملوندهای عملگرهای 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 بنویسید که دو آرایه را به عنوان پارامتر می‌پذیرد. هر آرایه از یک یا چند عدد بین ۰ و ۹ تشکیل شده است. تابع باید هر آرایه را به عنوان یک عدد تفسیر کند و مجموع آن دو عدد را برگرداند.

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

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

2. تشخیص پالیندروم بودن یک عدد

بازی دیگری در وبسایت یک آزمون کوچک به اسم «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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.