برنامه نویسی

۸ پروژه ساده برای آشنایی با الگوریتم‌نویسی در جاوااسکریپت

اگر به‌تازگی یادگیری JavaScript را آغاز کرده‌اید و می‌خواهید مهارت خود را در الگوریتم‌نویسی تقویت کنید، این مقاله مخصوص شماست. در اینجا ۸ پروژه‌ کوچک و کاربردی را معرفی می‌کنیم که با پیاده‌سازی آن‌ها می‌توانید منطق برنامه‌نویسی خود را بهبود دهید. تمام این پروژه‌ها با JavaScript خام نوشته شده‌اند و برای افراد مبتدی تا سطح متوسط بسیار مناسب‌اند.

۱. بررسی عدد اول (Prime Number Checker)

سناریو: کاربر یک عدد وارد می‌کند. بررسی شود که آیا عدد اول است یا نه. عدد اول عددی است که فقط بر خودش و عدد ۱ بخش‌پذیر باشد.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function isPrime(num) {
if (num <= 1) return false; // اعداد کمتر از ۲ اول نیستند
for (let i = 2; i <= Math.sqrt(num); i++) { // بررسی مقسوم‌علیه‌ها تا ریشه دوم عدد کافی است
if (num % i === 0) return false; // اگر عدد بخش‌پذیر بود، اول نیست
}
return true; // اگر هیچ مقسوم‌علیه‌ای نداشت، عدد اول است
}
// خروجی نمونه:
console.log(isPrime(7)); // true
console.log(isPrime(10)); // false
function isPrime(num) { if (num <= 1) return false; // اعداد کمتر از ۲ اول نیستند for (let i = 2; i <= Math.sqrt(num); i++) { // بررسی مقسوم‌علیه‌ها تا ریشه دوم عدد کافی است if (num % i === 0) return false; // اگر عدد بخش‌پذیر بود، اول نیست } return true; // اگر هیچ مقسوم‌علیه‌ای نداشت، عدد اول است } // خروجی نمونه: console.log(isPrime(7)); // true console.log(isPrime(10)); // false
function isPrime(num) {
  if (num <= 1) return false; // اعداد کمتر از ۲ اول نیستند
  for (let i = 2; i <= Math.sqrt(num); i++) { // بررسی مقسوم‌علیه‌ها تا ریشه دوم عدد کافی است
    if (num % i === 0) return false; // اگر عدد بخش‌پذیر بود، اول نیست
  }
  return true; // اگر هیچ مقسوم‌علیه‌ای نداشت، عدد اول است
}

// خروجی نمونه:
console.log(isPrime(7)); // true
console.log(isPrime(10)); // false

توضیح: این تابع از الگویی استفاده می‌کند که بسیار بهینه است؛ چون به جای بررسی همه اعداد از ۲ تا عدد واردشده، فقط تا جذر آن بررسی می‌شود.

۲. معکوس کردن رشته (Reverse String)

سناریو: یک رشته ورودی گرفته شود و معکوس آن برگردانده شود. این پروژه به درک کار با رشته‌ها کمک می‌کند.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function reverseString(str) {
return str.split('').reverse().join('');
// split => تبدیل رشته به آرایه
// reverse => معکوس کردن آرایه
// join => تبدیل آرایه به رشته
}
// خروجی نمونه:
console.log(reverseString("hello")); // "olleh"
function reverseString(str) { return str.split('').reverse().join(''); // split => تبدیل رشته به آرایه // reverse => معکوس کردن آرایه // join => تبدیل آرایه به رشته } // خروجی نمونه: console.log(reverseString("hello")); // "olleh"
function reverseString(str) {
  return str.split('').reverse().join('');
  // split => تبدیل رشته به آرایه
  // reverse => معکوس کردن آرایه
  // join => تبدیل آرایه به رشته
}

// خروجی نمونه:
console.log(reverseString("hello")); // "olleh"

توضیح: این کد با کمک متدهای داخلی رشته‌ها، معکوس‌سازی را ساده می‌کند. در مصاحبه‌های فنی، این مسئله رایج است.

۳. مرتب‌سازی آرایه (Bubble Sort)

سناریو: آرایه‌ای از اعداد داریم. می‌خواهیم آن را با الگوریتم Bubble Sort به‌صورت صعودی مرتب کنیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function bubbleSort(arr) {
let len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// جابجایی عناصر اگر عنصر فعلی از بعدی بزرگ‌تر باشد
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// خروجی نمونه:
console.log(bubbleSort([5, 2, 9, 1, 5, 6])); // [1, 2, 5, 5, 6, 9]
function bubbleSort(arr) { let len = arr.length; for (let i = 0; i < len - 1; i++) { for (let j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { // جابجایی عناصر اگر عنصر فعلی از بعدی بزرگ‌تر باشد [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } // خروجی نمونه: console.log(bubbleSort([5, 2, 9, 1, 5, 6])); // [1, 2, 5, 5, 6, 9]
function bubbleSort(arr) {
  let len = arr.length;
  for (let i = 0; i < len - 1; i++) {
    for (let j = 0; j < len - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        // جابجایی عناصر اگر عنصر فعلی از بعدی بزرگ‌تر باشد
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

// خروجی نمونه:
console.log(bubbleSort([5, 2, 9, 1, 5, 6])); // [1, 2, 5, 5, 6, 9]

توضیح: در هر دور از حلقه، بزرگ‌ترین عنصر به انتهای آرایه منتقل می‌شود. این روش برای آرایه‌های کوچک مناسب است اما برای آرایه‌های بزرگ کارایی کمتری دارد.

۴. شمارش حروف یک رشته

سناریو: یک رشته از کاربر دریافت شود و تعداد تکرار هر کاراکتر در آن مشخص گردد.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function countCharacters(str) {
const result = {};
for (let char of str) {
if (char !== ' ') {
// اگر فضای خالی نیست، شمارش را افزایش بده
result[char] = (result[char] || 0) + 1;
}
}
return result;
}
// خروجی نمونه:
console.log(countCharacters("hello world"));
// { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }
function countCharacters(str) { const result = {}; for (let char of str) { if (char !== ' ') { // اگر فضای خالی نیست، شمارش را افزایش بده result[char] = (result[char] || 0) + 1; } } return result; } // خروجی نمونه: console.log(countCharacters("hello world")); // { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }
function countCharacters(str) {
  const result = {};
  for (let char of str) {
    if (char !== ' ') {
      // اگر فضای خالی نیست، شمارش را افزایش بده
      result[char] = (result[char] || 0) + 1;
    }
  }
  return result;
}

// خروجی نمونه:
console.log(countCharacters("hello world")); 
// { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }

توضیح: با استفاده از آبجکت، می‌توانیم برای هر حرف یک کلید اختصاص دهیم و شمارش آن را ذخیره کنیم. این تمرین درک خوبی از loops و objects به شما می‌دهد.

۵. فیبوناچی تا n عدد

سناریو: با دادن یک عدد n، n عدد اول دنباله فیبوناچی تولید شود. دنباله‌ای که در آن هر عدد مجموع دو عدد قبل است.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function fibonacci(n) {
const seq = [0, 1]; // شروع دنباله
for (let i = 2; i < n; i++) {
seq.push(seq[i - 1] + seq[i - 2]); // عدد جدید = مجموع دو عدد قبلی
}
return seq.slice(0, n); // برگرداندن فقط n عدد اول
}
// خروجی نمونه:
console.log(fibonacci(7)); // [0, 1, 1, 2, 3, 5, 8]
function fibonacci(n) { const seq = [0, 1]; // شروع دنباله for (let i = 2; i < n; i++) { seq.push(seq[i - 1] + seq[i - 2]); // عدد جدید = مجموع دو عدد قبلی } return seq.slice(0, n); // برگرداندن فقط n عدد اول } // خروجی نمونه: console.log(fibonacci(7)); // [0, 1, 1, 2, 3, 5, 8]
function fibonacci(n) {
  const seq = [0, 1]; // شروع دنباله
  for (let i = 2; i < n; i++) {
    seq.push(seq[i - 1] + seq[i - 2]); // عدد جدید = مجموع دو عدد قبلی
  }
  return seq.slice(0, n); // برگرداندن فقط n عدد اول
}

// خروجی نمونه:
console.log(fibonacci(7)); // [0, 1, 1, 2, 3, 5, 8]

توضیح: این پروژه الگویی تکرارشونده دارد که در بسیاری از مصاحبه‌های برنامه‌نویسی استفاده می‌شود. با حلقه و آرایه می‌توان آن را به‌راحتی پیاده کرد.

۶. بررسی پالیندروم (Palindrome)

سناریو: بررسی کنیم که آیا یک رشته به‌صورت یکسان از ابتدا و انتها خوانده می‌شود یا نه (مثل “madam”).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function isPalindrome(str) {
const clean = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
// حذف فاصله و علائم و تبدیل به حروف کوچک
return clean === clean.split('').reverse().join(''); // مقایسه با نسخه معکوس‌شده
}
// خروجی نمونه:
console.log(isPalindrome("Madam")); // true
console.log(isPalindrome("Hello")); // false
function isPalindrome(str) { const clean = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); // حذف فاصله و علائم و تبدیل به حروف کوچک return clean === clean.split('').reverse().join(''); // مقایسه با نسخه معکوس‌شده } // خروجی نمونه: console.log(isPalindrome("Madam")); // true console.log(isPalindrome("Hello")); // false
function isPalindrome(str) {
  const clean = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
  // حذف فاصله و علائم و تبدیل به حروف کوچک
  return clean === clean.split('').reverse().join(''); // مقایسه با نسخه معکوس‌شده
}

// خروجی نمونه:
console.log(isPalindrome("Madam")); // true
console.log(isPalindrome("Hello")); // false

توضیح: رشته ابتدا تمیز می‌شود تا فقط حروف و اعداد باقی بماند، سپس با نسخه معکوس مقایسه می‌گردد. این نوع مسئله در پروژه‌های واقعی مانند تشخیص کلمات خاص کاربرد دارد.

۷. عدد تکراری در آرایه

سناریو: بررسی شود که آیا آرایه شامل عناصر تکراری هست یا نه.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function hasDuplicate(arr) {
const seen = new Set(); // مجموعه‌ای برای ذخیره مقادیر دیده‌شده
for (let num of arr) {
if (seen.has(num)) return true; // اگر قبلاً دیده شده، تکراری است
seen.add(num); // در غیر این صورت، اضافه کن به مجموعه
}
return false; // اگر هیچ تکراری پیدا نشد
}
// خروجی نمونه:
console.log(hasDuplicate([1, 2, 3, 4])); // false
console.log(hasDuplicate([1, 2, 3, 2])); // true
function hasDuplicate(arr) { const seen = new Set(); // مجموعه‌ای برای ذخیره مقادیر دیده‌شده for (let num of arr) { if (seen.has(num)) return true; // اگر قبلاً دیده شده، تکراری است seen.add(num); // در غیر این صورت، اضافه کن به مجموعه } return false; // اگر هیچ تکراری پیدا نشد } // خروجی نمونه: console.log(hasDuplicate([1, 2, 3, 4])); // false console.log(hasDuplicate([1, 2, 3, 2])); // true
function hasDuplicate(arr) {
  const seen = new Set(); // مجموعه‌ای برای ذخیره مقادیر دیده‌شده
  for (let num of arr) {
    if (seen.has(num)) return true; // اگر قبلاً دیده شده، تکراری است
    seen.add(num); // در غیر این صورت، اضافه کن به مجموعه
  }
  return false; // اگر هیچ تکراری پیدا نشد
}

// خروجی نمونه:
console.log(hasDuplicate([1, 2, 3, 4])); // false
console.log(hasDuplicate([1, 2, 3, 2])); // true

توضیح: ساختار داده Set بسیار سریع است و بررسی وجود مقدار در آن زمان O(1) دارد. این الگوریتم ساده و کاربردی در فیلترهای داده‌ای یا اعتبارسنجی مفید است.

۸. بزرگ‌ترین کلمه در جمله

سناریو: کاربر یک جمله وارد می‌کند و ما باید طولانی‌ترین کلمه موجود در آن را برگردانیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function longestWord(sentence) {
const words = sentence.split(' '); // تبدیل جمله به آرایه‌ای از کلمات
return words.reduce((longest, current) =>
current.length > longest.length ? current : longest
, ''); // پیدا کردن کلمه با بیشترین طول
}
// خروجی نمونه:
console.log(longestWord("JavaScript is a powerful language")); // "JavaScript"
function longestWord(sentence) { const words = sentence.split(' '); // تبدیل جمله به آرایه‌ای از کلمات return words.reduce((longest, current) => current.length > longest.length ? current : longest , ''); // پیدا کردن کلمه با بیشترین طول } // خروجی نمونه: console.log(longestWord("JavaScript is a powerful language")); // "JavaScript"
function longestWord(sentence) {
  const words = sentence.split(' '); // تبدیل جمله به آرایه‌ای از کلمات
  return words.reduce((longest, current) =>
    current.length > longest.length ? current : longest
  , ''); // پیدا کردن کلمه با بیشترین طول
}

// خروجی نمونه:
console.log(longestWord("JavaScript is a powerful language")); // "JavaScript"

توضیح: با استفاده از split و سپس reduce، طولانی‌ترین کلمه انتخاب می‌شود. این تمرین برای درک بهتر آرایه‌ها و توابع سطح بالا مانند reduce بسیار مفید است.

نتیجه‌گیری

این ۸ پروژه‌ی ساده، پایه و اساس الگوریتم‌نویسی با جاوااسکریپت را به خوبی به شما آموزش می‌دهند. تمرین مداوم این نوع سناریوها نه‌تنها شما را با مفاهیم پایه‌ای آشنا می‌کند، بلکه ذهن شما را برای حل مسائل پیچیده‌تر نیز آماده می‌سازد.

بیشتر بخوانید:

معرفی زبان های برنامه نویسی اندروید (مقایسه)
تفاوت برنامه نویسی و کد نویسی چیست؟
Refactoring در برنامه نویسی چیست؟

وحید خاکپور

متولد 76 . مبتدی در همه چیز. علاقه مند به یادگیری و به اشتراک گذاشتن تجربه های مفید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *