چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

من برای فینال مسابقات قهرمانی جهانی هش کد Google 2017 آماده می شدم. این بزرگترین مسابقه چالش الگوریتمی است که توسط Google برگزار می شود.

از کلاس نهم شروع کردم به یادگیری ++C از صفر. من چیزی در مورد برنامه نویسی، الگوریتم ها و ساختار داده نمی دانستم. در مقطعی، اولین خط کدم را نوشتم. هفت ماه بعد، یک مسابقه برنامه نویسی در افق ظاهر شد. می خواستم بدانم سبک یادگیری برنامه نویسی من چقدر خوب عمل می کند. این فرصت عالی بود.

بعد از دو روز مسابقه نتایج به دست آمد: مدال طلا گرفتم.

من شوکه شدم. من با 5 سال سابقه از رقابت جلو افتادم. می دانستم که سخت کار کردم، اما این موفقیت فراتر از همه انتظاراتم بود. متوجه شدم که برنامه نویسی ورزشی موضوع من است و با تمام وجود وارد آن شدم.

من می دانم چه چیزی باعث موفقیت من شد و می خواهم آن را با شما به اشتراک بگذارم.

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

این مقاله با پشتیبانی نرم افزار EDISON ترجمه شده است که از سلامت برنامه نویسان و صبحانه آنها مراقبت می کندو نرم افزار سفارشی را توسعه می دهد.

کدام زبان برنامه نویسی را انتخاب کنید

  • C++ - به شدت توصیه می شود! او بسیار سریع است. پیاده سازی الگوریتم ها به دلیل STL زمان کمی می برد. C++ در تمامی مسابقات پذیرفته می شود. من اولین خط کدم را در C++ نوشتم.
  • C - C++ را به دلیل STL یاد بگیرید. اگر زبان C را بلد باشید، می توانید به زبان C++ نیز برنامه نویسی کنید.
  • جاوا یک زبان برنامه نویسی کند است. یک کلاس Big Integer دارد، اما کمک زیادی به شما نخواهد کرد. اگر رقابت محدودیت زمانی داشته باشد، با جاوا قطعا از آن فراتر خواهید رفت. جاوا در همه مسابقات پذیرفته نمی شود.

کجا می توانید تمرین کنید

من توصیه می کنم Sphere Online Judge (SPOJ). از نظر کمی و کیفی یک منبع کارآمد است. اگر در فرآیند عیب یابی گیر کرده اید، ویرایشگرها و راه حل ها به صورت آنلاین در دسترس هستند. علاوه بر این سایت، من توصیه می کنم SPOJ Toolkit и طبقه بندی مشکل برای SPOJ.pl.

ابتدا باید دانش خود را در مورد اصول اولیه تقویت کنید

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

شما باید سبک برنامه نویسی خود را پیدا کنید زیرا سبک شماست.

هنگام جستجوی آن، دو اصل اساسی را در نظر داشته باشید:

  • پیاده سازی کد شما باید آسان باشد. شما باید در اجرای راه حلی که به آن دست یافته اید احساس راحتی کنید. چرا؟ زیرا در طول مسابقه، آخرین چیزی که می خواهید این است که در کد خود گم شوید. همیشه بهتر است 5 دقیقه اضافی را صرف فکر کردن به نحوه ساده سازی اجرای کد کنید تا اینکه 10 دقیقه برای کشف آن صرف کنید.
  • کد شما باید به راحتی قابل خواندن باشد. وقتی کد به راحتی خوانده می شود، اشکال زدایی آن آسان است. بیایید با آن روبرو شویم - اشتباهات همیشه اتفاق می افتد. وقتی 10 دقیقه باقی مانده است و نمی توانید اشتباه لعنتی را پیدا کنید، آن احساس را می دانید؟ البته که انجامش میدی. برای جلوگیری از این وضعیت، کد خوانا بنویسید. هنگامی که شروع به اشکال زدایی کنید، کد طبیعی و قابل درک خواهد بود.

در اینجا یک نمونه از من است سبک برنامه نویسی

چگونه مهارت های توسعه خود را بهبود بخشید

تمرین، تمرین و تمرین بیشتر. من توصیه می کنم که روی 250 مشکل قابل حل اول کار کنید SPOJ. آنها را به ترتیب حل کنید. حداقل یک ساعت در مورد راه حل هر یک از آنها فکر کنید.

نگویید این مشکل برای من خیلی سخت است، مشکل بعدی را امتحان خواهم کرد. بازنده ها اینگونه فکر می کنند.

یک تکه کاغذ و یک مداد بردارید. فکر. شاید بتوانید راه حلی پیدا کنید، شاید نه. حداقل، شما تفکر الگوریتمی را توسعه خواهید داد. اگر نمی توانید در عرض یک ساعت راه حلی پیدا کنید، به دنبال راه حل آماده در انجمن یا در مقالات باشید.

با این رویکرد چه چیزی به دست خواهید آورد؟ یاد بگیرید چگونه ایده های خود را با کد به سرعت پیاده سازی کنید. و مسائل و الگوریتم های کلاسیک را یاد بگیرید.

دوم، شما باید بر الگوریتم ها و ساختارهای داده تسلط داشته باشید

یک رویکرد سلسله مراتبی را دنبال کنید. آیا بدون اینکه بتوانید راه بروید شروع به دویدن کردید؟ خیر آیا می توانید یک آسمان خراش بدون پایه محکم بسازید؟ باز هم نه

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

با الگوریتم های اساسی و ساختارهای داده شروع کنید

شروع کار سخت است. شاید به این دلیل که نمی دانید ابتدا چه چیزی را مطالعه کنید. از همین رو من یک دوره ویدیویی "الگوریتم ها و ساختارهای داده" ایجاد کردم. در ایجاد این دوره، من به نحوه تدریس خود تکیه کردم. پاسخ باورنکردنی بود! بیش از 3000 دانش آموز از بیش از 100 کشور در ماه اول برای این دوره ثبت نام کردند.

اگر روی حل مشکلات آسان کار کنید، هرگز بهتر نخواهید شد.

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

هر سومین مشکلی که روی آن کار می کنید باید چیز جدیدی به شما بیاموزد. در انتخاب مشکلات دقت کنید. مشکلات سخت تر را انتخاب کنید!

هنگامی که این 250 مسئله را از SPOJ تکمیل کردید، درک کلی از موضوعات اصلی برنامه نویسی ورزشی خواهید داشت. با درک عمیق منطق پشت الگوریتم های پایه، الگوریتم های سطح بالا چندان پیچیده به نظر نخواهند رسید. بنابراین می توانید از دانش خود حداکثر استفاده را ببرید.

هر یک از موضوعات اصلی را عمیق تر کنید

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

اگر بعد از یادگیری چیزهای جدید، دانش خود را تقویت نکنید، به سرعت همه چیز را فراموش خواهید کرد.
توصیه می کنم پس از یادگیری یک الگوریتم جدید، آن را در عمل پیاده کنید. آن را روی 2-3 کار انجام دهید. به دنبال تگ الگوریتم در SPOJ بگردید. در آنجا مشکلاتی را خواهید یافت که برای آنها این الگوریتم مورد نیاز است. ابتدا با این مسائل برخورد کنید.

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

و این خوب است. زیرا اگر برنامه نویسی پویا را درک کنید، برنده خواهید شد.

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

همانطور که مفاهیم جدید را کشف می کنید، بررسی کنید آموزش TopCoder. آنها بسیار دقیق و قابل درک هستند. به لطف آنها توانستم درک کنم درختان باینری ایندکس شده.

سخت کار کن

آیا تا به حال در مورد ورزشکارانی شنیده اید که بدون سال ها تمرین قهرمان المپیک می شوند؟ من نه.

هر سال مقدمات المپیاد کامپیوتر از شهریور ماه آغاز و در فروردین ماه به پایان می رسید.

در این 8 ماه هر روز 5 ساعت تمرین کردم.

و بله، من این 5 ساعت را صرف حل مسائل الگوریتمی کردم. یاد روزهایی می افتم که 8 و حتی 10 ساعت تمرین می کردم. چرا؟ چون ازش خوشم اومد هر روز که از مدرسه به خانه برمی گشتم، مستقیم به اتاق خواب می رفتم، پشت کامپیوتر می نشستم و شروع می کردم به حل یک مشکل جدید. یا یادگیری الگوریتم جدیدی که برای حل این مشکل باید شناخته می شد.

اگر می خواهید برنده شوید، باید همین کار را انجام دهید. یک مشکل را انتخاب کنید و به آن بچسبید. هنگام راه رفتن در جاده به سوپرمارکت یا هنگام رانندگی به آن فکر کنید.

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

آیا می دانستید که در طول خواب، مغز شما اطلاعات جمع آوری شده در آن روز را یکپارچه می کند؟ به نظر می رسد او کتاب ها را به ترتیب حروف الفبا روی یک قفسه کتاب چیده است. اساساً، مغز شما به مشکلات مختلفی که با آن روبرو هستید فکر می کند.

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

خودت آن را امتحان کن. مثل جادو است.

من یک وبلاگ ایجاد کردم

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

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

با زیرکی کار کن

این راز موفقیت است. شما به اهداف نیاز دارید.

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

چگونه اهمال کاری را شکست دهیم

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

بنابراین، در اینجا نحوه غلبه بر اهمال کاری آمده است. من یک تقویم کاغذی راه اندازی کردم و هر روز را با مشکلاتی که می خواستم حل کنم پر می کردم. من همیشه مشکلات را از قبل، دو روز زودتر پر می کردم. بنابراین می دانستم چگونه در روزهای بعد زمانم را مدیریت کنم.

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم

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

تقویم کاغذی خود را دریافت کنید. لیست کارهای دیگری را در تلفن خود ایجاد نکنید که فردا آن را فراموش کنید.

چگونه به طور موثر اشکال زدایی کنیم

آیا می خواهید حرفه ای شوید؟ اگر بله، پس باید «در ذهن خود اشکال زدایی» کنید.
این تا حد زیادی کارآمدترین تکنیک اشکال زدایی است که من می شناسم زیرا اصلاً به دیباگر نیاز ندارد. مغز شما چندین شاخه از کد را به طور همزمان کاوش می کند و دید بسیار وسیع تری از کد به شما ارائه می دهد دیباگر کلاسیک.

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

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

برای اینکه یاد بگیرید چگونه «در ذهن خود خراب کنید»، باید تمرین کنید. وقتی راه حلی برای مشکلی تأیید می کنید و «پاسخ اشتباه» دریافت می کنید، مستقیماً به سراغ دکمه دیباگر نروید. کد را دوباره بخوانید و فکر کنید: «در این خط چه اتفاقی می‌افتد؟»، «اگر» چگونه بر برنامه در اینجا تأثیر می‌گذارد؟»، «وقتی از حلقه خارج می‌شویم، مقدار تکرارکننده چقدر است؟».

پس خودت فکر کن با گذشت زمان، یاد خواهید گرفت که چگونه در حال حرکت کد بنویسید و آن را اشکال زدایی کنید.

درباره نویسنده

چگونه 3 مدال از 4 مدال طلا را در المپیاد محاسبات کسب کردم
آندری مارگلویو یک برنامه نویس مشتاق با علاقه به کارآفرینی، استارتاپ ها و طبیعت است. می توانید با او تماس بگیرید در لینکدین.

ترجمه: دیانا شرمیوا

منبع: www.habr.com

اضافه کردن نظر