Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Mən Google HashCode World Championship Finals 2017-ə hazırlaşırdım. Bu, Google tərəfindən təşkil edilən alqoritmik problemlərlə bağlı ən böyük yarışdır.

Doqquzuncu sinifdə C++ dilini sıfırdan öyrənməyə başladım. Proqramlaşdırma, alqoritmlər və ya məlumat strukturları haqqında heç nə bilmirdim. Bir nöqtədə ilk kodumu yazdım. Yeddi ay sonra proqramlaşdırma müsabiqəsi üfüqdə göründü. Proqramlaşdırmanı öyrənmə tərzimin nə qədər yaxşı işlədiyini görmək istəyirdim. Bu mükəmməl fürsət idi.

İki günlük yarışdan sonra nəticələr gəldi: qızıl medal qazandım.

Mən şoka düşdüm. 5 illik təcrübəmlə rəqibləri qabaqlayırdım. Çox çalışdığımı bilirdim, lakin bu nailiyyət bütün gözləntilərimi üstələyib. İdman proqramlarının mənim mövzum olduğunu başa düşdüm və başdan-başa ona daldım.

Məni uğura aparan şeyləri bilirəm və bunu sizinlə bölüşmək istəyirəm.

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Məqalə EDISON Software şirkətinin dəstəyi ilə tərcümə edilmişdir proqramçıların sağlamlığının və səhər yeməyinin qayğısına qalırxüsusi proqram təminatı hazırlayır.

Hansı proqramlaşdırma dilini seçmək lazımdır

  • C++ - Çox tövsiyə edirik! O, çox sürətlidir. STL sayəsində alqoritmlərin həyata keçirilməsi az vaxt tələb edir. C++ bütün müsabiqələrdə qəbul edilir. İlk kodumu C++ dilində yazdım.
  • C - STL sayəsində C++ dilini öyrənin. Əgər C dilini bilirsinizsə, C++ dilində də proqramlaşdıra bilərsiniz.
  • Java yavaş proqramlaşdırma dilidir. Onun Big Integer sinfi var, lakin bu, sizə çox kömək etməyəcək. Müsabiqənin vaxt məhdudiyyəti varsa, Java ilə siz mütləq onu keçəcəksiniz. Java bütün müsabiqələrdə qəbul edilmir.

Harada məşq etmək olar

Mən məsləhət görürəm Sfera Onlayn Hakim (SPOJ). Kəmiyyət və keyfiyyət baxımından effektiv resursdur. Problemlərin həlli prosesində ilişib qalsanız, redaktorlar və həllər onlayn mövcuddur. Bu sayta əlavə olaraq tövsiyə edirəm SPOJ Alətlər dəsti и SPOJ.pl üçün problem təsnifatı.

Birincisi, əsaslar haqqında biliklərinizi təkmilləşdirməlisiniz

Dilin sintaksisinə öyrəşdikdən sonra aradan qaldırmaq üçün bəzi problemlər var. Təcrübə tələb edən sadə problemlərlə başlayın. Bu mərhələdə əsas məsələ proqramlaşdırma tərzinizi müəyyən etməkdir. Bəlkə siz çox boşluqla kod yazmağı xoşlayırsınız, bəlkə də yox. Siz mötərizələri “əgər” ilə eyni sətirə qoyursunuz və ya onları ayrı-ayrı sətirlərə qoyursunuz.

Proqramlaşdırma tərzinizi tapmalısınız, çünki bu SİZİN üslubunuzdur.

Onu axtararkən iki əsas prinsipi xatırlayın:

  • Kodun həyata keçirilməsi asan olmalıdır. Qarşılaşdığınız həlli həyata keçirməkdə özünüzü rahat hiss etməlisiniz. Niyə? Çünki yarış zamanı ən son istədiyiniz kodunuzda itməkdir. Kodun həyata keçirilməsini necə asanlaşdırmaq barədə düşünməyə əlavə 5 dəqiqə sərf etmək, onu anlamağa çalışmaq üçün 10 dəqiqə sərf etməkdənsə, həmişə daha yaxşıdır.
  • Kodunuz asan oxunmalıdır. Kodu oxumaq asan olduqda, onu sazlamaq asandır. Gəlin etiraf edək - səhvlər hər zaman olur. 10 dəqiqə qaldıqda və lənətə gəlmiş səhvi tapa bilmədiyiniz zaman o hissi bilirsinizmi? Əlbəttə ki. Bu vəziyyətin qarşısını almaq üçün oxuna bilən kod yazın. Onu sazlamağa başladıqdan sonra kod təbii görünəcək və asan başa düşüləcək.

Budur mənim bir nümunəm proqramlaşdırma tərzi.

İnkişaf Bacarıqlarınızı Necə Təkmilləşdirə bilərsiniz

Təcrübə, təcrübə və daha çox təcrübə. Ən çox həll edilə bilən ilk 250 problem üzərində işləməyi tövsiyə edirəm SPOJ. Onları ardıcıllıqla həll edin. Onların hər birinin həlli üzərində düşünmək üçün ən azı bir saat vaxt sərf edin.

“Bu problem mənim üçün çox çətindir, növbəti problemi həll etməyə çalışacağam” deməyin. Uduzanlar belə düşünür.

Bir kağız parçası və qələm götürün. Bu barədə düşünün. Bəlkə bir həll tapa bilərsiniz, bəlkə də yox. Ən azı alqoritmik düşüncəni inkişaf etdirəcəksiniz. Bir saat ərzində həll yolu tapa bilmirsinizsə, forumda və ya məqalələrdə hazır həll yolu axtarın.

Bu yanaşma ilə nə əldə edəcəksiniz? Koddan istifadə edərək ideyalarınızı tez həyata keçirməyi öyrənin. Və klassik problemləri və alqoritmləri öyrənin.

İkincisi, alqoritmləri və məlumat strukturlarını mənimsəməlisiniz

İyerarxik bir yanaşma edin. Necə yeriyəcəyinizi bilmədən qaçmağa başladınız? Yox. Möhkəm təməl olmadan bir göydələn tikə bilərsinizmi? Bir də yox.

Öyrənmə yolundakı addımları laqeyd edə bilməzsiniz. Onlara məhəl qoymasanız, bilik boşluqları ilə qalacaqsınız. Zamanla onlar daha da pisləşəcəklər.

Əsas alqoritmlər və məlumat strukturları ilə başlayın

Başlamaq çətindir. Ola bilsin ki, əvvəlcə nəyi öyrənəcəyinizi bilmirsiniz. Buna görə də “Alqoritmlər və məlumat strukturları” video kursu hazırladım.. Bu kursu yaradanda mən onu necə öyrətmək istədiyimi əsas götürdüm. Reaksiya inanılmaz idi! İlk ayda 3000-dən çox ölkədən 100-dən çox tələbə kursa yazılmışdır.

Asan problemlərin həlli üzərində işləsəniz, heç vaxt inkişaf etməyəcəksiniz.

Bilmədiyinizi başa düşməyin ən təsirli yolu onu təcrübədə yaşamaqdır. Mən belə öyrəndim. Çətin bir tapşırığı seçərək əvvəllər heç eşitmədiyim bir çox yeni texnikanı öyrəndim.

Üzərində işlədiyiniz hər üçüncü problem sizə yeni bir şey öyrətməlidir. Problemləri seçərkən daha diqqətli olun. Daha çətin problemləri seçin!

SPOJ-dan bu 250 problemi tamamladıqdan sonra siz idman proqramlaşdırmasının əsas mövzuları haqqında əsas anlayışa sahib olacaqsınız. Əsas alqoritmlərin arxasındakı məntiqin dərindən dərk edilməsi ilə yüksək səviyyəli alqoritmlər daha az mürəkkəb görünəcək. Bu yolla siz biliklərinizdən maksimum yararlana bilərsiniz.

Əsas mövzuların hər birini daha dərindən araşdırın

