ساخت یک Word Unscrambler با جاوا اسکریپت (قسمت 2)
Summarize this content to 400 words in Persian Lang
در آخرین مقاله خود، من در یک اشکال کوچک گیر کردم. فکر میکردم درستش کردهام، اما خب… بیایید بگوییم یک لحظه “اوپس” داشتم. تنها چیزی که گم شده بود، عملگر منطقی NOT “!” بود. در if شرایطی مانند این:
if (!uniquePermutations.includes(newPermutation)) {
uniquePermutations.push(newPermutation);
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
من آن را اضافه کردم و اکنون به سراغ مشکل بعدی می رویم.
موضوع طول
بعد از ایجاد همه جایگشت ها، متوجه چیز دیگری شدم. کلمه unscrambler فقط به من جایگشت هایی می داد که دقیقاً طول کلمه ورودی بود. بنابراین اگر «wood» را تایپ میکردم، جایگشتهایی مانند «doow» و «odwo» دریافت میکردم، اما هرگز کلمات کوتاهتری مانند «wo» یا «ow» را دریافت نکردم. این چیزی نیست که من می خواستم.
من نیاز داشتم راهی پیدا کنم تا همه ترکیبات ممکن را تولید کنم، نه فقط آنهایی که طول کلمه ورودی دارند.
بنابراین، این چیزی است که من انجام دادم:
function generatePermutations(inputString) {
const uniquePermutations = [];
function generateUniquePermutations(arr, currentIndex, length) {
if (currentIndex === arr.length – 1) {
const newPermutation = arr.slice(0, length).join(“”);
if (!uniquePermutations.includes(newPermutation)) {
uniquePermutations.push(newPermutation);
}
} else {
for (let i = currentIndex; i < arr.length; i++) {
[arr[currentIndex], arr[i]] = [arr[i], arr[currentIndex]];
generateUniquePermutations([…arr], currentIndex + 1, length);
}
}
}
for (let length = 2; length <= inputString.length; length++) {
generateUniquePermutations(inputString.split(“”), 0, length);
}
return uniquePermutations;
}
console.log(generatePermutations(‘wood’));
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
شکستن آن:
من اصلاح کردم generateUniquePermutations تابع برای پذیرش آرگومان طول، که آرایه را برش می دهد و اطمینان حاصل می کند که جایگشت هایی با طول های مختلف ایجاد می کند. من همچنین یک حلقه اضافه کردم که از 2 شروع می شود و تا کل طول کلمه ورودی بالا می رود.
دسته بندی بر اساس طول
وقتی همه جابجاییهای کلمهام را داشتم، فکر میکردم که خیلی بهتر است (و برای چشمها خیلی راحتتر) اگر بتوانم آنها را بر اساس طول کلمه دستهبندی کنم. بنابراین در اینجا نحوه تجزیه آنها آمده است:
function categorizeByLength(combinations) {
const categorized = {};
combinations.forEach(word => {
const length = word.length;
if (!categorized[length]) {
categorized[length] = [];
}
categorized[length].push(word);
});
return categorized;
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این تابع فهرست جایگشتها را میگیرد، آنها را بر اساس طولشان گروهبندی میکند و یک شی را برمیگرداند که در آن هر کلید یک طول کلمه است (2، 3، 4، و غیره)، و هر مقدار آرایهای از کلمات با آن طول است.
نمایش نتایج
در مرحله بعد، من می خواستم این نتایج دسته بندی شده در واقع به خوبی در مرورگر نشان داده شوند. من تابعی نوشتم که به صورت پویا بخش هایی در HTML برای طول هر کلمه ایجاد می کند، سپس همه کلمات را در زیر آن بخش ها فهرست می کند.
function displayResults(categorizedWords) {
const resultsContainer = document.getElementById(‘resultsContainer’);
resultsContainer.innerHTML = ”;
for (const [length, words] of Object.entries(categorizedWords)) {
const section = document.createElement(‘div’);
section.className = ‘result-section’;
const header = document.createElement(‘h2’);
header.textContent = `${length}-Letter Words`;
section.appendChild(header);
const wordList = document.createElement(‘ul’);
words.forEach(word => {
const listItem = document.createElement(‘li’);
listItem.textContent = word;
wordList.appendChild(listItem);
});
section.appendChild(wordList);
resultsContainer.appendChild(section);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این چیزی است که ما داریم
بعدی؟ من باید روی فیلتر کردن کلمات نامعتبر کار کنم. در حال حاضر، همه جور حرف های بیهوده می زنم و فقط کلمات واقعی و معنی دار می خواهم. هنوز هم بچسبید 🙃
در آخرین مقاله خود، من در یک اشکال کوچک گیر کردم. فکر میکردم درستش کردهام، اما خب… بیایید بگوییم یک لحظه “اوپس” داشتم. تنها چیزی که گم شده بود، عملگر منطقی NOT “!” بود. در if
شرایطی مانند این:
if (!uniquePermutations.includes(newPermutation)) {
uniquePermutations.push(newPermutation);
}
من آن را اضافه کردم و اکنون به سراغ مشکل بعدی می رویم.
موضوع طول
بعد از ایجاد همه جایگشت ها، متوجه چیز دیگری شدم. کلمه unscrambler فقط به من جایگشت هایی می داد که دقیقاً طول کلمه ورودی بود. بنابراین اگر «wood» را تایپ میکردم، جایگشتهایی مانند «doow» و «odwo» دریافت میکردم، اما هرگز کلمات کوتاهتری مانند «wo» یا «ow» را دریافت نکردم. این چیزی نیست که من می خواستم.
من نیاز داشتم راهی پیدا کنم تا همه ترکیبات ممکن را تولید کنم، نه فقط آنهایی که طول کلمه ورودی دارند.
بنابراین، این چیزی است که من انجام دادم:
function generatePermutations(inputString) {
const uniquePermutations = [];
function generateUniquePermutations(arr, currentIndex, length) {
if (currentIndex === arr.length - 1) {
const newPermutation = arr.slice(0, length).join("");
if (!uniquePermutations.includes(newPermutation)) {
uniquePermutations.push(newPermutation);
}
} else {
for (let i = currentIndex; i < arr.length; i++) {
[arr[currentIndex], arr[i]] = [arr[i], arr[currentIndex]];
generateUniquePermutations([...arr], currentIndex + 1, length);
}
}
}
for (let length = 2; length <= inputString.length; length++) {
generateUniquePermutations(inputString.split(""), 0, length);
}
return uniquePermutations;
}
console.log(generatePermutations('wood'));
شکستن آن:
من اصلاح کردم generateUniquePermutations
تابع برای پذیرش آرگومان طول، که آرایه را برش می دهد و اطمینان حاصل می کند که جایگشت هایی با طول های مختلف ایجاد می کند. من همچنین یک حلقه اضافه کردم که از 2 شروع می شود و تا کل طول کلمه ورودی بالا می رود.
دسته بندی بر اساس طول
وقتی همه جابجاییهای کلمهام را داشتم، فکر میکردم که خیلی بهتر است (و برای چشمها خیلی راحتتر) اگر بتوانم آنها را بر اساس طول کلمه دستهبندی کنم. بنابراین در اینجا نحوه تجزیه آنها آمده است:
function categorizeByLength(combinations) {
const categorized = {};
combinations.forEach(word => {
const length = word.length;
if (!categorized[length]) {
categorized[length] = [];
}
categorized[length].push(word);
});
return categorized;
}
این تابع فهرست جایگشتها را میگیرد، آنها را بر اساس طولشان گروهبندی میکند و یک شی را برمیگرداند که در آن هر کلید یک طول کلمه است (2، 3، 4، و غیره)، و هر مقدار آرایهای از کلمات با آن طول است.
نمایش نتایج
در مرحله بعد، من می خواستم این نتایج دسته بندی شده در واقع به خوبی در مرورگر نشان داده شوند. من تابعی نوشتم که به صورت پویا بخش هایی در HTML برای طول هر کلمه ایجاد می کند، سپس همه کلمات را در زیر آن بخش ها فهرست می کند.
function displayResults(categorizedWords) {
const resultsContainer = document.getElementById('resultsContainer');
resultsContainer.innerHTML = '';
for (const [length, words] of Object.entries(categorizedWords)) {
const section = document.createElement('div');
section.className = 'result-section';
const header = document.createElement('h2');
header.textContent = `${length}-Letter Words`;
section.appendChild(header);
const wordList = document.createElement('ul');
words.forEach(word => {
const listItem = document.createElement('li');
listItem.textContent = word;
wordList.appendChild(listItem);
});
section.appendChild(wordList);
resultsContainer.appendChild(section);
}
}
این چیزی است که ما داریم
بعدی؟ من باید روی فیلتر کردن کلمات نامعتبر کار کنم. در حال حاضر، همه جور حرف های بیهوده می زنم و فقط کلمات واقعی و معنی دار می خواهم. هنوز هم بچسبید 🙃