Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Google HashCode Dünya Şampiyonası Finalleri 2017'ye hazırlanıyordum. Bu, Google'ın düzenlediği en büyük algoritmik problemli yarışmadır.

Dokuzuncu sınıfta sıfırdan C++ öğrenmeye başladım. Programlama, algoritmalar veya veri yapıları hakkında hiçbir şey bilmiyordum. Bir noktada kodun ilk satırını yazdım. Yedi ay sonra, programlama yarışması ufukta belirdi. Programlama öğrenme tarzımın ne kadar işe yaradığını görmek istedim. Mükemmel bir fırsattı.

İki gün süren yarışmanın ardından sonuçlar geldi: Altın madalyayı kazandım.

Şok olmuştum. 5 yıllık tecrübemle rakiplerimin önündeydim. Çok çalıştığımı biliyordum ama bu başarı tüm beklentilerimi aştı. Spor programcılığının benim konumum olduğunu fark ettim ve bu konuya daldım.

Beni başarıya neyin götürdüğünü biliyorum ve bunu sizinle paylaşmak istiyorum.

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Makale EDISON Yazılımının desteğiyle çevrilmiştir. programcıların sağlığı ve kahvaltılarıyla ilgilenirVe özel yazılım geliştirir.

Hangi programlama dilini seçmelisiniz

  • C++ - Şiddetle tavsiye ederim! Çok hızlıdır. Algoritmaların uygulanması STL nedeniyle çok az zaman alır. C++ tüm yarışmalarda kabul edilmektedir. İlk kod satırımı C++ ile yazdım.
  • C - STL sayesinde C++ öğrenin. C biliyorsanız C++ ile de programlayabilirsiniz.
  • Java yavaş bir programlama dilidir. Büyük Tamsayı sınıfı var ama size pek bir faydası olmayacak. Bir yarışmanın bir zaman sınırı varsa, Java ile kesinlikle bunu aşacaksınız. Java tüm yarışmalarda kabul edilmemektedir.

Nerede pratik yapabilirsiniz?

Öneririm Sphere Çevrimiçi Yargıç (SPOJ). Nicelik ve nitelik açısından etkili bir kaynaktır. Sorun çözme sürecinde takılıp kalırsanız editörlere ve çözümlere çevrimiçi olarak ulaşabilirsiniz. Bu siteye ek olarak tavsiye ederim SPOJ Araç Seti и SPOJ.pl için sorun sınıflandırıcı.

Öncelikle temel bilgilerle ilgili bilginizi geliştirmeniz gerekir.

Dilin sözdizimine alıştığınızda üstesinden gelmeniz gereken bazı sorunlar vardır. Pratik gerektiren basit problemlerle başlayın. Bu aşamada asıl önemli olan programlama tarzınızı belirlemektir. Belki çok fazla boşluk içeren kod yazmayı seviyorsunuz, belki sevmiyorsunuz. Parantezleri “if” ile aynı satıra koyabileceğiniz gibi ayrı satırlara da koyabilirsiniz.

Programlama stilinizi bulmalısınız çünkü bu SİZİN tarzınızdır.

Onu ararken iki temel prensibi hatırlayın:

  • Kodunuzun uygulanması kolay olmalıdır. Bulduğunuz çözümü uygularken kendinizi rahat hissetmelisiniz. Neden? Çünkü bir yarışma sırasında isteyeceğiniz son şey kodunuzda kaybolmak olacaktır. Kodun uygulanmasını nasıl basitleştireceğinizi düşünmek için fazladan 5 dakika harcamak, onu anlamaya çalışmak için 10 dakika harcamaktan her zaman daha iyidir.
  • Kodunuzun okunması kolay olmalıdır. Kodun okunması kolay olduğunda hata ayıklamak da kolaydır. Kabul edelim; hatalar her zaman olur. 10 dakikanız kaldığında ve kahrolası hatayı bulamadığınızda hissettiğiniz o duyguyu bilir misiniz? Tabii ki. Bu durumu önlemek için okunaklı kod yazın. Hata ayıklamaya başladığınızda kod doğal görünecek ve anlaşılması kolay olacaktır.

İşte benim bir örneğim programlama tarzı.

Gelişim Becerilerinizi Nasıl Geliştirebilirsiniz?

Pratik yapın, pratik yapın ve daha fazla pratik yapın. En çözülebilir ilk 250 problem üzerinde çalışmanızı tavsiye ederim. Mürettebat. Bunları sırasıyla çözün. Her birinin çözümünü düşünerek en az bir saat geçirin.

"Bu problem benim için çok zor, bir sonrakini çözmeye çalışacağım" demeyin. Kaybedenler böyle düşünür.

Bir parça kağıt ve bir kalem alın. Bunu düşün. Belki çözüm bulursunuz, belki bulmazsınız. En azından algoritmik düşünmeyi geliştireceksiniz. Bir saat içinde çözüm bulamazsanız forumda veya makalelerde hazır bir çözüm arayın.