Budur dəyərli resurs çoxlu məlumatla. Orada hər bir mövzu üçün ən yaxşı 10 alqoritm və məlumat strukturunu tapa bilərsiniz. SPOJ-dan 250 problemdən sonra bu siyahıdan çox şey biləcəksiniz. Ancaq əvvəllər heç eşitmədiyiniz bir çox şeylə də qarşılaşacaqsınız. Beləliklə, bu mövzuları artan ardıcıllıqla öyrənməyə başlayın.

Yeni bir şey öyrəndikdən sonra biliklərinizi gücləndirməsəniz, hər şeyi tez unudacaqsınız.
Tövsiyə edirəm ki, yeni alqoritmi öyrəndikdən sonra ondan praktikada istifadə edin. 2-3 tapşırıq üzərində işləyin. SPOJ-də alqoritm etiketini axtarın. Orada həll etmək üçün bu alqoritm tələb edən problemləri tapa bilərsiniz. Əvvəlcə bu məsələləri həll edin.

Usta Dinamik Proqramlaşdırma, Çünki O, Sizi Qələbəyə Gətirəcək
Təcrübəmə görə, hər yarışda ən azı bir problem olur dinamik proqramlaşdırma. Bir çox insanlar “dinamik proqramlaşdırma” ifadəsini eşidəndə başı ağrıyır, çünki bunu heç başa düşmürlər.

Və bu yaxşıdır. Çünki dinamik proqramlaşdırmanı başa düşürsənsə, o zaman qalib gələcəksən.

Mən dinamik proqramlaşdırmanı xoşlayıram, bu mənim sevimli mövzumdur. Dinamik proqramlaşdırmanın sirri təkcə yerli deyil, qlobal miqyasda optimal seçimlər etməkdir. Problemi daha sadə alt problemlərə ayırmalısınız. Bu alt problemlərin hər birini yalnız bir dəfə həll edin. Sonra həll edilmiş alt problemləri birləşdirən bir həll yaradın. Acgöz alqoritm - dinamik proqramlaşdırmanın əksi. Bu, hər addımda yerli olaraq optimal seçimlər etməyi tələb edir. Yerli olaraq optimal seçim pis qlobal həllə gətirib çıxara bilər.

Yeni anlayışlar öyrənərkən, yoxlayın TopCoder dərsləri. Onlar çox ətraflı və başa düşüləndir. Onların sayəsində başa düşə bildim ikili indeksli ağaclar.

Çox çalış

İllərlə məşq etmədən Olimpiadada qalib gələn idmançılar haqqında heç eşitmisinizmi? Mən yox.

Hər il kompüter olimpiadasına hazırlıq sentyabrda başlayıb, apreldə başa çatırdı.

Bu 8 ay ərzində hər gün 5 saat məşq etdim.

Bəli, mən bu 5 saatı yalnız alqoritmik məsələlərin həllinə sərf etdim. 8, hətta 10 saat məşq etdiyim günləri xatırlayıram. Niyə? Çünki xoşuma gəldi. Hər gün dərsdən evə qayıdanda birbaşa yataq otağına gedirdim, kompüter arxasında oturub yeni problemi təhlil etməyə başlayırdım. Yaxud mən bu problemi həll etmək üçün bilməli olduğum yeni alqoritmi öyrənirdim.

Qazanmaq istəyirsənsə, eyni şeyi etməlisən. Problemi seçin və ona sadiq qalın. Supermarketə gedərkən və ya maşın sürərkən bu barədə düşünün.

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Siz yatdığınız zaman beyninizin həmin gün toplanmış məlumatları defraqmentasiya etdiyini bilirdinizmi? Deyəsən o, kitab rəfinə kitabları əlifba sırası ilə yığır. Əslində beyniniz qarşılaşdığınız müxtəlif problemlər haqqında düşünür.

Bu bacarıqla istifadə edilə bilər. Yatmazdan əvvəl çətin bir problemi oxuyun və onu həll etmək üçün nə lazım olduğunu xatırlayın. Bu mərhələdə həllin özünü axtarmaq lazım deyil. Yatağa get. Beyniniz bu problemi həll etməyə başlayacaq. Yuxudan oyandığınız zaman çarəni yuxuda ikən tapdığınızı anlayanda təəccüblənəcəksiniz.

