Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Я рыхтаваўся да Фіналу чэмпіянату свету Google HashCode 2017. Гэта найбуйны конкурс з алгарытмічнымі задачамі, арганізаваны Google.

Я пачаў вывучаць C++ з нуля ў дзявятым класе. Я нічога не ведаў аб праграмаванні, алгарытмах і структурах дадзеных. У нейкі момант я напісаў свой першы радок кода. Праз сем месяцаў на гарызонце замаячыла алімпіяда па праграмаванні. Я захацеў даведацца наколькі добра працаваў мой стыль вывучэння праграмавання. Гэта была ідэальная магчымасць.

Пасля двухдзённых спаборніцтваў прыйшлі вынікі: я выйграў залаты медаль.

Я быў у шоку. Я апярэдзіў канкурэнтаў з 5-гадовым досведам. Я ведаў, што шмат працаваў, але гэта дасягненне перасягнула ўсе мае чаканні. Я зразумеў, што спартовае праграмаванне гэта мая тэма і сышоў у яе з галавой.

Я ведаю, што прывяло мяне да поспеху і хачу падзяліцца гэтым з вамі.

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Артыкул перакладзены пры падтрымцы кампаніі EDISON Software, якая клапоціцца аб здароўі праграмістаў і іх сняданку, а таксама распрацоўвае праграмнае забеспячэнне на замову.

Якую мову праграмавання абраць

  • C++ - Настойліва рэкамендую! Ён вельмі хуткі. Рэалізацыя алгарытмаў займае мала часу з-за STL. C++ прымаюць ва ўсіх спаборніцтвах. Свой першы радок кода я напісаў на C++.
  • C - вывучайце C ++ з-за STL. Калі вы ведаеце C, вы таксама зможаце праграмаваць на C++.
  • Java - павольная мова праграмавання. У яго ёсць клас Big Integer, аднак ён не асоба вам дапаможа. Калі на конкурсе ёсць абмежаванне па часе, з Java вы яго напэўна перавысіце. Java прымаюць не на ўсіх спаборніцтвах.

Дзе вы можаце практыкавацца

Я рэкамендую Sphere Online Judge (SPOJ). Гэта эфектыўны рэсурс з пункту гледжання колькасці і якасці. Рэдактары і рашэнні даступныя анлайн, калі вы затрымаліся ў працэсе вырашэння праблем. Апроч гэтага сайта рэкамендую SPOJ Toolkit и класіфікатар праблем для SPOJ.pl.

Па-першае, трэба адтачыць веданне асноў

Пасля таго, як вы абвыкнеце да сінтаксісу мовы, прыйдзецца вырашыць некаторыя праблемы. Пачніце з простых праблем, якія патрабуюць практыкі. На гэтым этапе галоўнае вызначыць свой стыль праграмавання. Можа быць, вам падабаецца пісаць код з вялікай колькасцю прабелаў, а можа і не. Магчыма, вы ставіце дужкі ў адным радку з "if", а можа ставіце іх на асобных радках.

Вы павінны знайсці свой стыль праграмавання, таму што гэта ВАШ стыль.

Калі будзеце шукаць яго, не забывайце два асноўныя прынцыпы:

  • Ваш код павінен лёгка рэалізоўвацца. Вы павінны адчуваць сябе камфортна пры рэалізацыі рашэння, якое вы прыдумалі. Чаму? Таму што падчас спаборніцтва апошняе, чаго вы хочаце, гэта згубіцца ў сваім кодзе. Заўсёды лепш лішнія 5 хвілін падумаць аб тым як спрасціць рэалізацыю кода, чым марнаваць 10 хвілін на тое, каб у ёй разабрацца.
  • Ваш код павінен лёгка чытацца. Калі код лёгка чытаць, яго лёгка адладжваць. Давайце глядзець праўдзе ў вочы - памылкі з'яўляюцца ўвесь час. Ведаеце тое самае пачуццё, калі да канца засталося 10 хвілін і вы не можаце знайсці чортавую памылку? Ведаеце, вядома. Каб пазбегнуць гэтай сітуацыі, пішыце пераборлівы код. Калі вы пачнеце яго адладжваць, код будзе здавацца натуральным і простым для разумення.

Вось прыклад майго стылю праграмавання.

Як павысіць вашыя навыкі распрацоўкі

Практыка, практыка і яшчэ раз практыка. Я рэкамендую вам прапрацаваць першыя 250 самых развязальных задач на SPOJ. Вырашайце іх па парадку. Выдаткуйце на абдумванне рашэння кожнай з іх хаця б гадзіну.

Не кажыце: «Гэтая праблема для мяне занадта складаная, я паспрабую вырашыць наступную». Так думаюць няўдачнікі.

Вазьміце ліст паперы і аловак. Падумайце. Можа вам атрымаецца знайсці рашэнне, а можа і не. Як мінімум вы разаўецца алгарытмічнае мысленне. Калі вы не зможаце прыдумаць рашэнне на працягу гадзіны, пашукайце гатовае рашэнне на форуме ці ў артыкулах.

Чаго вы даможацеся з такім падыходам? Навучыцеся хутка рэалізоўваць свае ідэі з дапамогай кода. І вывучыце класічныя задачы і алгарытмы.

Па-другое, вы павінны асвоіць алгарытмы і структуры дадзеных

Выконвайце іерархічнаму падыходу. Вы пачыналі бегаць, не ўмеючы хадзіць? Не. Ці можаце вы пабудаваць хмарачос без трывалага падмурка? Зноў не.

Вы не можаце ігнараваць этапы на шляху навучання. Калі вы будзеце іх ігнараваць, у вас застануцца прабелы ў ведах. З цягам часу яны толькі пагоршаць.

Пачніце з фундаментальных алгарытмаў і структур дадзеных

Пачаць цяжка. Магчыма, таму што вы не ведаеце, што вывучаць у першую чаргу. Таму я стварыў відэа-курс «Алгарытмы і структуры дадзеных». Ствараючы гэты курс, я абапіраўся на тое, як хацеў бы, каб мяне вучылі. Рэакцыя была неверагоднай! Больш за 3000 студэнтаў з больш за 100 краін запісаліся на курс у першы ж месяц.

Калі вы будзеце працаваць над вырашэннем лёгкіх праблем, вы ніколі не станеце лепш.

Самы эфектыўны спосаб разабрацца ў тым, чаго вы не ведаеце, гэта сутыкнуцца з гэтым практычна. Так вучыўся я. Я вывучыў шмат новых тэхнік, пра якія ніколі раней не чуў, выбраўшы складаную задачу.

Кожная трэцяя праблема, над вырашэннем якой вы працуеце, павінна вучыць вас нечаму новаму. Пастаўцеся да выбару праблем дбайней. Выбірайце праблемы больш складана!

Пасля таго, як вы скончыце гэтыя 250 задач ад SPOJ, у вас з'явіцца агульнае разуменне асноўных тэм спартовага праграмавання. Дзякуючы глыбокаму разуменню логікі, якая ляжыць у аснове базавых алгарытмаў, алгарытмы высокага ўзроўню здадуцца не такімі складанымі. Такім чынам, вы можаце выкарыстоўваць свае веды па максімуме.

Капніце глыбей кожную з асноўных тэм

Вось каштоўны рэсурс з вялікай колькасцю інфармацыі. Там вы знойдзеце топ 10 алгарытмаў і структур даных па кожнай тэме. Пасля 250 праблем ад SPOJ вы будзеце ведаць шмат з гэтага спісу. Але таксама натыкнецеся на шматлікае, пра што яшчэ ніколі не чулі. Таму пачніце вывучаць гэтыя тэмы ў парадку ўзрастання.

Калі вы не ўмацуеце свае веды пасля таго, як вывучыце нешта новае, вы хутка ўсё забудзецеся.
Я рэкамендую пасля таго, як вы вывучыце новы алгарытм, выкарыстоўваць яго на практыцы. Прапрацуйце яго на 2-3 задачах. Пашукайце тэг алгарытму ў SPOJ. Тамака вы знойдзеце праблемы, для рашэння якіх патрэбен гэты алгарытм. Разбярыце гэтыя праблемы ў першую чаргу.

Разбярыцеся з дынамічным праграмаваннем, таму што яно прывядзе вас да перамогі
Зыходзячы з майго досведу, у кожным конкурсе ёсць як мінімум адна праблема дынамічнага праграмавання. У многіх людзей пачынае балець галава, калі яны чуюць словазлучэнне "дынамічнае праграмаванне", таму што яны яго зусім не разумеюць.

І гэта добра. Таму што калі вы разбіраецеся ў дынамічным праграмаванні, тыя вы пераможаце.

Мне падабаецца дынамічнае праграмаванне, гэта мая каханая тэма. Сакрэт дынамічнага праграмавання ў тым, каб рабіць глабальна аптымальны выбар, а не толькі лакальны. Вы павінны разбіць праблему на прасцейшыя подзадачи. Вырашыце кожную з гэтых падзадач толькі адзін раз. Затым стварыце рашэнне, якое аб'ядноўвае вырашаныя подзадачи. Прагны алгарытм - супрацьлегласць дынамічнага праграмавання. У ім трэба рабіць лакальна аптымальны выбар на кожным кроку. А лакальна аптымальны выбар можа прывесці да дрэннага глабальнага рашэння.

Вывучаючы новыя канцэпцыі, азнаёмцеся з тутарыяламі TopCoder. Яны вельмі падрабязныя і зразумелыя. Дзякуючы ім я змог зразумець двайковыя індэксаваць дрэвы.

Працуйце старанна

Вы калі-небудзь чулі пра спартоўцаў, якія выйграюць Алімпіяду без шматгадовай практыкі? Я не.

Кожны год падрыхтоўка да камп'ютарнай алімпіяды пачыналася ў верасні і заканчвалася ў красавіку.

Кожны дзень цягам гэтых 8 месяцаў я практыкаваўся па 5 гадзін.