Bu yaklaşımla neyi başaracaksınız? Kod kullanarak fikirlerinizi hızla hayata geçirmeyi öğrenin. Ve klasik problemleri ve algoritmaları inceleyin.

İkinci olarak algoritmalara ve veri yapılarına hakim olmalısınız

Hiyerarşik bir yaklaşım izleyin. Yürümeyi bilmeden koşmaya mı başladın? HAYIR. Sağlam bir temel olmadan gökdelen inşa edilebilir mi? Tekrar olmasın.

Öğrenme yolundaki adımları göz ardı edemezsiniz. Bunları görmezden gelirseniz bilgi boşluklarıyla karşı karşıya kalırsınız. Zamanla sadece daha da kötüleşecekler.

Temel algoritmalar ve veri yapılarıyla başlayın

Başlamak zor. Belki de ilk önce neyi incelemeniz gerektiğini bilmediğiniz için. Bu yüzden “Algoritmalar ve Veri Yapıları” adlı bir video kursu hazırladım. Bu dersi oluştururken nasıl öğretilmesini istediğimi temel aldım. Tepki inanılmazdı! Kursa ilk ayda 3000'den fazla ülkeden 100'den fazla öğrenci kaydoldu.

Kolay problemleri çözmeye çalışırsanız asla ilerleme kaydedemezsiniz.

Bilmediğinizi anlamanın en etkili yolu onu pratikte deneyimlemektir. Ben de böyle öğrendim. Zorlu bir görevi seçerek daha önce hiç duymadığım birçok yeni teknik öğrendim.

Üzerinde çalıştığınız her üç problem size yeni bir şey öğretmelidir. Sorunları seçerken daha dikkatli olun. Daha zor problemleri seçin!

SPOJ'daki bu 250 problemi tamamladığınızda, spor programcılığının temel konularına dair temel bir anlayışa sahip olacaksınız. Temel algoritmaların arkasındaki mantığın derinlemesine anlaşılmasıyla üst düzey algoritmalar daha az karmaşık görünecektir. Bu şekilde bilginizden en iyi şekilde yararlanabilirsiniz.

Ana temaların her birini daha derinlemesine inceleyin

İşte değerli bir kaynak birçok bilgi ile. Burada her konu için en iyi 10 algoritmayı ve veri yapısını bulacaksınız. SPOJ'dan gelen 250 problemden sonra bu listeden çok şey öğreneceksiniz. Ama aynı zamanda daha önce hiç duymadığınız birçok şeyle de karşılaşacaksınız. Bu yüzden bu konuları artan sırayla incelemeye başlayın.

Yeni bir şey öğrendikten sonra bilginizi güçlendirmezseniz her şeyi çabuk unutursunuz.
Yeni bir algoritma öğrendikten sonra onu pratikte kullanmanızı öneririm. 2-3 görev üzerinde çalışın. SPOJ'da algoritma etiketini arayın. Orada çözülmesi gereken bu algoritmaya ihtiyaç duyan sorunları bulacaksınız. Öncelikle bu sorunları çözün.

Dinamik Programlamada Ustalaşın Çünkü Sizi Zafere Götürecek
Tecrübelerime göre her yarışmada en az bir sorun vardır dinamik program. Pek çok kişi "dinamik programlama" ifadesini duyduğunda başı ağrıyor çünkü bunu hiç anlamıyorlar.

Ve bu iyi. Çünkü dinamik programlamayı anlarsanız kazanırsınız.

Dinamik programlamayı seviyorum, en sevdiğim konudur. Dinamik programlamanın sırrı, yalnızca yerel olanları değil, küresel olarak en uygun seçimleri yapmaktır. Sorunu daha basit alt problemlere ayırmalısınız. Bu alt problemlerin her birini yalnızca bir kez çözün. Daha sonra çözülmüş alt problemleri birleştiren bir çözüm oluşturun. Açgözlü algoritma - dinamik programlamanın tam tersi. Her adımda yerel olarak en uygun seçimlerin yapılmasını gerektirir. Ve yerel olarak en uygun seçim, kötü bir küresel çözüme yol açabilir.

Yeni kavramlar öğrenirken göz atın TopCoder eğitimleri. Oldukça detaylı ve anlaşılırlar. Onlar sayesinde anlayabildim ikili indeksli ağaçlar.

Çok çalış

Yıllarca antrenman yapmadan Olimpiyatları kazanan sporcuları hiç duydunuz mu? Beni değil.

Bilgisayar Olimpiyatı hazırlıkları her yıl eylül ayında başlayıp nisan ayında sona eriyordu.

Bu 8 ay boyunca her gün 5 saat pratik yaptım.

