همانطور که در مطلب «مسابقهای کوچک با جایزهای کوچک ویژه برنامهنویسان (به مناسبت دهه فجر)» شاهد بودید، یک مسابقه برنامهنویسی به مناسب دهه فجر برگزار کردیم و سؤال آن مسابقه این بود که: برنامهای بنویسید که مشخص کند مجموع آیات چه سورههایی از قران، ۱۰۰ آیه میشود.
خوب، در حالی که من اصلاً انتظار نداشتم، اما چهار نفر توانستند به خوبی از پس این برنامه برآیند و برنامهشان را ارسال کنند:
- آقای سینا قلیپسند: برنامه او اینجاست.
- آقای iman moodi: برنامه او اینجاست.
- آقای سید محمد حسینی نژاد یا همان «مهندس طلبه» خودمان: برنامه او اینجاست.
- آقای فرهاد مرتضیپور: برنامه او را از اینجا دانلود کنید.
سورس برنامهها را میتوانید یکجا از اینجا دانلود کنید.
از همه دوستانی که زحمت کشیدند و شرکت کردند و یا میخواستند شرکت کنند و برنامه سنگین بود و به نتیجه نرسید، بینهایت ممنونیم.
در مورد الگوریتمی که عزیزان به کار گرفتند، سه نفر اول، میشود گفت یک الگوریتم داشتند و آن استفاده از ۳ یا ۴ حلقه تو در تو بود که باعث میشد تا چهار سوره که مجموعاً ۱۰۰ آیه شوند پیدا شود.
اما خوب، احتمالاً میدانید که در این حالت، مرتبه زمانی ما n به توان ۳ یا ۴ میشود. یعنی ۱۱۴ به توان ۳ یا ۴ پردازش لازم است! (۱۱۴ به توان ۴ میشود: 168896016)
میبینید که تعداد عملیات بسیار بالاست و سه برنامه اول نهایتاً توانستند مجموع ۴ سوره را پیدا کنند.
البته نیاز بود بهبودهایی انجام میدادند از جمله اینکه: وقتی مثلاً سوره حمد در حلقه اول انتخاب میشد، در حلقه دوم، سورههایی که از ۹۳ آیه بیشتر دارند، از آرایه حذف شوند. در این حالت پردازشها به تعداد قابل توجهی کاهش مییافت و یا در حلقه سوم، باید «سوره حمد+سوره دوم انتخابی» محاسبه میشد و سورههایی که بیشتر از «۱۰۰ منهای این مجموع» داشتند حذف میشدند و بعد به گردش میافتاد...
اما خوب، بهترین الگوریتم به خوبی توسط آقای مرتضیپور شناسایی شد و آن استفاده از الگوریتم Back Tracking بود. پیشنهاد میکنم حتماً توضیحات خوب و کامل ایشان را در فایل pdfی که ارسال کردهاند بخوانید.
چون آن توضیحات واضح و کامل است، من دیگر توضیح نمیدهم اما به طور خلاصه، این مسأله شبیه به این بود که بگوییم «یک مجموعه از اعداد رندوم داریم. میخواهیم بدانیم چند زیرمجموعه میتوان یافت که مجموع اعضای آن ۱۰۰ شود؟» برای یافتن زیرمجموعههای غیرتکراری یک مجموعه که شرط خاصی داشته باشند، میتوان از الگوریتم Back Tracking استفاده کرد که موارد تکراری و پردازشهای اضافه را بسیار کاهش میدهد.
البته با توجه به اینکه لیست کردن تمام موارد این مسأله، پردازش بسیار بسیار سنگینی را میطلبد، این الگوریتم هم در اواسط کار کم میآورد و ادامه نمیدهد! من تا یک ساعت و ده دقیقه برنامه را در حال اجرا گذاشتم، بعد از یافتن ۳۰۰ هزار(!!!) ترکیب سورههای مختلف، هنگ کرد... (من خودم فکر نمیکردم بتوان حداقل ۳۰۰ هزار حالت از ترکیب سورهها را یافت که جمعشان ۱۰۰ بشود!)
دقت کنید که اگر حالات تکراری را حساب کنیم، این برنامه باید ۱۱۴ به توان ۱۱۴ مقایسه انجام دهد تا پاسخ کامل را حساب کند! (یعنی یک ۳ با ۲۳۴ صفر جلو آن!!)
به هر حال، با اینکه برنامههای همه دوستان جالب و گاهی مبتکرانه بود اما طبیعتاً جایزه مسابقه تعلق میگیرد به آقای فرهاد مرتضیپور
این مسابقه، بهانه خوبی برای آشنا شدن با نابغههای حاضر در آفتابگردان بود. امیدوارم حضورشان باعث پیشرفت روز افزون آفتابگردان و کاربران باشد.
موفق باشید؛
حمید رضا نیرومند