І так, я марнаваў гэтыя 5 гадзін толькі на рашэнне алгарытмічных задач. Я памятаю дні, калі я практыкаваўся па 8 і нават па 10 гадзін. Чаму? Бо мне гэта падабалася. Кожны дзень вяртаючыся дадому са школы я ішоў прама ў спальню, садзіўся за комп і пачынаў разбіраць новую праблему. Або вывучаў новы алгарытм, які трэба было ведаць для вырашэння гэтай праблемы.

Калі вы хочаце перамагчы, вы павінны рабіць тое ж самае. Абярыце праблему і прытрымвайцеся яе. Думайце пра яе, ідучы па дарозе ў супермаркет ці будучы за рулём.

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Ці ведаеце вы, што падчас сну ваш мозг дэфрагментуе інфармацыю, сабраную ў гэты дзень? Ён быццам бы складае кнігі ў алфавітным парадку на кніжнай паліцы. Па сутнасці, ваш мозг думае аб розных праблемах, з якімі вы сутыкнуліся.

Гэтым можна ўмела карыстацца. Перад сном прачытайце цяжкую праблему і запомніце, што трэба для яе рашэння. На гэтым этапе вам не трэба шукаць самое рашэнне. Кладзіцеся спаць. Ваш мозг пачне апрацоўваць гэтую праблему. Калі вы прачнецеся, вы здзівіцеся, усвядоміўшы, што знайшлі рашэнне пакуль спалі.

Паспрабуйце самі. Гэта падобна на магію.

Я стварыў відэаблог

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Гэты кароткі абзац не злучаны са спартовым праграмаваннем. Калі вам за дваццаць, і вам цікава, як я бачу свет, то вы можаце паглядзець мой відэаблог на Youtube. Я кажу ў ім пра мір, жыццё і інфарматыку.

Працуйце з розумам

Гэта сакрэт поспеху. Вам патрэбны мэты.

Мы людзі, і нам падабаецца пракрасцінаваць. Нам заўсёды хочацца адкласці тое, што трэба зрабіць прама зараз. Глядзець Netflix заўсёды прыемней, чым разбірацца з праблемамі дынамічнага праграмавання. Вы гэта ведаеце і вам трэба гэта выправіць.

Як перамагчы пракрасцінацыю

Стаўце сабе мэты. Вы заўсёды знойдзеце цікавыя праблемы, з якіх вы зможаце даведацца нешта новае (праверце рэсурсы, якія я згадваў вышэй). Але гэтыя праблемы трэба вырашаць, а ня проста чытаць пра іх.

Такім чынам, вось як я пераадолеў пракрасцінацыю. Я завёў папяровы каляндар і запоўніў кожны дзень праблемамі, якія хацеў рашаць. Я заўсёды запаўняў праблемы загадзя, на два дні раней. Таму я ведаў, як распараджацца сваім часам у наступныя дні.

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad

Такім чынам, у мяне заўжды была матывацыя. Мне трэба было вырашыць адны праблемы і знайсьці новыя, каб запоўніць наступныя дні ў календары. Выкрэсліваць вырашаныя праблемы вельмі прыемна. Я ведаю, што вам гэта таксама падабаецца.

Завядзіце свой уласны папяровы каляндар. Не стварайце на сваім тэлефоне яшчэ адзін спіс спраў, пра які вы заўтра ж забудзецеся.

Як эфектыўна дэбажыць

Жадаеце стаць прафесіяналам? Калі так, то вам трэба "дэбажыць у розуме".
Гэта, безумоўна, самая эфектыўная тэхніка адладкі, якую я ведаю, таму што яна ўвогуле не патрабуе адладчыка. Ваш мозг даследуе некалькі галінак кода адначасова і дае вам значна шырэйшы агляд кода ў параўнанні з класічным адладчыкам.

Вы можаце параўнаць сябе з гросмайстрам, які гуляе ў шахматы і думае на 3 ходу наперад.

Я выкарыстоўваю гэтую тэхніку выключна ў якасці сваёй пачатковай лініі аховы. Затым я выкарыстоўваю сапраўдны адладчык.

Каб навучыцца "дэбажыць у розуме", трэба практыкавацца. Калі вы сцвярджаеце рашэнне праблемы і атрымліваеце "няправільны адказ", не пераходзіце адразу да кнопкі адладчыка. Перачытайце код і падумайце: "Што адбываецца ў гэтым радку?", "Як тут "if" уплывае на праграму?", "Калі мы выходзім з цыклу, якое значэнне ітэратара?".

Такім чынам, вы думаеце самастойна. З часам вы навучыцеся пісаць код і дэбажыць яго на хаду.

Пра аўтара

Як я выйграў 3 з 4 залатых медалёў на Computing Olympiad
Andrei Margeloiu – заўзяты праграміст, які цікавіцца прадпрымальніцтвам, стартапамі і прыродай. Вы можаце звязацца з ім на LinkedIn.

Пераклад: Дыяна Шарам'ёва

Крыніца: habr.com

Дадаць каментар