شرق کشور، دانشگاه حکیم سبزواری

منابع خوب برای مسابقات برنامه نویسی الگوریتمی

در این پست ما قصد ارائه چند منبع خوب برای این تایپ از مسابقات داریم.

 

به طور کلی، مباحث دروس مبانی برنامه نویسی، برنامه نویسی پیشرفته، ساختمان داده، ریاضیات گسسته و طراحی الگوریتم (که مهم‌ترین درس است) در ساخت مسائل بکار گرفته شده اند. اما برخی از سوالات شاید نیاز به کمی دانش ریاضی همانند آمار و احتمال یا هندسه هم داشته باشند. اگر به نظرتان در دانشگاه به خوبی به این مباحث پرداخته نمی‌شود میتوانید از سایت‌های همچون مکتبخونه، کوئرا، فرادرس یا کنکور کامپیوتر هم به مطالعه بپردازید.

 

همینطور یکی از بهترین کارهایی که میتوانید در جهت موفقیت در مسابقات برنامه نویسی انجام دهید شرکت در مسابقاتی مثل همین مسابقه است. بهتر است یک تیم درست کنید و اعضایی پایبند به تیم باشید. موازین تعیین کنید و کد بزنید. همینطور می‌توانید در سایت المپدیا دانش الگوریتم خود را تقویت کنید.

 

در اینجا ما به معرفی چند کتاب خوب پرداختیم تا با مطالعه آن‌ها (شاید نه برای مسابقه فردا) ایده‌های خوبی برای حل سوالات به ذهنتان خطور کند:

رحمت انصاری

اصلاحیه قوانین مسابقه

کمیته راهبری مسابقه برنامه نویسی دانشگاه حکیم سبزواری با همفکری هم و در جهت ایجاد عدالت بیشتر در مسابقه و حفظ حقوق شرکت‌کنندگان رویداد اقدام به اصلاح قانون زیر کرده است:

 

استفاده از هرگونه دستیار هوش مصنوعی (مانند chat gpt و google bard و ...) غیر مجاز است و تنها صفحه مجاز در مرورگر صفحه ایمیل برای ارتباط با تیم داوری و ارسال پاسخ خواهد بود. هر گونه تخطی از این قانون باعث ثبت تخلف برای تیم متخلف و حذف تیم از مسابقه خواهد شد.

 

با تشکر

تیم راهبری مسابقه برنامه نویسی

دانشگاه حکیم سبزواری

رحمت انصاری

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

سوال «چگونه کار کنیم تا در مسابقات برنامه نویسی موفق شویم؟» به تعداد افراد شرکت کننده در این مسابقات جواب مختلف دارد ولی تعدادی ضدالگو وجود دارد که همه با مشکل ساز بودن این ضدالگو ها موافق هستند. یک مثال ساده این است که مثلا تشخیص روشهای افزایش ده سال طول عمر، سخت تر از تشخیص روشهای کاهش ده سال طول عمر هست و اگر شما از این ضد الگوها یا کارهای اشتباه دوری کنید میتوان امیدوار بود که در کل نتیجه بهتری بگیرید. بد نیست از کتاب «چگونه در C++ برنامه ننویسیم؟» نام ببرم که در انتخاب عنوان از این کتاب الگو گرفتم.

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

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

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

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

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

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

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

منبع: حسام حداد - دانشجوی کارشناسی ارشد هوش مصنوعی دانشگاه تهران

رحمت انصاری

پیش گفتار

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

امروزه علی‌رقم خرده‌هایی که از دانشگاه به عنوان سیستمی سنتی و عقب‌مانده می‌گیرند اما هنوز به عنوان قلبی تپنده برای جامعه می‌تپد. دانشگاه‌ها نقشی حیاتی در ترسیم آینده فناوری و توسعه مهندسان و برنامه نویسان حرفه‌ای ایفا می‌کند. به همین علت بسیاری از مسابقات برنامه‌نویسی توسط دانشگاه‌ها میزبانی می‌شوند.

مسابقات بین‌المللی برنامه‌نویسی دانش‌جویی (International Collegiate Programming Contest) یا به اختصار ICPC همه ساله به عنوان یکی از مهم‌ترین و معتبرترین مسابقات برنامه‌نویسی در سطج جهان برگزار می‌گردد. این مسابقات تا سال ۲۰۱۸ از سوی انجمن ماشین‌های محاسباتی (ACM) و با پشتیبانی شرکت‌های بزرگی چون IBM برگزار می‌شد و با نام ACM-ICPC خوانده می‌شد. این مسابقات در ایران به اختصار به مسابقات ACM معروف است.

این مسابقه به صورت لایه‌ای اجرا می‌شود. یعنی ابتدا منطقه‌ای و سپس جهانی. در سال ۲۰۱۸، مسابقه icpc بین ۵۲ هزار و ۷۰۹ دانشجو از ۳ هزار و ۲۳۳ دانشگاه در ۱۱۰ کشور جهان برگزار شد. مسابقات منطقه‌ای غرب آسیا از سال ۱۳۷۸ تا کنون (البته به جز سال ۱۳۹۰) در دانشگاه صنعتی شریف برگزار شده است. مسئولیت این مسابقات هم از آن زمان تا الان بر عهده دکتر محمد قدسی بوده است. سال ۱۳۹۰ به علت حضور دکتر قدسی در فرصت مطالعاتی این مسابقه به میزبانی دانشگاه تهران و با مسئولیت دکتر رامتین خسروی برگزار گردید.

در چنین مسابقاتی علاوه بر تسلط بر یکی از زبان‌های برنامه‌نویسی سی، سی پلاس‌پلاس، جاوا یا پایتون (البته تضمین نمی‌شود تمام سؤال‌ها به وسیله پایتون قابل حل باشند) مباحثی نظیر طراحی الگوریتم و ساختمان داده‌ها بسیار تأثیرگذار هستند.

دانشگاه ما هم سهمیه حضور یک تیم را در این مسابقات (مسابقه منطقه‌ای غرب آسیا) دارد. البته در سالیان پیش تنها یکبار و در سال 2018 تیمی تحت عنوان تیم acm دانشگاه حکیم سبزواری تشکیل شد. اعضای این تیم را آقایان رئوف باغجری، علیرضا ناصری، ابولفضل طبسی، حسین جهانشاهی نوکنده و خانم‌ها حنانه سعادت، فائزه روئین فرد و محمدی (دانشجویان رشته کامپیوتر دانشگاه حکیم سبزواری) تشکیل داده بودند و سرپرستی این تیم نیز بر عهده خانم دکتر ملک زاده، استاد یار سابق (هم اکنون دانشیار) گروه مهندسی کامپیوتر بود. در آن زمان پروفسور حدادنیا زمامدار ریاست دانشگاه حکیم سبزواری بود.

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

۱ نظر
رحمت انصاری