حسام حداد

در مورد برنامه نویسی ، الگوریتم نویسی ، نکات ترفند ها

حسام حداد

در مورد برنامه نویسی ، الگوریتم نویسی ، نکات ترفند ها

در این وبلاگ شخصی نکته ها ، راهکار ها و مطالب جدید برنامه نویسی قرار میگیرد.
نویسنده کلیه مطالب شخص حسام حداد میباشد و خواهشمند است حق کپی را رعایت کنید.

آخرین نظرات
  • ۱۸ آبان ۹۵، ۱۲:۵۱ - سامان
    ای ول

چگونه در مسابقات ACM-ICPC موفق نشویم؟

سه شنبه, ۱۰ فروردين ۱۳۹۵، ۰۲:۲۷ ب.ظ
مقدمه
سوال «چگونه کار کنیم تا در مسابقات برنامه نویسی موفق شویم؟» به تعداد افراد شرکت کننده در این مسابقات جواب مختلف دارد ولی تعدادی ضدالگو وجود دارد که همه با مشکل ساز بودن این ضدالگو ها موافق هستند. یک مثال ساده این است که مثلا تشخیص روشهای افزایش ده سال طول عمر، سخت تر از تشخیص روشهای کاهش ده سال طول عمر هست و اگر شما از این ضد الگوها یا کارهای اشتباه دوری کنید میتوان امیدوار بود که در کل نتیجه بهتری بگیرید. بد نیست از کتاب «چگونه در C++ برنامه ننویسیم؟» نام ببرم که در انتخاب عنوان از این کتاب الگو گرفتم.

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

هوشمندانه کار نکنید!
انجام «راحت‌ترین کار» و «سخت‌ترین کار» بدون وجود یک دورنما درست در ذهن به یک اندازه مضر هست. سوالاتی که به سادگی میتوانید حل کنید برای افزایش سرعت کدزنی و کاهش خطا موثر هستند اما ارزش علمی ای برای شما ندارند جمله «مسئله ای را حل کن که نمی‌توانی حل کنی» عبارت معروفی هست. اما انتخاب این مسئله باید هوشمندانه باشد برای مثال شما میتوانید با درک یک مبحث و بررسی کد حل مسائل ساده به یک قدم جلو تر و مسائل پیچیده تر این مبحث بروید که حل نشدنی به نظر می رسند، نه اینکه یک سوال از World Final سال گذشته به صورت تصادفی برداشته و برای حل کردنش تلاش کنید.

در مسابقات منظم شرکت نکنید!
در تمرین ها شما مسائل را انتخاب می کنید اما در مسابقات مسائل شما را انتخاب می کنند این اصلی ترین تفاوت است، همچنین محدود بودن زمان باعث افزایش سرعت و هیجان می شود، ممکن است شما مباحثی را نادیده بگیرید یا به مبحثی بیش از حد بها داده باشید مسابقات به شما کمک میکنند که سرعت عمل بهتری داشته باشید و توازنی بین مباحث ایجاد کنید.
برای مثال فکر کنید در یک مسابقه CodeForces که سوالات دارای سطح بندی است شما ساده ترین سوال که از مبحث «هندسه محاسباتی» است را نتوانید حل کنید چون کاملا با این مبحث ناآشنا هستید ولی سوال سخت تری را حل کنید. در صورتی که کمی کنجکاو باشید این که تعداد بیشتری این مسئله ساده را حل کردند افزایش انگیزه برای یادگیری مبحث و حل سوال هست. سایت هایی مثل Codeforces و CodeChef و TopCoder و HackerRank و... مسابقات زیادی برگزار می کنند مسابقات سالیانه Google Code Jam و Facebook Hackercup را داریم استفاده از Platform های مختلف تنوع خوبی را می تواند ایجاد کند.

وقت برای یادگیری مباحث نگذارید!
برخی مباحث ساده با دیدن یک نمونه کد یاد گرفته می شوند، اما کسی هست که با دیدن یک نمونه کد الگوریتم بیشینه جریان متوجه نحوه کار کرد این الگوریتم شود؟ یا اینکه این الگوریتم را کجا می شود بکار برد؟ برای یادگیری مباحث باید وقت را هوشمندانه بین خواندن درسنامه ها و حل سوال تقسیم کرد و نباید در حالت کلی درسنامه ها را نادیده گرفت.

نقاط ضعفتان را حفظ کنید!
اگر در یک مسابقه شرکت کردید و برای مثال سوالی از روش حریصانه را نتوانستید حل کنید، چه کار می کنید؟ گفتن جواب درست از حجم سادگی بیهوده و تکراری است اما نیاز است که حتما این مسئله را حل کنید و آن مبحث را یاد بگیرید. پس از پایان یک Contest کار شما با آن تمام نشده است. به حل سوالات بعد از مسابقه UpSolving می گویند. اگر نمی‌خواهید برای کل مسائل که حل نکردید UpSolving کنید حداقل برای مسائلی که برای حل آن تلاش کردید اما موفق نشدید UpSolving را انجام دهید.

همیشه اعضای تیم را عوض کنید!
چه در اختیار شما و چه خارج از اختیار شما باشد این کار باعث کم شدن هماهنگی بین اعضا گروه می شود، مخصوصا این که تعویض متناوب اعضای تیم ممکن است باعث نمایان شدن اختلافات بیشتر در سطح علمی اعضای گروه نیز شود.

استراتژی درستی در حین مسابقه نداشته باشید!

یک استراتژی خوب، پیاده کردن چیزی شبیه Pipeline در گروه های سه نفره هست، سوالات به ترتیب بین اعضای گروه بچرخند و به یکجا رسیده و حل شوند یا اگر تیم از اعضای قوی تشکیل شده است ممکن است تقسیم سوالات بین افراد و کارکردن مستقل بچه ها بهتر جواب بدهد، استراتژی حل سوالات را نباید برای تمامی مسائل یکسان در نظر گرفت، برای مثال بجز در موارد خیلی خاص، معمولا نیازی به همکاری برای حل مسائل ساده نیست و بهتر است اعضای دیگر گروه، به خواندن و حل سوالات دیگر بپردازند.
در سوالاتی که نیاز به کد طولانی دارند عمل‌کردن به Pair Programming باعث کاهش Bug و در نتیجه افزایش سرعت حل مسئله می‌شود.

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

نظرات (۱)

  • 🔱  Aryanium  🔱
  • مرسی، واقعا مفید بود

    سعی میکنم بهشون عمل نکنم!
    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی