Notka druga, w której dowiadujemy się dlaczego warto zajmować się programowaniem konkursowym

Jest wiele powodów dla których warto zainteresować się programowaniem konkursowym. Oto kilka z nich:

  1. Ułatwiona edukacja. Tytuł finalisty Olimpiady Informatycznej daje wolny wstęp na wiele polskich uczelni. Podobnie tytuł finalisty Olimpiady Informatycznej Juniorów daje wolny wstęp do szkół ponadpodstawowych. Do tego gwarantowana ocena celująca z informatyki i zwolnienie z matury z informatyki (nawet jeśli szkoła takowej nie organizuje) brzmi jak zbędny dodatek. Osobiście nigdy nie udało mi się uzyskać tytułu finalisty, ale na podobnych konkursach udało mi się wywalczyć indeks Politechniki Poznańskiej i indeks Wyższej Szkoły Informatyki i Zarządzania w Rzeszowie… też fajnie…
  2. Propozycje pracy. W rankingach na najbardziej rozchwytywane zawody, programiści od kilkunastu lat zajmują czołowe miejsca. Dlatego firmy komputerowe chętnie sponsorują tego typu zawody lub nawet organizują własne. Potyczki Algorytmiczne w ostatnim roku sponsorował Huawei, IBM do niedawna był głównym sponsorem Akademickich Mistrzostw Świata w Programowaniu Zespołowym, Facebook organizuje Facebook Hacker Cup a Google ma swoje Google Code Jam. Microsoft nie dość że sponsoruje Top Codera, to jeszcze organizuje własny Imagine Cup. Oczywiście z punktu widzenia tych firm, to nie jest działalność charytatywna. W zamian wśród uczestników szukają swoich przyszłych pracowników. Nie dość że do uczestników konkursów pracodawcy sami się zgłaszają, to mają oni jeszcze jedną przewagę na rynku pracy. Często bowiem firmy korzystają z zadań algorytmicznych w procesie rekrutacji. Zawody są świetnym miejscem aby te umiejętności przećwiczyć.
  3. Nagrody rzeczowe. Firmy informatyczne radzą sobie finansowo… powiedzmy, że nie najgorzej. I bardzo lubią sypnąć groszem na zawodach. Oprócz tego, że najlepsi zawodnicy mogą liczyć na nagrody rzeczowe głównie w postaci książek i sprzętu elektronicznego (choć zdarzają się też nagrody finansowe; jeśli jesteś najlepszy to właściwie byłbyś w stanie się utrzymywać z konkursów) to reszta zawodników może liczyć na drobne upominki, głównie w postaci koszulek konkursowych. Organizatorzy konkursów międzynarodowych często również zapewniają nocleg i zwracają koszty podróży. Dzięki konkursom miałem okazję odbyć swoją jedyną podróż do Stanów Zjednoczonych. Orlando na Florydzie słynie ze swoich parków rozrywki. Są one bardzo popularne i czas oczekiwania w kolejce na poszczególne atrakcje potrafi trwać kilkadziesiąt minut. IBM który sponsorował konkurs załatwił nam wejście poza godzinami otwarcia, dzięki czemu mieliśmy park tylko dla siebie i mogliśmy korzystać z atrakcji bez konieczności stania w kolejkach.
  4. Programowanie konkursowe to świetne wyzwanie intelektualne. Daje dużo radości i satysfakcji.

Jest pełno konkursów w których można startować i nie sposób wymienić ich wszystkich. Do najważniejszych należą:

  • Olimpiada Informatyczna Juniorów
  • Olimpiada Informatyczna
  • Międzynarodowa Olimpiada Informatyczna
  • Akademickie Mistrzostwa Polski w Programowaniu Zespołowym
  • Akademickie Mistrzostwa Świata w Programowaniu Zespołowym
  • Potyczki Algorytmiczne
  • Wielka Przesmycka
  • Mistrzostwa Wielkopolski w Programowaniu Zespołowym

Formuły tych zawodów różnią się od siebie, ale można z nich wyciągnąć pewne cechy wspólne. W każdym z konkursów mamy do rozwiązania zadania programistyczne. Przykładowe zadanie rozwiązaliśmy w poprzedniej notce. Na Olimpiadach zadań jest niewiele, za to są trudniejsze. W zawodach zespołowych zadań jest zwykle koło ośmiu, za to są one łatwiejsze. Każde rozwiązanie jest później oceniane. Ocena zadań różni się w zależności od konkursu. W zawodach zespołowych ocenia się je binarnie. Rozwiązanie jest albo dobre albo złe. W zawodach typu olimpiada bądź potyczki algorytmiczne, rozwiązania poprawne, ale gorsze jakościowo otrzymują pewną część punktów. Konkursy również różnią się tym kiedy dowiadujemy się o ocenie naszych rozwiązań. Na zawodach zespołowych w każdej chwili możemy wysłać nasze rozwiązanie i sprawdzane jest ono niemal natychmiast, a gdy wynik będzie pozytywny, organizatorzy przynoszą balonik i przywiązują nam do krzesełka. Na wyniki z olimpiady i potyczek na rezultaty musimy poczekać do końca rundy.

