Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Мен Google HashCode World Championship Finals 2017 үчүн даярданып жаткам. Бул Google тарабынан уюштурулган алгоритмдик көйгөйлөр менен эң чоң мелдеш.

Мен тогузунчу класстан баштап C++ тилин үйрөнө баштадым. Мен программалоо, алгоритмдер же маалымат структуралары жөнүндө эч нерсе билген эмесмин. Кайсы бир убакта мен коддун биринчи сабын жаздым. Жети айдан кийин программалоо боюнча сынак горизонтто көрүндү. Мен программалоону үйрөнүү стилим канчалык жакшы иштегенин көргүм келди. Бул эң сонун мүмкүнчүлүк болчу.

Эки күндүк мелдештин жыйынтыгы чыкты: мен алтын медалга ээ болдум.

Мен таң калдым. 5 жылдык тажрыйбасы бар атаандаштардан алдыга озуп чыктым. Мен талыкпай эмгектенгенимди билчүмүн, бирок бул жетишкендик менин бардык күткөндөрүмдөн ашып түштү. Мен спорттук программалоо менин темам экенин түшүндүм жана ага баш-отум менен кириштим.

Мени ийгиликке эмне алып келгенин билем жана аны сиз менен бөлүшкүм келет.

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Макала EDISON Software компаниясынын колдоосу менен которулган программисттердин ден соолугуна жана алардын эртең мененки тамактарына кам көрөт, дагы атайын программалык камсыздоону иштеп чыгат.

Кайсы программалоо тилин тандоо керек

  • C++ - Абдан сунуштайбыз! Ал абдан тез. STL үчүн алгоритмдерди ишке ашыруу аз убакытты талап кылат. C++ бардык сынактарда кабыл алынат. Мен C++ тилинде биринчи кодумду жаздым.
  • C - STLдин аркасында C++ тилин үйрөнүңүз. Эгер сиз C билсеңиз, анда C++ тилинде да программалай аласыз.
  • Java жай программалоо тили болуп саналат. Анын Big Integer классы бар, бирок ал сизге көп жардам бербейт. Эгер сынакта убакыт чеги болсо, Java менен сиз андан сөзсүз ашып кетесиз. Java бардык сынактарда кабыл алынбайт.

Кайда машыкса болот

Мен сунуштайм Sphere Online Judge (SPOJ). Бул сан жана сапат жагынан эффективдүү ресурс. Эгер көйгөйлөрдү чечүү процессинде тыгылып калсаңыз, редакторлор жана чечимдер онлайн режиминде жеткиликтүү. Бул сайтка кошумча мен сунуштайм SPOJ Toolkit и SPOJ.pl үчүн көйгөй классификатору.

Биринчиден, сиз негиздер боюнча билимиңизди өркүндөтүшүңүз керек

Тилдин синтаксисине көнүп калгандан кийин, чече турган көйгөйлөр бар. Практиканы талап кылган жөнөкөй маселелерден баштаңыз. Бул этапта, негизги нерсе программалоо стилин аныктоо болуп саналат. Балким, сиз көп боштук менен код жазганды жакшы көрүшүңүз мүмкүн, балким, жакпайсыз. Сиз кашааларды "эгер" менен бир сапка коюп жаткандырсыз же аларды өзүнчө саптарга коюп жаткандырсыз.

Сиз өзүңүздүн программалоо стилиңизди табышыңыз керек, анткени бул СИЗДИН стили.

Аны издеп жатканда, эки негизги принципти эстен чыгарбаңыз:

  • Сиздин кодду ишке ашыруу оңой болушу керек. Сиз ойлоп тапкан чечимди ишке ашырууда өзүңүздү ыңгайлуу сезишиңиз керек. Неге? Анткени мелдеш учурунда эң акыркы нерсе - кодуңуздан адашып калуу. Кодду ишке ашырууну кантип жөнөкөйлөтүү жөнүндө ойлонууга кошумча 5 мүнөт коротуп, аны түшүнүүгө 10 мүнөт короткондон көрө ар дайым жакшы.
  • Сиздин кодду окуу оңой болушу керек. Кодду окуу оңой болгондо, аны оңдоо оңой. Келгиле, каталар дайыма болуп турат. Сиз 10 мүнөт калганда ошол сезимди билесизби, бирок катаны таба албай жатасызбы? Албетте сен кыласың. Мындай абалды болтурбоо үчүн, окула турган кодду жазыңыз. Сиз аны оңдоону баштагандан кийин, код табигый жана түшүнүктүү болуп көрүнөт.

Мына меники мисал программалоо стили.

Өнүгүү көндүмдөрүңүздү кантип өркүндөтсө болот

Практика, практика жана башка практика. Мен сизге эң биринчи 250 эң чечилүүчү маселени карап чыгууну сунуштайм SPOJ. Аларды ирети менен чечиңиз. Алардын ар биринин чечими жөнүндө ойлонуп, жок дегенде бир саат өткөрүңүз.

"Бул маселе мен үчүн өтө оор, кийинкисин чечкенге аракет кылам" деп айтпаңыз. Жеңилгендер ушинтип ойлошот.

Кагаз менен карандашты алыңыз. ойлонуп көр. Балким, бир чечим таба аласыз, балким, жок. Жок дегенде, сиз алгоритмдик ой жүгүртүүнү өнүктүрөсүз. Эгер бир сааттын ичинде чечим таба албасаңыз, даяр чечимди форумдан же макалалардан издеңиз.

Бул ыкма менен эмнеге жетесиз? Кодду колдонуу менен идеяларыңызды тез ишке ашырууну үйрөнүңүз. Ал эми классикалык маселелерди жана алгоритмдерди изилдөө.

Экинчиден, сиз алгоритмдерди жана маалымат структураларын өздөштүрүшүңүз керек

Иерархиялык ыкманы карманыңыз. Басканды билбей чуркай баштадыңызбы? Жок. Бекем пайдубалсыз асман тиреген имаратты курууга болобу? Кайра эмес.

Окуу жолунда кадамдарды этибарга албай коюуга болбойт. Аларды этибарга албасаңыз, билимиңизде боштуктар калат. Убакыттын өтүшү менен алар начарлай берет.

Негизги алгоритмдер жана маалымат структуралары менен баштаңыз

Баштоо кыйын. Балким, сиз биринчи эмнени окушуңузду билбей жатканыңыздандыр. Ошол үчүн Мен "Алгоритмдер жана маалымат структуралары" видео курсун түздүм.. Бул курсту түзүүдө мен аны кантип үйрөткүм келет деп негиздедим. Реакция укмуштуудай болду! Биринчи айда 3000дөн ашуун өлкөдөн 100ден ашык студенттер курска жазылышты.

Жеңил маселелерди чечүүнүн үстүндө иштесеңиз, эч качан оңолбойсуз.

Билбеген нерсеңизди түшүнүүнүн эң эффективдүү жолу – бул аны иш жүзүндө тажрыйбадан өткөрүү. Мен ошентип үйрөндүм. Татаал тапшырманы тандоо менен мурда укпаган көптөгөн жаңы ыкмаларды үйрөндүм.

Сиз иштеп жаткан ар бир үчүнчү маселе сизге жаңы нерсени үйрөтүшү керек. Көйгөйлөрдү тандоодо этият болуңуз. Кыйын маселелерди танда!

SPOJден бул 250 маселени бүтүргөндөн кийин, сиз спорттук программалоонун негизги темалары жөнүндө негизги түшүнүккө ээ болосуз. Негизги алгоритмдердин логикасын терең түшүнүү менен, жогорку деңгээлдеги алгоритмдер анча татаал эместей сезилет. Ушундай жол менен сиз билимиңизди максималдуу түрдө колдоно аласыз.

Негизги темалардын ар бирин тереңирээк казыңыз

Бул жерде баалуу ресурс бар көп маалымат менен. Ал жерден ар бир тема үчүн эң мыкты 10 алгоритмдерди жана маалымат структураларын табасыз. SPOJден 250 көйгөйдөн кийин, сиз бул тизмеден көп нерсени билесиз. Бирок буга чейин укпаган көп нерселерге да чалынасыз. Андыктан бул темаларды өсүү тартибинде изилдеп баштаңыз.

Жаңы нерсени үйрөнгөндөн кийин билимиңизди бекемдебесеңиз, баарын бат эле унутуп каласыз.
Жаңы алгоритмди үйрөнгөндөн кийин аны иш жүзүндө колдонууну сунуштайм. 2-3 тапшырманы аткарыңыз. SPOJден алгоритм тегин издеңиз. Ал жерден сиз бул алгоритмди чечүү үчүн керектүү маселелерди таба аласыз. Адегенде ушул маселелерди чечиңиз.

Мастер динамикалык программалоо, анткени ал сени жеңишке жетелейт
Менин тажрыйбам боюнча, ар бир мелдеште жок дегенде бир көйгөй бар динамикалык программалоо. Көптөгөн адамдар "динамикалык программалоо" деген сөз айкашын укканда башы оорушат, анткени алар аны такыр түшүнбөйт.

Бул дагы жакшы. Анткени динамикалык программалоону түшүнсөң, анда жеңесиң.

Мага динамикалык программалоо жагат, бул менин сүйүктүү темам. Динамикалык программалоонун сыры жергиликтүү гана эмес, глобалдык оптималдуу тандоолорду жасоодо. Көйгөйдү жөнөкөй субпроблемаларга бөлүү керек. Бул чакан маселелердин ар бирин бир жолу гана чечиңиз. Андан кийин чечилген чакан маселелерди бириктирген чечимди түзүңүз. Ач көз алгоритм - динамикалык программалоого карама-каршы. Бул ар бир кадамда жергиликтүү оптималдуу тандоолорду жасоону талап кылат. Ал эми жергиликтүү оптималдуу тандоо жаман глобалдуу чечимге алып келиши мүмкүн.

Жаңы түшүнүктөрдү үйрөнүп жатканда, текшерип көрүңүз TopCoder окуу куралдары. Алар абдан деталдуу жана түшүнүктүү. Алардын аркасында мен түшүнө алдым бинардык индекстелген дарактар.

Талыкпай иште

Көп жылдык машыгуусу жок эле Олимпиадада жеңишке жеткен спортчулар жөнүндө уктуңуз беле? Мага эмес.

Жыл сайын компьютердик олимпиадага даярдык сентябрда башталып, апрель айында аяктачу.

Бул 8 ай бою күн сайын 5 сааттан машыгып жаттым.

Ооба, мен бул 5 саатты алгоритмдик маселелерди чечүүгө гана жумшадым. 8, жада калса 10 саат машыгып жүргөн күндөрүм эсимде. Неге? Анткени мага жакты. Күн сайын мектептен келгенден кийин түз эле уктоочу бөлмөгө кирип, компьютерге отуруп, жаңы маселени талдай баштадым. Же мен бул маселени чечүү үчүн билишим керек болгон жаңы алгоритмди үйрөнүп жаттым.

Жеңишке жетүүнү кааласаң, сен да ошондой кылышың керек. Көйгөйдү тандап, ага карманыңыз. Бул тууралуу супермаркетке баратканда же унаа айдап баратканда ойлонуп көрүңүз.

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Сиз уктап жатканда мээңиз ошол күнү чогултулган маалыматты дефрагментациялай турганын билесизби? Ал алфавит боюнча китептерди текчеге тизип жаткансыйт. Негизи, мээңиз сиз туш болгон ар кандай көйгөйлөр жөнүндө ойлонот.

Муну билгичтик менен пайдаланууга болот. Жатар алдында оор маселени окуп, аны чечүү үчүн эмне керек экенин эстен чыгарбаңыз. Бул этапта, сиз чечимди өзү издөөнүн кереги жок. Уктоо. Сиздин мээңиз бул көйгөйдү иштете баштайт. Уйкудан ойгонгондо, сиз уктап жатканда чечимди тапканыңызды түшүнүп, таң каласыз.