Özünüz cəhd edin. Bu sehr kimidir.

Video bloq yaratdım

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Bu qısa paraqraf idman proqramlaşdırmasına aid deyil. Əgər iyirmi yaşınız varsa və mənim dünyanı necə gördüyümlə maraqlanırsınızsa, yoxlamaq istəyə bilərsiniz Youtube-da video bloqum. Mən orada dünyadan, həyatdan və kompüter elmlərindən danışıram.

Ağıllı işləyin

Uğurun sirri budur. Məqsədlərə ehtiyacınız var.

Biz insanlarıq və bunu bəyənirik süründürmək. Biz həmişə indi edilməli olan işləri təxirə salmaq istəyirik. Netflix-ə baxmaq həmişə dinamik proqramlaşdırma problemləri ilə məşğul olmaqdan daha xoşdur. Bunu bilirsiniz və bunu düzəltməlisiniz.

Süründürməçiliyi necə məğlub etmək olar

Özünüzə məqsədlər qoyun. Siz həmişə yeni bir şey öyrənə biləcəyiniz maraqlı problemlər tapacaqsınız (yuxarıda qeyd etdiyim resurslara baxın). Amma bu problemləri təkcə oxumaq yox, həll etmək lazımdır.

Beləliklə, süründürməçiliyə necə qalib gəldim. Mən kağız təqvimə başladım və hər günü həll etmək istədiyim problemlərlə doldurdum. Mən həmişə problemləri iki gün əvvəldən doldururdum. Beləliklə, sonrakı günlərdə vaxtımı necə idarə edəcəyimi bilirdim.

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım

Buna görə də həmişə motivasiyalı idim. Təqvimdə növbəti günləri doldurmaq üçün bəzi problemləri həll etməli və yenilərini tapmalı idim. Həll edilmiş problemlərin üstündən keçmək əla hissdir. Bilirəm ki, sənin də xoşuna gəlir.

Öz kağız təqviminizi əldə edin. Telefonunuzda sabah unuda biləcəyiniz başqa işlər siyahısı yaratmayın.

Effektiv şəkildə necə debug etmək olar

Peşəkar olmaq istəyirsiniz? Əgər belədirsə, onda siz onu "ağılınızda ayıklamaq" lazımdır.
Bu, mənim bildiyim ən səmərəli sazlama texnikasıdır, çünki heç bir sazlayıcıya ehtiyac yoxdur. Beyniniz eyni anda birdən çox kod qolunu araşdırır və sizə kodla müqayisədə daha geniş icmal verir klassik sazlayıcı.

Özünüzü şahmat oynayan və 3 gediş irəlidə düşünən qrossmeysterlə müqayisə edə bilərsiniz.

Mən bu texnikanı yalnız ilk müdafiə xəttim kimi istifadə edirəm. Sonra mən real debugger istifadə edirəm.

Başınızda necə debug etməyi öyrənmək üçün məşq etməlisiniz. Problemin həllini təsdiqlədikdə və "səhv cavab" aldıqda, birbaşa sazlayıcı düyməsinə keçməyin. Kodu yenidən oxuyun və düşünün: “Bu sətirdə nə baş verir?”, “Buradakı “əgər” proqrama necə təsir edir?”, “Dövrədən çıxanda iteratorun dəyəri nədir?”

Bu şəkildə özünüz üçün düşünürsünüz. Vaxt keçdikcə kodu yazmağı və onu tez bir zamanda ayırmağı öyrənəcəksiniz.

Müəllif haqqında

Hesablama Olimpiadasında 3 qızıl medaldan 4-nü necə qazandım
Andrey Margeloiu sahibkarlığa, startaplara və açıq havaya marağı olan həvəsli proqramçıdır. Onunla əlaqə saxlaya bilərsiniz LinkedIn-də.

Tərcümə: Diana Sheremyeva

Mənbə: www.habr.com

Добавить комментарий