یه چیز پیشنهاد بدین بذارم اینجا

نوشته های من در مورد برنامه نویسی، غیر از برنامه نویسی و چیز‌های دیگه...

یه چیز پیشنهاد بدین بذارم اینجا

نوشته های من در مورد برنامه نویسی، غیر از برنامه نویسی و چیز‌های دیگه...

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

همیشه آدم‌های زیادی پرسیدن که چطوری توی المپیاد و ACM پیشرفت کنیم؟ چه کتاب‌هایی بخونیم که قوی بشیم؟ این سوال‌ها رو اگه از هر کسی که تو این زمینه مدتی بوده و پیشرفت کرده بپرسید می‌گه: «فقط تمرین کن».

تازه‌کار / اول راه

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

دیده شده بچه‌های المپیادی قبل از این که المپیاد رو شروع می‌کنن می‌افتن دنبال خرید انواع کتاب‌های گرون و نایاب در مورد المپیاد و الکی وقت و پول خودشون رو هدر می‌دن. کتاب خوبه، ولی قدرت حل مسأله برنامه‌نویسی شما رو زیاد نمی‌کنه!

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

برای تمرین یکی از سایت‌های بسیار فعال و مفید codeforces.com هست که هم به المپیادی‌ها و هم به ACMای‌ها پیشنهاد می‌شه.

متوسط / وسط راه

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

  • قدرت حل مسأله؛ میزان مهارتی که در به دست آوردن راه حل درست مساله و طراحی الگوریتمش دارید.
  • مهارت کد زدن؛ میزان دقت، سرعت و مهارتی که در پیاده‌سازی الگوریتم مساله‌هایی که حل کردید دارید.

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

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

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

اگه با همین روش ۲۰۰-۳۰۰ تا سوال حل کنید که براتون در اون لحظه آسون نبوده باشه مطمئن باشید که به طرز غیر قابل مقایسه‌ای پیشرفت می‌کنید.

پیشرفته / این راه پایانی ندارد...

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

  • مهارت حل مساله‌ی ریاضی خودتون رو زیاد کنید؛ اکثر افرادی که توی المپیاد و ACM در سطح دنیا موفق عمل می‌کنن توی المپیاد ریاضی و حل مساله‌های ریاضی هم حرفی برای گفتن داشتن و این توی برنامه‌نویسی هم بهشون کمک کرده. می‌شه گفت داشتن دید ریاضی در حل مسائل برنامه‌نویسی المپیاد و ACM مفیده.
  • یک مجموعه سوال رو انتخاب کنید و حل کنید؛ منظور از حل مجموعه سوال انتخاب کردن تعدادی سوال هست که شامل سوال‌های خیلی سخت هم باشه. برای مثال برای المپیادی‌ها می‌شه حل کل دوره‌های IOI به طور کامل و برای ACMای ها می‌شه حل چند دوره از مسابقه‌های منطقه‌ای ACM روسیه به طور کامل. خوبی حل کردن مجموعه سوال به طور کامل اینه که مجبور می‌شید همه مدل سوال رو حل کنید و توی مبحث‌هایی که حرفه‌ای نیستید هم پیشرفت کنید.
  • سعی کنید سطح مساله‌هایی که حل می‌کنید از سطح مسابقاتی که توش می‌خواید شرکت کنید بالاتر باشه؛ به هر حال خوبه که هدفتون رو بزرگ بگیرید تا به نتایج بهتری برسید.
  • فقط تمرین کنید...

خیلی دوست دارم این پست رو بهتر کنم و نکات بیشتری بهش اضافه کنم. مخصوصن بخش آخرش. پذیرای نظراتتون هستم.

 

پ.ن. پست از چیزی که فکر می‌کردم خیلی طولانی تر شد!

  • شنبه, ۱۳ آبان ۱۳۹۱، ۰۵:۰۴ ب.ظ
  • سید حامد ولی زاده

نظرات  (۱۷)