Өзүңүз аракет кылып көрүңүз. Бул сыйкыр сыяктуу.

Мен видео блог түздүм

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Бул кыска абзац спорттук программаларга байланыштуу эмес. Эгерде сиз жыйырма жашта болсоңуз жана мен дүйнөнү кандай көрөм деп кызыгып жатсаңыз, текшерип көрүңүз менин Youtube видео блогум. Мен андагы дүйнө, жашоо жана информатика жөнүндө айтам.

Акылдуу иште

Бул ийгиликтин сыры. Сизге максаттар керек.

Биз адамдарбыз жана бул бизге жагат кийинкиге калтыруу. Биз ар дайым азыр жасала турган иштерди кийинкиге калтыргыбыз келет. Netflix көрүү динамикалык программалоо көйгөйлөрү менен күрөшүүгө караганда ар дайым жагымдуу. Сиз муну билесиз жана аны оңдооңуз керек.

Кечиктирүүнү кантип жеңсе болот

Өзүңө максаттарды кой. Сиз ар дайым жаңы нерсени үйрөнө турган кызыктуу маселелерди таба аласыз (мен жогоруда айткан ресурстарды караңыз). Бирок бул көйгөйлөрдү жөн эле окубастан, чечүү керек.

Ошентип, мен создуктурууну кантип жеңдим. Мен кагаз календарын баштадым жана ар бир күнүмдү өзүм чечгим келген көйгөйлөр менен толтурдум. Мен ар дайым маселелерди эки күн мурун толтурчумун. Ошентип, мен кийинки күндөрү убакытты кантип башкарууну билдим.

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым

Ошентип, мен ар дайым мотивацияланчумун. Календарда кийинки күндөрдү толтуруу үчүн кээ бир көйгөйлөрдү чечип, жаңыларын табышым керек болчу. Чечилген көйгөйлөрдү кесип өтүү сонун сезилет. Мен билем, сага да жагат.

Өзүңүздүн кагаз календарыңызды алыңыз. Телефонуңузга эртең унутуп кала турган башка иштердин тизмесин түзбөңүз.

Кантип натыйжалуу мүчүлүштүктөрдү оңдоо

Сиз профессионал болгуңуз келеби? Эгер ооба болсо, анда сиз аны "оюңузда оңдоо" керек.
Бул мен билген эң эффективдүү мүчүлүштүктөрдү оңдоо техникасы, анткени ал мүчүлүштүктөрдү оңдоону таптакыр талап кылбайт. Мээңиз бир эле учурда бир нече код бутактарын карап чыгат жана сизге салыштырмалуу коддун кеңири баяндамасын берет классикалык мүчүлүштүктөрдү оңдоочу.

Сиз өзүңүздү шахмат ойноп, 3 кадам алдыда ойлонгон гроссмейстерге салыштырсаңыз болот.

Мен бул ыкманы биринчи коргонуу линиясы катары гана колдоном. Анан мен чыныгы мүчүлүштүктөрдү колдоном.

Башыңыздагы мүчүлүштүктөрдү кантип оңдоону үйрөнүү үчүн, сиз машыгышыңыз керек. Маселени чечүү жолун ырастап, "туура эмес жооп" алганыңызда, түз эле мүчүлүштүктөрдү оңдоо баскычына кирбеңиз. Кодду кайра окуп чыгып, ойлонуп көрүңүз: "Бул сапта эмне болуп жатат?", "Бул жердеги "эгерде" программага кандай таасир этет?", "Биз циклден чыкканда, итератордун мааниси кандай?"

Ушундай жол менен сиз өзүңүз ойлойсуз. Убакыттын өтүшү менен сиз кодду жазууну жана аны тез арада оңдоону үйрөнөсүз.

жазуучу тууралуу

Компьютердик олимпиадада 3 алтындын 4 медалын кантип жеңип алдым
Андрей Маргелоиу - ишкерликке, стартаптарга жана сыртка кызыккан ынтызар программист. Сиз аны менен байланыша аласыз LinkedInде.

Котормо: Диана Шеремьева

Source: www.habr.com

Комментарий кошуу