Ve evet, bu 5 saatimi yalnızca algoritmik problemleri çözerek geçirdim. 8 hatta 10 saat antrenman yaptığım günleri hatırlıyorum. Neden? Çünkü hoşuma gitti. Her gün okuldan eve döndüğümde doğrudan yatak odasına gittim, bilgisayarın başına oturdum ve yeni bir problemi analiz etmeye başladım. Veya bu sorunu çözmek için bilmem gereken yeni bir algoritma öğreniyordum.

Kazanmak istiyorsanız siz de aynısını yapmalısınız. Bir sorun seçin ve ona bağlı kalın. Süpermarkete yürürken veya araba kullanırken bunu düşünün.

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Uyuduğunuzda beyninizin o gün toplanan bilgileri birleştirdiğini biliyor muydunuz? Kitapları bir kitap rafına alfabetik sırayla diziyor gibi görünüyor. Esasen beyniniz, karşılaştığınız çeşitli sorunları düşünür.

Bu ustaca kullanılabilir. Yatmadan önce zor bir problemi okuyun ve onu çözmek için ne yapmanız gerektiğini hatırlayın. Bu aşamada çözümün kendisini aramanıza gerek yok. Yatmak. Beyniniz bu sorunu işlemeye başlayacaktır. Uyandığınızda çözümü uykuda bulduğunuzu fark edeceksiniz.

Kendin dene. Sihir gibi.

Bir video blogu oluşturdum

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Bu kısa paragrafın spor programcılığıyla ilgisi yoktur. Yirmili yaşlarınızdaysanız ve dünyayı nasıl gördüğümü merak ediyorsanız, şuraya göz atmak isteyebilirsiniz: Youtube'daki video blogum. Dünyadan, yaşamdan ve bilgisayar biliminden bahsediyorum.

Akıllıca çalış

Bu başarının sırrı. Hedeflere ihtiyacınız var.

Biz insanız ve bu hoşumuza gidiyor ertelemek. Şu anda yapılması gerekenleri hep ertelemek isteriz. Netflix izlemek her zaman dinamik programlama sorunlarıyla uğraşmaktan daha keyiflidir. Bunu biliyorsun ve düzeltmen gerekiyor.

Erteleme nasıl yenilir

Kendinize hedefler belirleyin. Her zaman yeni bir şeyler öğrenebileceğiniz ilginç problemler bulacaksınız (yukarıda bahsettiğim kaynaklara göz atın). Ancak bu sorunların sadece okunması değil çözülmesi de gerekiyor.

İşte ertelemenin üstesinden nasıl geldiğimi anlatacağım. Kağıttan bir takvim başlattım ve her günü çözmek istediğim sorunlarla doldurdum. Soruları her zaman iki gün önceden doldururdum. Böylece ilerleyen günlerde zamanımı nasıl yöneteceğimi biliyordum.

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?

Bu yüzden her zaman motive oldum. Bazı sorunları çözmem ve takvimdeki sonraki günleri dolduracak yenilerini bulmam gerekiyordu. Çözülmüş sorunların üzerini çizmek harika bir duygu. Senin de hoşuna gittiğini biliyorum.

Kendi kağıt takviminizi alın. Telefonunuzda yarın unutacağınız başka bir yapılacaklar listesi oluşturmayın.

Etkili bir şekilde hata ayıklama nasıl yapılır

Profesyonel olmak ister misin? Cevabınız evet ise, o zaman "hatalarını zihninizde ayıklamanız" gerekir.
Bu şimdiye kadar bildiğim en etkili hata ayıklama tekniğidir çünkü hiçbir hata ayıklayıcı gerektirmez. Beyniniz aynı anda birden fazla kod dalını keşfeder ve size kod hakkında çok daha geniş bir genel bakış sunar. klasik hata ayıklayıcı.

Kendinizi satranç oynayan ve 3 hamle ilerisini düşünen bir büyükustaya benzetebilirsiniz.

Bu tekniği yalnızca ilk savunma hattım olarak kullanıyorum. Sonra gerçek bir hata ayıklayıcı kullanıyorum.

Kafanızda nasıl hata ayıklayacağınızı öğrenmek için pratik yapmanız gerekir. Bir sorunun çözümünü doğruladığınızda ve "yanlış yanıt" aldığınızda doğrudan hata ayıklayıcı düğmesine gitmeyin. Kodu tekrar okuyun ve şunu düşünün: “Bu satırda neler oluyor?”, “Buradaki “if” programı nasıl etkiler?”, “Döngüden çıktığımızda yineleyicinin değeri nedir?”

Bu şekilde kendi başınıza düşünürsünüz. Zamanla kod yazmayı ve anında hata ayıklamayı öğreneceksiniz.

Yazar Hakkında

Bilgisayar Olimpiyatlarında 3 altın madalyadan 4'ünü nasıl kazandım?
Andrei Margeloiu girişimciliğe, startuplara ve açık havaya ilgi duyan hevesli bir programcıdır. Onunla iletişime geçebilirsin Linkedin üzerinde.

Tercüme: Diana Sheremyeva

Kaynak: habr.com

Yorum ekle