Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

Ik haw my tariede op de 2017 Google HashCode World Championship Finale. Dit is de grutste algoritmyske útdagingswedstriid organisearre troch Google.

Ik begon C ++ fanôf it begjin te learen yn 'e njoggende klasse. Ik wist neat oer programmearring, algoritmen en gegevensstruktueren. Op in stuit skreau ik myn earste rigel fan koade. Sân moanne letter drige in programmearkompetysje op 'e hoarizon. Ik woe witte hoe goed myn styl fan learprogrammearring wurke. It wie de perfekte kâns.

Nei twa dagen konkurrinsje kamen de resultaten: ik wûn de gouden medalje.

Ik wie skrokken. Ik kaam de konkurrinsje foarút mei 5 jier ûnderfining. Ik wist dat ik hurd wurke, mar dizze prestaasje oertrof al myn ferwachtingen. Ik realisearre dat sportprogrammearring myn ûnderwerp is en gie der mei myn holle op yn.

Ik wit wat my liede ta sukses en ik wol it mei jo diele.

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

It artikel waard oerset mei de stipe fan EDISON Software, dy't soarget foar de sûnens fan programmeurs en har moarnsiten, lykas ek ûntwikkelet oanpaste software.

Hokker programmeartaal te kiezen

  • C ++ - Heech oanrikkemandearre! Hy is hiel fluch. De ymplemintaasje fan 'e algoritmen nimt in bytsje tiid troch de STL. C ++ wurdt akseptearre yn alle kompetysjes. Ik skreau myn earste rigel fan koade yn C ++.
  • C - lear C++ fanwegen de STL. As jo ​​C kenne, kinne jo ek programmearje yn C ++.
  • Java is in trage programmeartaal. It hat in Big Integer klasse, mar it sil net helpe jo folle. As de konkurrinsje in tiidlimyt hat, mei Java sille jo it grif oerskriuwe. Java wurdt net akseptearre yn alle kompetysjes.

Wêr kinne jo oefenje

ik advisearje Sphere Online Judge (SPOJ). It is in effisjinte boarne yn termen fan kwantiteit en kwaliteit. Bewurkers en oplossingen binne online beskikber as jo fêst sitte yn it proses foar probleemoplossing. Neist dizze side, ik advisearje SPOJ Toolkit и probleem klassifikaasje foar SPOJ.pl.

Earst moatte jo jo kennis fan 'e basis slypje

Nei't jo wend binne oan 'e syntaksis fan' e taal, sille jo wat problemen moatte oplosse. Begjin mei ienfâldige problemen dy't oefening nedich binne. Op dit stadium is it wichtichste om jo programmearringstyl te bepalen. Miskien wolle jo koade skriuwe mei in protte spaasjes, miskien net. Jo kinne heakjes op deselde rigel sette as "as", of jo kinne se op aparte rigels sette.

Jo moatte jo programmearringstyl fine, om't it JIN styl is.

As jo ​​​​nei sykje, hâld dan twa basisprinsipes yn gedachten:

  • Jo koade moat maklik te ymplementearjen wêze. Jo moatte jo noflik fiele om de oplossing te ymplementearjen wêrmei jo komme. Wêrom? Want tidens in kompetysje is it lêste wat jo wolle ferlern gean yn jo koade. It is altyd better om in ekstra 5 minuten te besteegjen oan it tinken oer hoe't jo de ymplemintaasje fan 'e koade ferienfâldigje kinne dan 10 minuten te besteegjen om it út te finen.
  • Jo koade moat maklik te lêzen wêze. As koade maklik te lêzen is, is it maklik om te debuggen. Lit ús face it - flaters barre hieltyd. Jo kenne dat gefoel as der noch 10 minuten oer binne en jo de ferrekte flater net fine kinne? Fansels dogge jo dat. Om dizze situaasje te foarkommen, skriuw lêsbere koade. As jo ​​​​ienris begjinne mei it debuggen, sil de koade natuerlik en maklik te begripen fiele.

Hjir is in foarbyld fan my programmearring styl.

Hoe kinne jo jo ûntwikkelingsfeardigens ferbetterje

Oefenje, oefenje en mear oefenje. Ik riede oan dat jo wurkje troch de earste 250 meast oplosbare problemen op SPOJ. Los se yn oarder. Besteegje op syn minst in oere nei te tinken oer de oplossing foar elk fan harren.

Sis net: "Dit probleem is te dreech foar my, ik sil de folgjende besykje." Dit is hoe't ferliezers tinke.

Nim in stikje papier en in potlead. Tinke. Miskien kinne jo in oplossing fine, miskien net. Op syn minst sille jo algoritmysk tinken ûntwikkelje. As jo ​​net binnen in oere mei in oplossing komme kinne, sykje dan op it foarum of yn de artikels nei in klearebare oplossing.

Wat sille jo berikke mei dizze oanpak? Learje hoe't jo jo ideeën fluch implementearje kinne mei koade. En lear klassike problemen en algoritmen.

Twadder moatte jo algoritmen en gegevensstruktueren behearskje

Folgje in hiërargyske oanpak. Binne jo begon te rinnen sûnder rinne te kinnen? Nee. Kinne jo in wolkekliuwer bouwe sûnder in solide stifting? Nochris nee.

Jo kinne de stadia op it learpaad net negearje. As jo ​​se negearje, sille jo oerbliuwe mei kennisgaten. As de tiid trochgiet, sille se allinich slimmer wurde.

Begjin mei fûnemintele algoritmen en gegevensstruktueren

It is dreech om te begjinnen. Miskien om't jo net witte wat jo earst moatte studearje. Dêrom Ik makke in fideokursus "Algorithmen en gegevensstruktueren". By it meitsjen fan dizze kursus fertroude ik op hoe't ik leard wurde soe. De reaksje wie ongelooflijk! Mear dan 3000 studinten út mear as 100 lannen hawwe har yn 'e earste moanne oanmeld foar de kursus.

As jo ​​​​wurkje oan it oplossen fan maklike problemen, sille jo noait better wurde.

De meast effektive manier om út te finen wat jo net witte is om it yn 'e praktyk te konfrontearjen. Dat is hoe't ik leard. Ik learde in protte nije techniken dêr't ik noch nea fan heard hie troch in lestich probleem te kiezen.

Elk tredde probleem dêr't jo oan wurkje moatte jo wat nijs leare. Wês foarsichtich mei de seleksje fan problemen. Kies de dreger problemen!

As jo ​​​​ienris dizze 250 problemen fan SPOJ hawwe foltôge, sille jo in algemien begryp hawwe fan 'e haadûnderwerpen fan sportprogrammearring. Mei in djip begryp fan 'e logika efter basisalgoritmen, sille algoritmen op hege nivo's net sa yngewikkeld lykje. Sa kinne jo jo kennis maksimaal brûke.

Dig djipper yn elk fan 'e haadtema's

Hjir is in weardefolle boarne mei in protte ynformaasje. Dêr fine jo de top 10 algoritmen en gegevensstruktueren foar elk ûnderwerp. Nei 250 problemen fan SPOJ sille jo in protte witte fan dizze list. Mar jo sille ek in protte stroffelje wêr't jo noch noait fan heard hawwe. Begjin dus dizze ûnderwerpen yn oprinnende folchoarder te ferkennen.

As jo ​​​​jo kennis net fersterkje nei't jo wat nijs leard hawwe, sille jo alles gau ferjitte.
Ik advisearje dat nei't jo in nij algoritme leard hawwe, it yn 'e praktyk bringe. Wurkje it út op 2-3 taken. Sjoch foar de algoritme-tag yn SPOJ. Dêr fine jo problemen wêrfoar dit algoritme nedich is. Behannelje dizze problemen earst.

Begripe dynamyske programmearring omdat it sil liede jo ta oerwinning
Yn myn ûnderfining hat elke wedstryd op syn minst ien probleem dynamyske programmearring. In protte minsken krije hoofdpijn as se de útdrukking "dynamyske programmearring" hearre, om't se it hielendal net begripe.

En dit is goed. Want as jo dynamyske programmearring begripe, dan sille jo winne.

Ik hâld fan dynamyske programmearring, it is myn favorite ûnderwerp. It geheim fan dynamyske programmearring is om wrâldwiid optimale karren te meitsjen, net allinich lokale. Jo moatte it probleem ferbrekke yn ienfâldiger subtaken. Los elk fan dizze subproblemen mar ien kear op. Meitsje dan in oplossing dy't de oploste subproblemen kombinearret. Greedy Algoritme is it tsjinoerstelde fan dynamyske programmearring. Dêryn moat men by elke stap in lokaal optimale kar meitsje. En in lokaal optimale kar kin liede ta in minne globale oplossing.

As jo ​​nije begripen ferkenne, check out TopCoder tutorials. Se binne heul detaillearre en begryplik. Mei tank oan harren koe ik begripe binêre yndeksearre beammen.

hurd wurkje

Hawwe jo ea heard fan atleten dy't de Olympyske Spullen winne sûnder jierren fan oefening? Ik net.

Alle jierren begûnen de tariedings foar de Computer Olympiade yn septimber en einige yn april.

Elke dei yn dizze 8 moannen oefene ik 5 oeren.

En ja, ik haw dizze 5 oeren allinich bestege oan it oplossen fan algoritmyske problemen. Ik herinner my de dagen dat ik 8 en sels 10 oeren oefene. Wêrom? Om't ik it leuk fûn. Elke dei, werom fan skoalle, gie ik direkt nei de sliepkeamer, siet by de kompjûter en begon in nij probleem op te lossen. Of in nij algoritme leare dat bekend wie om dit probleem op te lossen.

As jo ​​wolle winnen, Jo moatte dwaan itselde. Kies in probleem en bliuw dêrby. Tink der oan by it rinnen fan 'e dyk nei de supermerk of ûnder it riden.

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

Wisten jo dat yn 'e sliep jo harsens de ynformaasje dy't dy dei sammele defragmentearret? Hy liket boeken yn alfabetyske folchoarder op in boekenplank te steapele. Yn essinsje tinkt jo harsens oer de ferskate problemen dy't jo te krijen hawwe.

Dit kin mei feardigens brûkt wurde. Foardat jo op bêd gean, lês in lestich probleem en tink oan wat it kostet om it op te lossen. Op dit stadium hoege jo net nei de oplossing sels te sykjen. Gean nei bêd. Jo harsens sil begjinne dit probleem te ferwurkjen. As jo ​​wekker wurde, sille jo ferrast wurde om te realisearjen dat jo de oplossing fûn hawwe wylst jo sliepten.

Besykje it sels. It is as magy.

Ik makke in vlog

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

Dizze koarte paragraaf is net besibbe oan sportprogrammearring. As jo ​​​​yn 'e tweintich binne en jo freegje jo ôf hoe't ik de wrâld sjoch, dan kinne jo sjen myn vlog op Youtube. Ik praat deryn oer de wrâld, it libben en ynformatika.

Slim wurkje

Dit is it geheim fan sukses. Jo hawwe doelen nedich.

Wy binne minske en wy graach útstelle. Wy wolle altyd útstelle wat der no krekt dien wurde moat. Netflix besjen is altyd nofliker dan omgean mei dynamyske programmearproblemen. Jo witte it en jo moatte it reparearje.

Hoe te ferslaan útstel

Stel dysels doelen. Jo sille altyd ynteressante problemen fine wêrfan jo wat nijs kinne leare (besjoch de boarnen dy't ik hjirboppe neamde). Mar dizze problemen moatte wurde oanpakt, net allinnich lêze oer harren.

Dat, hjir is hoe't ik it útstel oerwûn. Ik begon in papieren kalinder en folde elke dei mei de problemen dy't ik oplosse woe. Ik haw altyd problemen foarôf ynfolle, twa dagen te betiid. Dat ik wist hoe't ik myn tiid de folgjende dagen moast beheare.

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade

Sa bin ik altyd motivearre west. Ik moast wat problemen oplosse en nije fine om de folgjende dagen op 'e kalinder te foljen. Oploste problemen trochkrúst is hiel moai. Ik wit dat jo it ek leuk fine.

Krij jo eigen papieren kalinder. Meitsje gjin oare takenlist op jo tillefoan dy't jo moarn sille ferjitte.

Hoe effektyf debuggen

Wolle jo profesjoneel wurde? As ja, dan moatte jo "debuggen yn jo geast".
Dit is fierwei de meast effisjinte debuggen technyk ik wit omdat it net nedich in debugger at all. Jo harsens ûndersiket meardere tûken fan koade tagelyk en jout jo in folle bredere werjefte fan 'e koade dan klassike debugger.

Jo kinne josels fergelykje mei in grutmaster dy't skaak spilet en tinkt 3 sets foarút.

Ik brûk dizze technyk eksklusyf as myn earste line fan ferdigening. Dan brûk ik in echte debugger.

Om te learen hoe't jo "yn jo geast debagearje", moatte jo oefenje. As jo ​​​​in oplossing foar in probleem goedkarre en in "ferkeard antwurd" krije, gean dan net direkt nei de debuggerknop. Lês de koade opnij en tink: "Wat bart der yn dizze rigel?", "Hoe beynfloedet "as" it programma hjir?", "As wy de lus ferlitte, wat is de wearde fan 'e iterator?".

Sa tinke jo sels. Nei ferrin fan tiid sille jo leare hoe't jo koade skriuwe en it ûnderweis debuggen.

Oer de skriuwer

Hoe ik wûn 3 fan de 4 gouden medaljes op de Computing Olympiade
Andrei Margeloiu is in begearige programmeur mei in belangstelling foar ûndernimmerskip, startups en natuer. Jo kinne kontakt opnimme mei him op LinkedIn.

Oersetting: Diana Sheremyeva

Boarne: www.habr.com

Add a comment