
Code Jam, Google tarafından düzenlenen temel olarak programlama, matematik ve algoritma oluşturma becerilerinizi test etmeyi amaçlayan dünya genelinde internet üzerinde başlayarak final aşamasına ulaşanları Google şirketinin dünya üzerindeki bir ofisinde final aşamasının gerçekleştirildiği para ödüllü bir yarışmadır.
Google Code Jam ile ilgili 3 ayrı makale yayınlamayı düşünüyorum:
1- Google Code Jam nedir?
2- Google Code Jam soruları nasıl çözülür?
3- LazyJam tanıtımı (LazyJam benim python üzerinde yazdığım ufak bir arayüz. Temel amacı geçmişe dönük soruları daha organize ve az zaman kaybederek çözmek)
Tekrardan konumuza dönelim. Google Code Jam sizin algoritma, matematik ve programlama yeteniklerinizi dünyadaki diğer yazılımcılarla karşılaştırmanızı sağlayacak her problem çözdüğünüzde vay be ne kadan da zekiyim diyeceğiniz bir yarışma. Tabi en önemli nokta burada İngilizce biliyor olmanız beklenmekte. Yani sorular ingilizce olduğu için soruları anlamanız beklenmekte. Yarışma güzel güzel ama inçilizçe anlamıyoz ki diyebilirsiniz tabi burda tekrardan yazılım alanında bu dilin önemini anlamış oluyoruz. Tabi ben çeviri kullanırım diyorsanız karşılaşacağınız problemleri söyleyeyim. Zaten sorular Türkçe olsaydı bile sorunun ne demek istediğini püf noktalarını anlamanız aslında sorunun en çok zaman alan kısmı tabi çeviriyle uğraşmanız demek çok fazla zaman kaybedeceğiniz anlamında. Çünkü unutmayın yarışmada zaman kısıtlaması mevcut.
Yarışma İşleyişi
Yarışma aşamalardan oluşuyor ve her aşamada yarışmacılara genelde 3 veya 4 adet soru veriliyor. Bu soruları verilen süre içersinde çözüp sisteme yüklemelisiniz. Bu soruların çözümlerini test etmeniz için size örnek giriş(input) ve çıkış(output) değerleri veriliyor. Yani siz programınıza verilen giriş değerlerini verdiğinizde istenilen çıkışları almanız gerekiyor. Örnek giriş ve çıkış değerleri sadece test amaçlı siz problemi çözdükten sonra iki kısım mevcut small(küçük) ve large(büyük). Her soru kendi içinde ikiye ayrılıyor küçük ve büyük değerler. Small kısmına tıkladığınızda size small input değerleri içeren bir dosya veriyor bunu programınıza verip çıkış değerlerini elde ettikten sonra sisteme yüklüyorsunuz. Sistem doğruluğunu kontrol ederek size sonucu veriyor. Large içinde aynı örnek geçerli burda amaç yazdığınız algoritmanın çok büyük değerlerde işe yarayıp yaramayacağını görmek. Çünkü siz giriş değerlerinin olduğu dosyayı indirdiğinizde size belli bir süre veriliyor küçük değerler için 4 dakika, büyük değerler ise 8 dakika. O süre zarfında sonuç dosyanızı yüklemeniz lazım. Bu yüzden algoritmanızın hızlı çalışarak sonuç dosyasını oluşturması gerekli. Yani algoritmanızdaki time and space compexity(zaman ve alan karmaşıklığı) denilen kavramlara önem vermelisiniz. Hızlı çalışmalı ve hafızayı çok kullanmamalı.
Örnek Soru Sayfası (Google Code Jam 2016 – Qualification Round 2016 – Problem A):
Yarışma Aşamaları
Qualifation Round -> [Round 1A, Round 1B, Round 1C] -> Round 2 -> Round 3 -> Finals
1-Qualifation Round: Yarışmanın başvurdan sonraki ilk aşamasıdır ve 27 saat sürer. Verilen soruların yarışmacılar tarafından bu süre içersinde yüklenmesi beklenir. Eğer yeterince puan kazanırsanız bir sonraki aşamaya geçebilirsiniz. Katılımcıların yaklaşık olarak 20 bin ile 60 bin arası bir sonraki aşamaya geçmeye hak kazanıyor.
2-Round 1: Bu aşama Round 1A, Round 1B ve Round 1C olmak üzere 3 alt aşamadan oluşuyor. Her bir alt aşama 1 hafta arayla yayınlanıyor. 2.5 saat içersinde verilen soruları çözmeniz bekleniyor. Her bir alt aşamada ilk 1000 e giren kişiler bir sonraki aşamaya geçmeye hak kazanıyor. Yani toplamda 3 alt aşamadan toplamda 3000 kişi bir sonraki aşamaya geçiyor. Bildiğim kadarıyla 3 alt aşamayada katılabilirsiniz eğer Qualifation Round’u geçtiyseniz. Birinde ilk 1000 e girmeniz yeterli olacaktır tabi önceki alt aşamalarda ilk 1000’e girenler tekrar bu listeye girerse ilk 1000’den bu sayı kadar ileri gidilir.
3-Round 2: Bu aşamada yarışmacılar 2.5 saat içersinde verilen soruları çözmeye çalışır ilk 500 kişi bir sonraki aşamaya katılmaya hak kazanır.
4-Round 3: Dananın kuyruğunun koptuğu andır. Yarışmacılar bu aşamada yine 2.5 saat içersinde verilen soruları çözmeye çalışır ve ilk 25 kişi Google ofisinde düzenlenecek olan final aşamasına katılmaya hak kazanırlar. 2017 finali Dublin/İrlanda’da yapılacak.
5-Final Round: Google bu aşamada yarışmacılara bilgisayarları kendi temin eder. Kazananlar bu aşamada belli olur. Oldu ki bu aşamaya kadar gelemediniz yani bi aksilik oldu klavyeniz bozuk, hakem zaten yanlı ve dış mihraklarda yarışmayı kazanmamızı istemiyor üzülmeyin youtube üzerinden bu aşama canlı izleyebilirsiniz. Geçen sene bende internet üzerinden izlemekle yetinmiştim 😀
Hangi programlama dilini kullanabilirim?
Bu aşamada bir programlama dili kısıltlaması getirilmemiş. Yani istediğiniz her programlama dilini kullanabilirsiniz. Önemli olan zaten problem girişlerini alıp doğru çıkışları elde etmek. Fakat hile yapmamanız adına kaynak kodları sisteme yükleminiz gerekiyor. İstatistikleri incelediğimde 2016 yılında en çok yarışmacılar C++ kullanmış ve bunu Python, Java ve C takip etmiş. En gözüme çarpan istatistik C++ kullananların %2 si Round 3 e geçebilmiş. Diğer popüler olan dillerde bu oran %0.3 civarında. Yani C++ hem çok kullanılmış hemde başarıda çok elde edilmiş. Yani iyi programcılar C++ kullanıyor gibi bir izlenim edindim. Tabi bunu sadece bir yarışmadan çıkarmak ne kadar doğru tartışılır. Aşağıda programla dilini kullananların hangi aşamaya kaç kişi geçebildiğini gösteriyor. Veriler Google Code Jam 2016 yarışmasından alınmıştır.
Programlama Dili | Qualification Round | Round 1A | Round 1B | Round 1C | Round 2 | Round 3 |
---|---|---|---|---|---|---|
C++ | 12074 | 4693 | 3877 | 3089 | 1747 | 317 |
Python | 6414 | 2172 | 1771 | 1224 | 290 | 23 |
Java | 6154 | 2147 | 1417 | 1006 | 223 | 28 |
C | 1168 | 260 | 151 | 130 | 12 | 2 |
C# | 1005 | 321 | 287 | 213 | 40 | 4 |
Ruby | 431 | 144 | 105 | 69 | 16 | 0 |
JavaScript | 317 | 93 | 60 | 41 | 5 | 0 |
Haskell | 194 | 71 | 48 | 33 | 19 | 3 |
PHP | 190 | 47 | 43 | 38 | 1 | 0 |
Nasıl Başvurabilirim?
Google Code Jam yarışmasını “https://code.google.com/codejam” adresinden takip edebilirsiniz. Henüz başvurular açık değil 7 Mart 2017 tarihinde başrular internet üzerinden başlayacak. Az önce verdiğim link içerinde gmail hesabınızla başruyu kolayca gerçekleştirebiliyorsunuz. gerçekleştirebiliyorsunuz.
İyide hacı paradan haber ver bize
Birinci olursanız ödülünüz 15.000$. Ayrıca bildiğim kadarıyla eğer Finale kalırsanız masraflarınız finalin gerçekleşeceğe yere gidişiniz ve oradaki masraflar Google tarafından karşılanıyor.
Hangi konularda çalışmam yarışma için yararlı olur?
İngilizce: Öncellikle İngilizce seviyenizi soruları anlayabilecek düzeyde olması gerekir. Eğer değilse İngilizce ile çalışmalara başlayabilirsiniz.
Matematik: Sorular genellikle matematik bilgileri içeriyor. Ve soruları genelde formülüze ederek hızlı çözebiliyorsunuz. Bu yüzden olasılık,matris,determinat,logaritma kullanım alanları gibi konuları ağırlıklı olmak üzere temel matematik bilgilerinizi geliştirmeniz yararınıza olacaktır.
Programlama Dili: Bir programlama dili seçerek kendinizi o programala dilinde hızlı kod yazabilir hale getirmeniz zaman konusunda size yardımcı olacaktır.
Algoritmalar: En önemli kısımlardan biri algoritmalar. Ne kadar çok algoritmaya aşinaysanız soruları o kadar kolay anlayabilirsiniz. Çünkü genelde sorular belli algoritmaları üstü kapalı olarak içeriyor. Bu yüzden : Sıralama algoritmaları (Insertion, radix, quick, merge, heap sort gibi), A star veya başka gezgin satıcı (travelling salesman) probleminde kullanılan algoritmalar, manipulation algoritmaları, Dijkstra algoritması gibi algoritmalara hakim olmanız yararlı olacaktır. Ayrıca zaman ve alan karmaşıklığı (time and space complexity) nı algoritmalarınızı yazarken göz önünde bulundur. Her zaman algoritmanızın nasıl daha hızlı ve daha az alan kaplayarak çalışabileceğinizi düşünün. Böylece büyük (large) girişli soru kısımlarında problem yaşamazsınız. Özyineli fonksyionlarda (recursive functions) bazı algoritmaları oluştururken bilmeniz gerekir.
Veri yapıları: Problemlerinizi çözerken ve algoritmalarınızda belli veri yapılarına ihtiyacınız olacak. Kesinlikle bu veri yapılarının işleyişlerini önce anlamanız ve sonrada kullandığınız programlama dilinde örnekler yapmanız gerekiyor. Çünkü her programlama dilinde yazış biçimleri değişebiliyor. Bunlar arrays(diziler), ağaçlar(trees), stacks(yığınlar), linked lists(bağlı listeler). hash tables.
Alıştırma yapmak: Eskiye dönük yarışmaların problemlerini normal yarışmadaymış gibi çözebilirsiniz. Eski yarışma soruları için “code.google.com/codejam/contests.html” bu adreten ulaşabilirsiniz. Örnek soru çözümlerini bir sonraki makalede bahsedeceğim. Sonraki makalede ise LazyJam tanıtımını yapacağım.
Bazı İstatistikler
Google Code Jam’ in ülkemizde yeterince reklamı ya yapılmıyor yada yapılsa bile yeterince ilgileni yok gibi. Yarışma 2003’te başlasada internet üzerinden 2008 de daha organize bir hale geldi. Benim yarışmayla tanışmam geçen sene oldu. Buda yarışmanın Türkiye’deki reklamının iyi yapılmadığı anlamına gelebilir. Tabi genellemeyi sadece benim üzerimden yapmak saçma olur. Fakat Türkiye’den 2016 yarışmasına katılan sadece 174 kişi var. Bu 174 kişiden sadece bir kişi Round 3 e kalmış ancak Finale ulaşabilen olmamış. 174 kişi çok az bir rakam olsa gerek çünkü düşününce sadece benim bulunduğum benim bulunduğum Dumlupınar Üniversitesi Bilgisayar Mühendisliği bölümünün normal öğretiminin bir sınıfında yaklaşık 60 öğrenci vardı. Yani Türkiye genelinde yazılımla ilgili bölüm okuyan kişi sayısı çok fazla ama yarışmaya katılan kişi sayısı az. Bu sayının artması adına bu makaleyi yayınlamaya karar verdim. İlginç bir şekilde slav ülkelerinin yarışmadan büyük üstünlüğü var. Beyaz Rusya’nın listede 1. olmasının asıl nedeni Gennady Korotkevich adındaki Belaruslu genç. Çocuk son 3 yıldır 1.liği kimeseye kaptırmıyor. Artık yeter katılma diyesi geliyor insanın. Gerçekten çok yetenekli ve zeki biri. Kendisi programla dili olarak C++ kullanıyor ve programlama editörü olarak ise Farmanager adında bir program kullanıyor. Yarışma videolarını izlerseniz Farmanager’ı nasıl kullandığını görebilirsiniz.
Ülke | 1. Sıra | 2. Sıra | 3. Sıra |
---|---|---|---|
Beyaz Rusya | 4 | 1 | 0 |
Çin | 2 | 3 | 1 |
Rusya | 2 | 1 | 6 |
Polonya | 2 | 0 | 1 |
Japonya | 1 | 1 | 1 |
Arjantin | 1 | 0 | 0 |
Sweden | 1 | 0 | 0 |
Amerika | 0 | 2 | 1 |
Hollanda | 0 | 2 | 0 |
Kanada | 0 | 1 | 0 |
Ukranya | 0 | 1 | 0 |
Filipinler | 0 | 1 | 0 |
Güney Afrika | 0 | 0 | 2 |
Slovakya | 0 | 0 | 1 |
Google Code Jam 2017 Takvim
Tarih | Zaman | Süre | Açıklama |
Salı, 7 Mart 2017 | 19:00 UTC | 32 gün 7 saat | Kayıt Başlangıç |
Pazar, 9 Nisan, 2017 | 02:00 UTC | – | Kayıt Bitiş |
Cumartesi, 7 Nisan, 2017 | 23:00 UTC | 27 saat | Qualification Round |
Pazar, 15 Nisan, 2017 | 01:00 UTC | 2 saat 30 dakika | Online Round 1: Sub-Round A |
Pazar, 22 Nisan, 2017 | 16:00 UTC | 2 saat 30 dakika | Online Round 1: Sub-Round B |
Pazar, 30 Nisan, 2017 | 09:00 UTC | 2 saat 30 dakika | Online Round 1: Sub-Round C |
Cumartesi, 13 Mayıs, 2017 | 14:00 UTC | 2 saat 30 dakika | Online Round 2 |
Cumartesi, 10 Haziran, 2017 | 14:00 UTC | 2 saat 30 dakika | Online Round 3 |
Cuma, 11 Ağustos, 2017 | 14:00 UTC | 4 saat | Onsite Finals |
Not: Saatlerin zaman dilimi farklıdır! Saatlerin üzerine tıklayarak Türkiye saatiyle hangi saat olduğunu kontrol edebilirsiniz. |
Not: Verdiğim bilgiler kendi inceleme ve deneyimlerimden oluşmaktadır. Çok daha kesin ve detaylı kurallar için yarışmanın kendi “code.google.com/codejam/terms.html” kurallar ve tanımlamalar kısmına bakınız.
Bu makaleyi okuduysanız artık yarışmadan haberiniz var. Soruları çözebilecek kadar zeki ve çalışkansın bu sene kesinlikle çalışarak şansını denemelisin 🙂