Zadania sprawdzane są automatycznie (oprócz jednych zawodów… ale je organizowała politechnika). Przed zawodami organizatorzy przygotowują serię testów. Test składa się z danych wejściowych oraz poprawnych danych wyjściowych. Następnie nasze rozwiązanie jest uruchamiane z tymi danymi wejściowymi i sprawdzane jest czy wyprodukują one takie same dane wyjściowe. Ponadto sprawdzane jest czy nasz program zmieścił się w limicie czasowym i limicie pamięciowym. Oczywiście nasz program musi się skompilować poprawnie i wykonać. Jeśli wszystkie te warunki zostały spełnione to dany test jest zaliczany. Jeśli zaliczymy wszystkie testy, to powinniśmy się spodziewać maksymalnej liczby punktów.

Ponieważ na zawodach zespołowych mamy jedynie około 8 zadań, a zadania oceniane są binarne, łatwo zauważyć że wiele zespołów uzyska taki sam wynik. Dlatego remisy są rozstrzygane w dość specyficzny sposób. Mierzony jest czas (w minutach) od początku zawodów do momentu w którym rozwiązaliśmy każde zadanie. Następnie te czasy są sumowane ze sobą. Dodatkowo za każde złe zgłoszenie, które wysłaliśmy do zadania, które w końcu udało nam się rozwiązać, otrzymujemy minuty karne (zwykle 20). Wtedy gdy dwie drużyny rozwiązały tę samą ilość zadań, decyduje sumaryczny czas wraz z minutami karnymi. Można zauważyć, że opłaca się zaczynać od zadań łatwych. Ponieważ ranking zawodów zwykle jest dostępny dla zawodników w trakcie trwania zawodów, dobrą strategią jest podpatrzenie, które zadania zostały już rozwiązane, aby w ten sposób móc zidentyfikować najłatwiejsze.

Jak widzieliśmy w poprzedniej notce, rozwiązywanie zadania konkursowego można podzielić na dwa etapy. W pierwszym z nich rozwiązujemy zadanie, a w drugim z nich zapisujemy je w wybranym języku programowania. Zatem w tej szkółce będziemy musieli wyszkolić dwa rodzaje umiejętności. Pierwsza z nich to umiejętność algorytmiczna. Poznamy dużo algorytmów i struktur danych przydatnych w rozwiązywaniu zadań. Przyjrzymy się pewnym dziedzinom matematyki i poznamy różnego rodzaju sztuczki i triki. Druga to umiejętność programistyczna. Nauczymy się podstaw programowania i poznamy różnego rodzaju triki, które przyśpieszą nasz program.

Ze względu na specyfikę konkursów, w których należy jak najszybciej rozwiązać i zaprogramować rozwiązanie, będziemy wybierać odpowiednie tematy z dziedziny programowania i algorytmiki (i matematyki). Niestety spowoduje to, że nie nauczymy się porządnie ani algorytmiki ani programowania. Z algorytmów i struktur danych interesować nas będą takie, które można łatwo i szybko zaimplementować, podczas gdy w podręcznikach do tego przedmiotu królują takie, których poprawność można łatwo udowodnić. W programowaniu pominiemy sporo rzeczy związanych z programowaniem obiektowym, inżynierią oprogramowania czy czytelnością kodu. Czyli tymi wszystkimi rzeczami, które są bardzo istotne w pracy programisty. Z tego powodu konkursy programistyczne są często krytykowane, głównie przez osoby, które nigdy w nich nie startowały. Myślę, że te osoby nie rozumieją, że to są rzeczy które łatwo się nauczyć w przeciwieństwie na przykład do umiejętności rozwiązywania problemów, które nabędziemy podczas tej szkółki.

Na koniec kilka książek, do których być może warto zajrzeć jeśli interesuje nas programowanie konkursowe:

  1. Przygody Bajtazara. 25 lat Olimpiady Informatycznej. K. Diks, T. Idziaszek, J. Łącki, J. Radoszewski, PWN 2018.
  2. W poszukiwaniu wyzwań. Wybór zadań z konkursów programistycznych Uniwersytetu Warszawskiego. K. Diks, T. Idziaszek, J. Łącki, J. Radoszewski, Warszawa 2015.
  3. W poszukiwaniu wyzwań 2. Zadania z Akademickich Mistrzostw Polski w Programowaniu Zespołowym 2011-2014. K. Diks, T. Idziaszek, J. Łącki, J. Radoszewski, Warszawa 2015.
  4. Wprowadzenie do algorytmów. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. PWN 2013.
  5. Symfonia C++ Standard. Jerzy Grębosz, Edition 2000.
Back To Top