Тооцооллын олимпиадаас 3 алтан медалийн 4-ыг нь яаж авсан

Тооцооллын олимпиадаас 3 алтан медалийн 4-ыг нь яаж авсан

Би Google HashCode World Championship Finals 2017 тэмцээнд бэлдэж байсан. Энэ бол Google-ээс зохион байгуулдаг алгоритмын бодлоготой хамгийн том тэмцээн юм.

Би есдүгээр ангиасаа эхлэн C++ хэл сурч эхэлсэн. Би програмчлал, алгоритм, өгөгдлийн бүтцийн талаар юу ч мэдэхгүй байсан. Хэзээ нэгэн цагт би кодын эхний мөрийг бичсэн. Долоон сарын дараа програмчлалын уралдаан тэнгэрийн хаяанд иржээ. Би програмчлалын сурах арга барил маань хэр үр дүнтэй болохыг харахыг хүссэн. Энэ бол төгс боломж байсан.

Хоёр өдөр үргэлжилсэн өрсөлдөөний үр дүнд би алтан медаль хүртлээ.

Би цочирдсон. Би 5 жилийн туршлагатай өрсөлдөгчдөөс түрүүлж байсан. Би шаргуу ажилласан гэдгээ мэдэж байсан ч энэ амжилт миний бүх хүлээлтээс давсан. Спортын нэвтрүүлэг бол миний сэдэв гэдгийг ойлгоод энэ сэдэв рүү толгойгоо гашилгасан.

Намайг амжилтанд хүргэсэн зүйлийг би мэдэж байгаа бөгөөд та бүхэнтэй хуваалцахыг хүсч байна.

Тооцооллын олимпиадаас 3 алтан медалийн 4-ыг нь яаж авсан

Нийтлэлийг EDISON програм хангамжийн дэмжлэгтэйгээр орчуулсан програмистуудын эрүүл мэнд, өглөөний цайнд санаа тавьдагТэгээд захиалгат програм хангамжийг боловсруулдаг.

Аль програмчлалын хэлийг сонгох вэ

  • C++ - Маш их зөвлөж байна! Тэр маш хурдан. STL-ийн улмаас алгоритмыг хэрэгжүүлэхэд бага хугацаа шаардагдана. С++ хэлийг бүх тэмцээнд хүлээн зөвшөөрдөг. Би анхны кодоо C++ хэл дээр бичсэн.
  • C - STL-ийн ачаар C++ хэлийг сур. Хэрэв та С-г мэддэг бол C++ хэл дээр ч програмчилж болно.
  • Java бол удаан програмчлалын хэл юм. Энэ нь Big Integer ангитай боловч энэ нь танд нэг их тус болохгүй. Тэмцээнд цаг хугацааны хязгаарлалт байгаа бол Java-ийн тусламжтайгаар та үүнийг давах нь гарцаагүй. Java хэлийг бүх тэмцээнд хүлээн зөвшөөрдөггүй.

Та хаана дасгал хийж болох вэ

Би санал болгож байна Sphere Online Judge (SPOJ). Энэ нь тоо хэмжээ, чанарын хувьд үр дүнтэй нөөц юм. Хэрэв та асуудлыг шийдвэрлэх явцад гацсан бол редакторууд болон шийдлүүдийг онлайнаар авах боломжтой. Энэ сайтаас гадна би санал болгож байна SPOJ хэрэгслийн хэрэгсэл и 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 дээр.

Орчуулга: Диана Шеремьева

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх