<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمد سرابی</title><link>https://virgool.ir/feed/@m.sarabi</link><description>تحلیلگر داده و توسعه‌دهنده فرانت</description><language>fa</language><pubDate>2026-11-11 19:38:49</pubDate><image><url>https://files.virgool.ir/upload/users/363408/avatar/IRNBNl.jpg</url><title>محمد سرابی</title><link>https://virgool.ir/@m.sarabi</link></image><item><title>آخرین پست در ویرگول</title><link>https://virgool.ir/@m.sarabi/farewell-virgool-ktbxhltwvoys</link><description>امروز تمام روز رو صرف نوشتن یک آموزش ساخت افکت با استفاده از JavaScript کردم، در آخر موقع انتشار با صفحه زیر مواجه شدم:تنها موردی که داخل پستم بود آدرس ریپازیتوری گیت‌هابم بود که منبع کدها داخلش هست. حتی اون رو هم حذف کردم ولی باز هم تبلیغاتی شناخته شد و باید 300 تومن پرداخت کنم که فقط بتونم پستم رو منتشر کنم. مسخره‌تر از این وجود نداره.آدرس پیشنویس پست: https://virgool.io/@m.sarabi/d/e3pzmbrhvassبرای همه‌تون آرزوی موفقیت می‌کنم. خدانگهدار.</description><category>محمد سرابی</category><author>محمد سرابی</author><pubDate>Thu, 22 Aug 2024 00:54:23 +0330</pubDate></item><item><title>آموزش ساده ساخت ربات تلگرام روی Cloudflare با TypeScript</title><link>https://virgool.ir/codenevis/cloudflare-telegram-bot-eandhf55mgme</link><description>سرویس Cloudflare Workers محیطی قدرتمند به شما میده تا برنامه‌هاتون رو به صورت رایگان اجرا کنید و اون‌ها رو با بقیه به اشتراک بگذارید. توی این آموزش به شما نشون ممیدم که چطور ربات تلگرام خودتون رو به سادگی روی این سرویس اجرا کنید. برای این کار به دانش کلی از زبان JavaScript یا TypeScript نیاز دارید.ساخت یک پروژه‌ی Worker جدید۱. آماده کردن محیط توسعه برنامهقبل از اینکه شروع کنیم باید  wrangler رو نصب کنید. برای اینکار توی cmd دستور زیر رو اجرا کنید:npm install wranglerنکته: اگر نیاز به نصب npm دارید، به سایت nodejs.org برید و Node.js رو نصب کنید.۲. یا استفاده از قالب تلگرام Cloudflare یک پروژه بسازید.برای اینکار، بعد از نصب wrangler به فولدری که می‌خواید پروژه رو ایجاد کنید برید، cmd رو اونجا باز کنید و دستور زیر رو اجرا کنید:npm create cloudflare@latest MY_WORKER_NAMEبه جای MY_WORKER_NAME اسم دلخواهتون رو بنویسید. اگر اولین باره که این دستور رو اجرا می‌کنید، یک پنجره جدید توی مرورگر باز میشه که باید وارد حساب Cloudflare بشید و مراحلی که میگه رو طی کنید تا به سایت Cloudflare و حسابتون متصل بشه.وقتی این پیغام رو نشون داد: What would you like to start with این آدرس رو وارد کنید و اینتر رو بزنید:https://github.com/m-sarabi/cloudflare-telegram-botو بعدش Typescript رو انتخاب کنید.در ادامه ازتون می‌پرسه که آیا میخواید به git وصل بشید و یا پروژه‌تون رو پیاده کنید. در هر دو مورد گزینه No رو بزنید. وقتی پیغام SUCCESS Application created successfully ظاهر شد یعنی پروژه با موفقیت ساخته شده.ساخت یک بات جدید در ربات BotFather۱. حالا به ربات BotFather تو تلگرام برید و با دستور newbot یک ربات جدید بسازید.۲. مراحلی که نشون میده رو طی کنید تا کد API Token رو بهتون بده.۳. حالا به پوشه‌ای که پروژه رو ساختید برید و فایل wrangler.toml رو باز کنید و چند خط زیر رو بهش اضافه کنید:[vars]&#xA;SECRET = &#34;&lt;SECRET&gt;&#34;&#xA;TOKEN = &#34;&lt;API_TOKEN&gt;&#34;به جای &lt;SECRET&gt; یک کد دلخواه بنویسید. این کد برای اطمینان از اینکه درخواست‌ها از جانب شما هست استفاده میشه (مثل رمز عبور) فقط از حروف انگلیسی، اعداد، _ و -  می‌تونید استفاده کنید.به جای &lt;API_TOKEN&gt; کد API که از BotFather گرفتید رو وارد کنید.بعد از این توی فولدر پروژه cmd رو باز کنید و دستور زیر رو اجرا کنید تا کدهایی که بالا وارد کردید به فایل worker-configuration.d.ts اضافه بشن.نوشتن دستورات بات تلگرامحالا به جای جذابش رسیدیم. توی این مقاله یک نمونه ربات خیلی ساده رو پیاده می‌کنید:وقتی کاربری وارد ربات شد و دکمه شروع رو زد یا دستور start رو وارد کرد، ربات یک پیغام با یک دکمه نشون میده. وقتی کاربر دکمه‌ی پیغام رو زد، دکمه حذف میشه و ربات یک پیغام دیگه می‌فرسته.نمایش پیغام در شروع رباتتمام توابعی که برای مدیریت update های ربات وجود دارن داخل پوشه src/telegram/handlers هستن. به این پوشه برید و handleMessage.ts رو طبق کد زیر تغییر بدید:import { tg } from &#39;../lib/methods&#39;;&#xA;&#xA;export async function handleMessage(message: tgTypes.Message) {&#xA;    const messageText = message.text;&#xA;    const chatId = message.chat.id;&#xA;    if (messageText === &#39;/start&#39;) {&#xA;        await tg.sendMessage({&#xA;            text: &#39;به ربات من خوش آمدید. برای شروع قوانین ربات را قبول کنید&#39;,&#xA;            chat_id: chatId,&#xA;            reply_markup: {&#xA;                inline_keyboard: [&#xA;                    [{&#xA;                        text: &#39;قبول می‌کنم&#39;,&#xA;                        callback_data: &#39;accept_rules&#39;&#xA;                    }]&#xA;                ]&#xA;            }&#xA;        });&#xA;    }&#xA;}اینجا بعد از راف دستور start با استفاده از تابع tg.sendMessage یک پیغام با یک دکمه به کاربر می‌فرستیم.نمایش پیغام دوم بعد بعد از فشردن دکمه پیغامبرای نمایش پیغام وقتی کاربر دکمه‌ای که به پیغام وصل هست رو فشار داد، فایل handleCallbackQuery.ts رو مطابق کد زیر تغییر بدید:import { tg } from &#39;../lib/methods&#39;;&#xA;&#xA;export async function handleCallbackQuery(callbackQuery: tgTypes.CallbackQuery) {&#xA;    const data = callbackQuery.data;&#xA;    const messageId = callbackQuery.message?.message_id;&#xA;    const chatId = callbackQuery.message?.chat.id;&#xA;    if (messageId &amp;&amp; chatId) {&#xA;        if (data === &#39;accept_rules&#39;) {&#xA;            await tg.editMessageReplyMarkup({&#xA;                chat_id: chatId,&#xA;                message_id: messageId,&#xA;                reply_markup: undefined&#xA;            });&#xA;            await tg.sendMessage({&#xA;                chat_id: chatId,&#xA;                text: &#39;برای قبول قوانین متشکرم&#39;&#xA;            });&#xA;        }&#xA;    }&#xA;}رجیستر کردن ربات و پیاده سازی روی Cloudflare۱. حالا cmd رو توی پوشه اصلی پروژه باز کنید و دستور زیر رو اجرا کنید:wrangler deploy۲. به داشبورد حساب cloudflare خودتون dash.cloudflare.com برید و از منوی کناری گزینه Workers &amp; Pages رو انتخاب کنید.۳. کنار اسم پروژه‌ای که ساختید Visit رو بزنید. یک صفحه‌ی دیگه توی مرورگر باز میشه.۴. عبارت زیر رو به آخر آدرس اضافه کنید و دکه اینتر رو بزنید:/registerWebhookاگر پیغام Webhook registered نمایش داده شد یعنی موفقیت‌آمیز بوده.حالا می‌تونید به رباتی که ساختید برید و دکمه Start یا دستور start/ رو وارد کنید تا ربا پیغامی که ساختیم رو بفرسته.تبریک. شما با موفقیت ربات خودتون رو با استفاده از ابزار قدرتمند Cloudflare و قالب Telegram ساختید. حالا می‌تونید رباتتون رو گسترش بدید.اگر این مطلب مفید بود لطفا به آدرس GitHub قالب تلگرام برید و یک ستاره بهش بدید.از اینکه این مطلب رو تا آخر خوندید سپاسگذارم.</description><category>محمد سرابی</category><author>محمد سرابی</author><pubDate>Mon, 19 Aug 2024 23:29:30 +0330</pubDate></item><item><title>یادگیری زبان جدید، مواجهه و نیاز</title><link>https://virgool.ir/@m.sarabi/how-to-learn-a-new-language-offnqykhdxzr</link><description>همه این رو می‌دونن که یاد گرفتن یه زبان جدید پشتکار زیادی می‌خواد، ولی می‌دونید چی باعث میشه که کسی وقت و انرژیش رو برای این کار بذاره؟ آیا دلیلش اینه که چقدر برای کار یا درس براتون مهمه؟ یا اینکه چقدر این زبون حدید رو دوست دارید؟ شاید هم دلیلش حس رقابتی باشه که واسه خودتون ساختید. حقیقت اینه که دلیلش همه‌ی این موارده. دو اصل اساسی برای یاد گرفتن زبان (و البته میشه گفت یادگیری در کل) یکی در معرض قرار گرفتن یا مواجه شدنه و دیگری احساس نیاز. چه نوزادی باشه که می‌خواد اولین کلماتش رو یاد بگیره و چه  آدم بالغی که زبان دوم یا سوم می‌خواد یاد بگیره، مغز انسان اینطوری طراحی شده که اجزای سازنده‌ی زبان  رو ذخیره و دسته‌بندی کرده و از اونا استفاده کنه. تنها چیزی که برای این کار نیاز داره اینه که به مقدار زیادی در معرض این زبان قرار بگیره (مواجهه) و دلیلی برای فهم و استفاده ازش می‌خواد.حالا چطور میشه این دو عامل رو برای یادگیری زبان جدید تامین کرد؟اول بیاید این دو مورد رو تعریف کنیم و ببینیم چطور در یادگیری زبان تاثیر دارند:در معرض قرار گرفتن: تمام راه‌هایی که می‌تونه با زبان جدید درگیرتون کنه و باهاش در ارتباط باشین. کارهایی مثل گوش دادن به یه مکالمه معمولی، گوش کردن به موسیقی، خوندن اخبار و نوشته‌های مختلف و البته چیزهایی مثل درس و کلاس زبان و یا درس‌های توی نرم‌افزارهای آموزش زبان.در معرض زبان جدید بودن با مکالمه و یادگیری گروهیاحساس نیاز: دلیلی که برای یادگیری زبان دارین. هرچیزی مثل گذروندن تست و آزمون، اشتیاق به دیدن یه فیلم یا خوندن کتاب با زبون اصلی، صحبت کردن با یه فرد خارجی، و یا حتی رتبه اول شدن تو یه مسابقه یا لیدربرد زبان!ایجاد دلیل و انگیزه برای یادگیری. لذت اینکه نفر اول باشیجالبه بدونید که مواجهه و نیاز وقتی خیلی قدرتمند هستن که با هم باشند. حتی اگه کاملا در معرض یادگیری زبان جدید هستید، تا وقتی احساس نیاز نکنید پیشرفت خاصی نمی‌کنید. توی کانادا محله‌های فارس نشین هستن که بعضی از سکنه‌شون اصلا انگلیسی بلد نیستن حرف بزنن چون با اینکه در معرضش هستن، محیط اطرافشون رو طوری درست کردن که دیگه احساس نیاز نمی‌کنن. و از طرف دیگه اگه نیاز باشه ولی در مواجهه باهاش نباشید هم پیشرفتی نمی‌کنید.پس برای یادگیری زبان چه باید کرد؟سعی کنید با ایجاد شرایط مناسب در معرض یادگیری زبان قرار بگیرید. با مقدمات شروع کنید. از الفبا و نحوه نوشتن شروع کرده و با یاد گرفتن کلمه‌ها و جمله‌های ساده ولی کاربردی ادامه بدید و کم کم به چیزای پیشرفته‌تر برسید.همزمان سعی کنید با افرادی که مایل به یادگیری یا آموزش هستن ارتباط داشته باشید و اونچه که یاد گرفتید رو در عمل استفاده کنید. کتاب‌های ساده و حتی بچگونه خیلی خوب هستن چون ارتباط برقرار کردن باهاشون آسون‌تره. خلاصه هرکاری می‌تونید بکنید که اون زبان رو وارد زندگی روزمره‌تون کنید.از طرف دیگه با رفتن به کلاس‌های آموزشی و رقابت با بقیه خودتون رو تشویق کنید و این رقابت رو تبدیل به دلیلی برای ادامه دادن یادگیری‌تون بکنید. بعضی نرم‌افزار‌های آموزش زبان که به صورت آنلاین این حس رقابت رو به وجود میارن قطعا می‌تونن این احساس نیاز رو براتون به وجود بیارن که بخواید در رتبه اول باشید یا بالاترین امتیاز رو کسب کنید.یادتون باشه که تا جایی که می‌تونید خودتون رو در مواجهه با زبان جدید بذارید. این کار رو می‌تونید با تماشا کردن سریال یا شرکت کردن تو یه میتینگ آموزشی آنلاین انجام بدید، رمان‌ مورد علاقه‌تون رو به زبون اصلیش بخونید و یا هر روش دیگه‌ای که خودتون دوست دارید. و مهم نیست بعضی از قسمت‌هاش رو متوجه نمی‌شید، مهم اینه که شرایط رو مهیا کنید و با این کار به مرور با زبون جدید احساس آشنایی پیدا می‌کنید.مواظب باشید که یادگیری همیشه استرس و ناراحتی همراه داره، ممکنه استرس داشته باشید که قسمتی رو متوجه نشید و باعث دلسردی بشه. ولی به جای این کار به قسمت‌های جذابش بپردازید و آموزش رو تبدیل به بازی و قسمتی از زندگی‌تون بکنید. لازم نیست که حتما کاملا همه‌چی رو متوجه بشید، مهم اینه که ازش لذت ببرید و قدم به قدم پیشرفت می‌کنید.یکی از بهترین اپلکیشن‌های آموزش زبان قطعا Duolingo هستش که شاید بشه گفت تمام این موارد رو برای شما فراهم می‌کنه. هم شما رو به صورت کامل در معرض یادگیری زبان جدید قرار میده و هم با ایجاد حس رقابت انگیزه‌تون رو برای یادگیری بیشتر می‌کنه. بعلاوه همیشه جلسه‌های آموزش زبان های مختلف آنلاین هم داره که بیشتر بتونید تو دنیای واقعی با زبان جدید در ارتباط باشید. متاسفانه این برنامه هنوز زبان فارسی نداره، ولی اگر یه زبون دیگه مثل انگلیسی رو در حد خوبی بلد هستید می‌تونید برای زبون سوم ازش استفاده کنید. و درخواست بدید که زبان فارسی هم اضافه بشه!امیدوارم از این مطلب استفاده کرده باشید. لطفا نظراتتون رو پایین بنویسید، و اینکه این مطلب چطوری تونسته به شما کمک بکنه.برای همه‌تون آرزوی موفقیت دارم</description><category>محمد سرابی</category><author>محمد سرابی</author><pubDate>Sat, 16 Apr 2022 12:12:43 +0430</pubDate></item><item><title>حل پازل Nonogram با Python</title><link>https://virgool.ir/coderlife/python-nonogram-solver-l98hvluza5o2</link><description>آشنایی با پازل Nonogramنونوگرام یه پازل جدولیه که مثل خیلی از پازل‌های این مدلی اصلش به ژاپن بر‌می‌گرده. حلش به این شکله که کنار هر سطر و ستون اعدادی نوشته شده که نشون میدن چه تعداد خونه از جدول و به چه ترتیبی باید پر بشه. بعد از اینکه جدول کامل پر شد تصویری به دست میاد که جواب پازلمونه.نمونه نونوگرام حل شده - لوگوی سایت ویرگولحل کردن این پازل خیلی لذت بخشه که گاهی میتونه خیلی چالش‌برانگیز هم بشه. من یه مدت مدام در حال حل کردن نونوگرام بودم تا اینکه تصمیم گرفتم با استفاده از پایتون برنامه‌ای بسازم که خودش پازل رو برام حل کنه (البته الآن دارم معتاد کدنویسی میشم?). کد کامل برنامه رو میتونید تو این لینک گیت‌هاب ببینید. اینجا سعی می‌کنم تا حدی روش‌های حل و قسمت‌هایی از کد رو براتون توضیح بدم.مثل سودوکو تکنیک‌های مختلفی هم برای حل پازل Nonogram استفاده میشه. ساده‌ترین تکنیک اینه که تو یه سطر یا ستون خونه‌های مربوط به یه عدد رو پیدا کنیم که به هر شکل منطقی اون سطر رو پر کنیم اون خونه ها باید سیاه بشن.ساده‌ترین تکنیک حل نونوگرامواسه مثال، تو عکس بالا می‌تونید ببینید که ما به هر شکلی اگه بخوایم این سطر رو پر بکنیم، باید 6 خونه‌ی وسط پر بشن. فعلا این تنها تکنیک منطقیه که تو برنامه‌م استفاده کردم و به مرور زمان بقیه‌ی روش‌ها رو هم اضافه می‌کنم. برای دیدن بقیه روش‌های منطقی به این لینک از ویکی‌پدیا برید.تو برنامه ای که نوشتم برای حل سودوکو از این تکنیک ساده استفاده کردم تا جایی که دیگه نشه خونه‌ی جدیدی رو پر کرد. بعد از اون اومدم و به روش بازگشتی (Backtracking) جواب پازل رو به دست آوردم. برای آشنایی با روش بازگشتی می‌تونید این مطلب رو که در مورد الگوریتم Backtracking نوشتم بخونید.حل Nonogram در پایتونخب حالا که با پازل و نحوه‌ی حلش آشنا شدیم و می‌رسیم به قسمت کدنویسیکد زیر قسمتی از برنامه‌ست که با روش ساده‌ی منطقی که بالا توضیح دادم میاد و خونه‌هایی رو پیدا می‌کنه که باید پر بشه (مقادیر 1).Github code&#xA;&#xA;def overlap_row(tab):&#xA;    for i in range(rows):&#xA;        diff = cols - (sum(row_con[i]) + len(row_con[i]) - 1)&#xA;        n = 0&#xA;        for j in row_con[i]:&#xA;            for k in range(j):&#xA;                if k == (j - 1) and j &gt; diff:&#xA;                    for m in range(j - diff):&#xA;                        tab[i][n - m] = 1&#xA;                n += 1&#xA;            n += 1&#xA;&#xA;        row_sum = 0&#xA;        for j in tab[i]:&#xA;            if j == 1:&#xA;                row_sum += 1&#xA;&#xA;        if row_sum == sum(row_con[i]):&#xA;            for j in range(cols):&#xA;                if tab[i][j] == -1:&#xA;                    tab[i][j] = 0برای این کار اومدم و تعداد خونه‌هایی که باید پر بشن بعلاوه حداقل فضای خالی بینشون رو به دست آوردم و مقدارش رو از طول سطرم کم کردم (diff) و با یه سری جمع و تفریق خونه‌هایی که باید سیاه بشن رو پیدا کردم (تقریبا همون تکنیک ساده‌ای که بالا توضیح دادم). قسمت بعدی هم اومدم و چک کردم اگه سطرمون کامل شده بقیه‌ی خونه‌ها رو سفید کنه.همین کار رو برای ستون‌ها هم تکرار کردم و وقتی خونه‌ی دیگه‌ای با این روش پر نشد از الگوریتم Backtracking برای حل کامل جدول استفاده کردم.یه نکته‌ای رو باید اضافه کنم که با استفاده از روش بازگشتی اولین جوابی که پیدا کردم رو ارایه دادم و دنبال جواب‌های دیگه نگشتم. همین باعث شده که اگه پازلی چند جواب مختلف داشته باشه، فقط یکی از اونا رو پیدا می‌کنه.def backtrack(tab):&#xA;    cell = empty_cell(tab)&#xA;    if not cell:&#xA;        return True&#xA;    for i in [1, 0]:&#xA;        tab[cell[0]][cell[1]] = i&#xA;        if Verify(cell, tab, i):&#xA;            if backtrack(tab):&#xA;                return True&#xA;        if i == 0:&#xA;            tab[cell[0]][cell[1]] = -1&#xA;    return Falseدر کد بالا اولین خونه‌ی خالی جدول رو پیدا می‌کنیم، اگر خونه‌ی خالی وجود نداشت یعنی پازل حل شده. بعد از اون میایم و خونه‌ها رو سیاه یا سفید می‌کنیم و هربار چک می‌کنیم که با قیدهای مساله همخوانی داشته باشه (Verify). قیدهای مساله رو به این شکل تعریف کرده‌م:تعداد گروه های سیاه شده نباید از تعداد عددهای اون ردیف بیشتر باشهاگر خونه‌ای رو سیاه کردم، نباید تعداد خونه‌های پر شده از مجموع اعداد اون ردیف بیشتر بشهاگر خونه‌ای رو سیاه کردم، نباید طول گروه خط از عدد مربوط بهش بیشتر بشهاگر خونه‌ای رو سفید کردم، نباید طول گروه خط از عدد مربوط بهش کمتر بشهاگر به آخر اون سطر یا ستون رسیدیم، باید طول و تعداد گروه‌ها برابر باشه با عددهای مربوط به اون ردیفاگه خونه‌ای که سیاه کردیم با همه‌ی قیدها همخوانی داشت، میریم به خونه‌ی بعد در غیر این صورت باید سفید بشه، و اگه هیچکدوم حواب نداد، به خونه‌ای که از قبل پر کردیم بر‌می‌گردیم و اون رو اصلاح می‌کنیم.در نهایت با استفاده از tkinter برنامه رو به صورت گرافیکی در آوردم:محیط گرافیکی برنامهدوست خوبم z9776m@ با روشی مشابه حل سودوکو های 4x4, 9x9, 16x16 رو تو پایتون نوشته که حتما وقت بگذارید و بخونید.از اینکه وقت گذاشتید و این مطلب رو تا آخر خوندید سپاس‌گذارم. لطفا با لایک❤️ و کامنت? هاتون بهم انرژی بدید تا مطالب بیشتر و با کیفیت‌تری بذارم. امیدوارم که از این مطلب لذت برده باشید.</description><category>محمد سرابی</category><author>محمد سرابی</author><pubDate>Tue, 24 Nov 2020 13:52:13 +0330</pubDate></item><item><title>الگوریتم Backtracking (بازگشت به عقب)</title><link>https://virgool.ir/@m.sarabi/backtrack-bxqzbzsdhnnu</link><description>سلام دوستان. اینجا من می‌خوام تجربه‌های خودم رو از برنامه نویسی باهاتون به اشتراک بزارم.اخیرا یه پروژه با استفاده از بک ترک انجام دادم که توی این مقاله بک ترک رو توضیح می‌دم و توی مقاله‌های بعدی راجب پروژه صحبت می‌کنیم.الگوریتم Backtrack (پس‌گرد-بازگشت به عقب)، یک الگوریتم حل مساله است به این صورت که تمام راه حل‌های ممکن رو آزمایش می‌کنه و هرکجا راه حل مناسب نبود (با قید‌های مساله هم‌خوانی نداشت) به عقب بر‌میگرده و خودش را اصلاح و راه جدیدی را امتحان می‌کنه. (بر خلاف ‌Brute Force که تمام راه ها رو آزمایش کرده و بعد جواب رو بین اونا پیدا می‌کنیم)معمولا تو مسائلی از این الگوریتم استفاده می‌شه که یا دنبال اولین جواب احتمالی می‌گردیم (یک جواب برای مساله پیدا می‌کنه) و یا دنبال تمام جواب‌های ممکن برای مساله هستیم (با پیدا کردن یک جواب،اون رو به لیست جواب‌ها اضافه کرده و مسیرهای دیگه رو هم برای جواب‌های دیگه طی می‌کنیم)مثال اول: به عنوان مثال این سودوکوی 4 در 4 رو در نظر بگیرید:در هر خونه از این جدول اعداد 1 تا 4 می‌تونن قرار بگیرن به طوری که (قید های مساله):در هر سطر نباید عدد تکراری وجود داشته باشهدر هر ستون نباید عدد تکراری وجود داشته باشهدر مربع‌های کوچک 2 در 2 نباید عدد تکراری وجود داشته باشهبرای پیدا کردن جواب این مساله به ترتیب زیر عمل می‌کنیم:در هر خونه اعداد 1 تا 4 رو قرار می‌دیماگه عدد وارد شده در سطر، ستون و یا مربع 2 در 2 وجود داشت، اون رو پاک کرده و عدد بعدی رو قرار می‌دیم، در غیر این صورت به خونه بعدی میریم.اگه تمام اعداد رو برای یک خونه امتحان کردیم و هیچ‌کدوم مناسب اون خونه نبودن، به خونه‌ی قبل بر‌می‌گردیم.مساله وقتی حل شده که عدد مناسب رو برای خونه آخر پیدا کنیم، و وقتی جواب نداره که هیچ عدد مناسبی برای خونه اول پیدا نشه.مراحل حل سودوکو به روش بک ترک مثال بالا برای زمانی بود که فقط یکی از جواب‌های مساله برای ما مهمه.حالا یه مساله دیگه رو بررسی میکنیم که تموم جواب‌های ممکن رو لازم داریم:مثال دوم: احمد و اصغر و اکبر (اسم بهتر نبود آخه!?) با هم رفیق هستن. اصغر و اکبر بخاطر یه مساله ای که بینشون پیش اومده باهم صحبت نمی‌کنن. احمد بی خبر از این ماجرا برای هر سه تاشون بلیط سینما گرفته. اکبر و اصغر هم چون نمی‌خوان دل احمد رو بشکنن باهاش به سینما میان? ولی دوست ندارن کنار هم بشینن.میخوایم تعداد حالت‌هایی که امکان داره اکبر و اصغر کنار هم نشینند رو بررسی کنیم:قید مساله اینه که اکبر و اصغر کنار هم نباشن. در هر مسیر حل، یکی از اونا روی صندلی اول میشینه و نفر بعدی کنار اون. اگر دو نفر کنار هم نشستن چک می کنیم ببینیم این دو نفر اکبر و اصغر هستند یا نه. اگه هستند راه مناسب با قید مساله نیست، پس بر‌می‌گردیم (Backtrack) و مسیر دیگه‌ای رو می‌ریم. اگر هر سه نفر کنار هم نشستن و قید مساله صحیح بود، این مسیر رو به جواب‌های مساله اضافه می‌کنیم و مسیر‌های دیگه رو برای پیدا کردن جواب‌های دیگه می‌ریم.الگوریتم Backtrack برای مساله‌ی سه دوستتو این gif می‌تونید ببینید که چطور با استفاده از روش بازگشتی این مساله حل شده و هر جا مسیر با قیدهای مساله نخونده اون مسیر رو کنار گذاشتیم و مسیر تازه‌ای رو پیش گرفتیم.این مقاله، تمرینات و پروژه‌ها رو به همراه دوستم z9776m انجام می‌دیم که بدون کمکش انجام دادن اینا غیر ممکن بود. در پروژه‌ی بعدی می‌خوایم یکی از پازل‌های Sudoku و یا Nonogram رو با روش بک‌ترک حل کنیم.لطفا لایک ❤️ و کامنت یادتون نره و حتما صفحه ایشون رو هم دنبال کنید چون احتمالا پروژه بعدی (که با زبون پایتون نوشته شده) رو اونجا می‌بینید.</description><category>محمد سرابی</category><author>محمد سرابی</author><pubDate>Tue, 10 Nov 2020 18:02:48 +0330</pubDate></item></channel></rss>