توصیه ای چیزی واسه کنکوریا ندارین؟! D:
:-اولین نظر :)))
پاسخ:
:)))
  • ابوالفضل اسدی
  • بسی فیض بردیم

    ممنون

    ;)

    پاسخ:
    خواهش می‌کنم :)
  • بنیامین دلشاد
  • خیلی ممنون 
    البته از یه جایی به اونورش فلسفی شد ما نفهمیدیم :-"

    دوباره امید خودمو به دست آوردم :)
    یه سوال  کلاس ادم باهاش زودتر یاد میگیره یا وقتی خودش بخونه ؟

    پاسخ:
    با کلاس فقط سرعت بالا می‌ره. همه‌ی منابع لازم برای یادگیری به اندازه‌ی کافی در دسترس هست که آدم خودش یاد بگیره.
    :)))
    چشم بسته غیب پرسیدی؟

  • امیر گوهرشادی
  • من که حوصله نداشتم بخونمش ولی خیلی خوب نوشتی :)
    خیلی مفید بود ممنون
    سلام خوندن الگوریتم رو از کجا شروع کنم؟؟

    پاسخ:
    سلام :)
    همه‌ی اینایی که dhm‌ گفت خیلی خوبن. CLRS به عنوان کتاب برای شروع یادگیری خوب نیست، کتاب مرجعه. خوبه که کم کم با حل سوال الگوریتم رو یاد بگیری. یعنی با حل سوالای ساده‌ی الگوریتمی و خوندن راه اونایی که نتونستی حل کنی. ویکی‌پدیا هم مرجع فارسی خیلی خوبی واسه الگوریتم‌هاست.
    به نظرم اینجا خوبه http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index
    ولی درسنامه های یوساکو هم خوبن CLRS هم خوبه 
    از من می پرسی میگم همون لینکه ولی از اینا بپرسی میگن CRLS و Creative! :دی
    سلام مثلا واسه حل سوال الگوریتمی سوالای کجا رو حل کنم؟؟
    واسه جواب سواله قبلیم دستتون درد نکنه :دی
    با اجازه از همه 
    @علی
    می تونی تو سایت های زیر از هر مبحثی که می خوای سوال گیر بیاری و بزنی که من خودم اولی رو پیشنهاد می کنم
    codeforces.com
    acm.timus.ru

    سلام
    یه مورد به نظرم جا افتاده .
    "آنالیز سوال" : به نظرم از مهم ترین بخش های تمرین کردنه !!!
    به نظرم وقتی یه سوال رو حل می کنی و کدش رو می زنی ، خوبه که کد چند نفر دیگه رو برای سوال ببینی یا با کسایی که حل کردنش صحبت کنی .
    این جوری چند تا چیز یاد می گیری :
    "کد خوانی" - سرعت debug کردنت زیاد میشه
    "ایده جدید" - شاید سوال ایده ای غیر از ایده خودت داشته باشه ، تو این مورد باید به این فکر کنی که "چه جوری فکر کرده که به این راه حل رسیده ؟" و ...
    "برنامه نویسی" - تکنینک ها و توابعی ممکنه وجود داشته باشه که بلد نباشی ، اونا رو اینجوری یاد می گیری و هیچ وقت یادت نمیره .

    پاسخ:
    ممنونم :)
    به وبلاگ ما سر بزنید

    وبلاگ ما مرتبط با المپیاد کامپیوتر و المپیاد ریاضی هست

    بخش کتابخانه و پرسش خانه با کلی مطالب

    بهترین مرجع کتب الکترونیکی تا آینده ای نزدیک

    بهترین چیزها فقط در وبلاگ انفورماتیک

    informatics.blog.ir
    informatics.blog.ir
    informatics.blog.ir

    informatics.blog.ir
  • محمدصادق دهقان نیری
  • سلام.
    من دوست و شاگرد استاد جهان آرا هستم D:
    می گم آموزش کدینگ نمی ذارید؟
    یا سوالای برنامه نویسی مثل اونایی که تو ی کد فورسز طرح کرده بودین بذارین.
    خیلی خیلی خیلی ممنون.
    پاسخ:
    سلام! :)
    من دوست دارم این کارو بکنم. ولی متأسفانه اصن نمی‌رسم یا حوصله‌ام نمی‌شه...
    حالا سعیمو می‌:کنم :)
    سلام
    روزگارتون خوب و خوش
    آقا شما که این همه مطالب خوب مینویسی تو این زمینه هم خیلی پیشرو این 
    به نوشتن و راهنمایی ادامه بدین 
    دیدن راهنمایی های شما برای acm  ای ها خودش کلی دلگرمیه

    راستش من هنوز نمیدونم ارزش داره که کلی وقت و انرژی بزارم رو مسابقات acm یا نه ؟

    امیدوارم شما بتونید چنتا دلیل قانع کننده بدین ک بشه انگیزه ای برای شروع

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